/ Hex Artifact Content
Login

Artifact 5733d54dccf7aec324a602ac219d436753fea4b5:


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 28 69 36 34 29 70 57 43 2d 3e  a[0])*(i64)pWC->
1a60: 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69  nSlot*2 );.    i
1a70: 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a  f( pWC->a==0 ){.
1a80: 20 20 20 20 20 20 69 66 28 20 77 74 46 6c 61 67        if( wtFlag
1a90: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
1aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ab0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1ac0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , p);.      }.  
1ad0: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c      pWC->a = pOl
1ae0: 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  d;.      return 
1af0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  0;.    }.    mem
1b00: 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64  cpy(pWC->a, pOld
1b10: 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  , sizeof(pWC->a[
1b20: 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b  0])*pWC->nTerm);
1b30: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70  .    if( pOld!=p
1b40: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
1b50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1b60: 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20  ee(db, pOld);.  
1b70: 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c    }.    pWC->nSl
1b80: 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
1b90: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43  llocSize(db, pWC
1ba0: 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d  ->a)/sizeof(pWC-
1bb0: 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54  >a[0]);.  }.  pT
1bc0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
1bd0: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b  x = pWC->nTerm++
1be0: 5d 3b 0a 20 20 69 66 28 20 70 20 26 26 20 45 78  ];.  if( p && Ex
1bf0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
1c00: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
1c10: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74  .    pTerm->trut
1c20: 68 50 72 6f 62 20 3d 20 73 71 6c 69 74 65 33 4c  hProb = sqlite3L
1c30: 6f 67 45 73 74 28 70 2d 3e 69 54 61 62 6c 65 29  ogEst(p->iTable)
1c40: 20 2d 20 39 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a   - 99;.  }else{.
1c50: 20 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74 68      pTerm->truth
1c60: 50 72 6f 62 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Prob = 1;.  }.  
1c70: 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73  pTerm->pExpr = s
1c80: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c90: 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70 54 65 72  llate(p);.  pTer
1ca0: 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46  m->wtFlags = wtF
1cb0: 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  lags;.  pTerm->p
1cc0: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72  WC = pWC;.  pTer
1cd0: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
1ce0: 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d  .  return idx;.}
1cf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1d00: 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20  tine identifies 
1d10: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69  subexpressions i
1d20: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
1d30: 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68  se where.** each
1d40: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
1d50: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74  s separated by t
1d60: 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
1d70: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
1d80: 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66   operator specif
1d90: 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61  ied in the op pa
1da0: 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68  rameter.  The Wh
1db0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
1dc0: 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64  ure.** is filled
1dd0: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
1de0: 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  o subexpressions
1df0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
1e00: 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20  **.**    WHERE  
1e10: 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63  a=='hello' AND c
1e20: 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30  oalesce(b,11)<10
1e30: 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52   AND (c+12!=d OR
1e40: 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20   c==22).**      
1e50: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20       \________/ 
1e60: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
1e70: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
1e80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
1e90: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
1ea0: 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c  0]            sl
1eb0: 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20  ot[1]           
1ec0: 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a      slot[2].**.*
1ed0: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  * The original W
1ee0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70  HERE clause in p
1ef0: 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65  Expr is unaltere
1f00: 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  d.  All this rou
1f10: 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20  tine.** does is 
1f20: 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72  make slot[] entr
1f30: 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62  ies point to sub
1f40: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e  structure within
1f50: 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e   pExpr..**.** In
1f60: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
1f70: 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68  ntence and in th
1f80: 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74  e diagram, "slot
1f90: 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a  []" refers to.**
1fa0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
1fb0: 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65  .a[] array.  The
1fc0: 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72   slot[] array gr
1fd0: 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f  ows as needed to
1fe0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20   contain.** all 
1ff0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2000: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  RE clause..*/.st
2010: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53  atic void whereS
2020: 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65  plit(WhereClause
2030: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78   *pWC, Expr *pEx
2040: 70 72 2c 20 75 38 20 6f 70 29 7b 0a 20 20 70 57  pr, u8 op){.  pW
2050: 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66  C->op = op;.  if
2060: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
2070: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
2080: 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20  ->op!=op ){.    
2090: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
20a0: 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29  t(pWC, pExpr, 0)
20b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
20c0: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
20d0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29  Expr->pLeft, op)
20e0: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
20f0: 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69  (pWC, pExpr->pRi
2100: 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a  ght, op);.  }.}.
2110: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2120: 65 20 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74  e a WhereMaskSet
2130: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69   object.*/.#defi
2140: 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50  ne initMaskSet(P
2150: 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a  )  (P)->n=0../*.
2160: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
2170: 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69  tmask for the gi
2180: 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ven cursor numbe
2190: 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a  r.  Return 0 if.
21a0: 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f  ** iCursor is no
21b0: 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f  t in the set..*/
21c0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
21d0: 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  getMask(WhereMas
21e0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
21f0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2200: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
2210: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69   pMaskSet->n<=(i
2220: 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  nt)sizeof(Bitmas
2230: 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d  k)*8 );.  for(i=
2240: 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e  0; i<pMaskSet->n
2250: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2260: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d  pMaskSet->ix[i]=
2270: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
2280: 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49 54    return MASKBIT
2290: 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (i);.    }.  }. 
22a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22b0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
22c0: 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72   mask for cursor
22d0: 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20   iCursor..**.** 
22e0: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72  There is one cur
22f0: 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e  sor per table in
2300: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2310: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2320: 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68  .** tables in th
2330: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2340: 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74 65   limited by a te
2350: 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a  st early in the.
2360: 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
2370: 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20  egin() routine. 
2380: 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   So we know that
2390: 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69   the pMaskSet->i
23a0: 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c  x[].** array wil
23b0: 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77  l never overflow
23c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23d0: 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72   createMask(Wher
23e0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
23f0: 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29  et, int iCursor)
2400: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  {.  assert( pMas
2410: 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53  kSet->n < ArrayS
2420: 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ize(pMaskSet->ix
2430: 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d  ) );.  pMaskSet-
2440: 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b  >ix[pMaskSet->n+
2450: 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a  +] = iCursor;.}.
2460: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
2470: 74 69 6e 65 73 20 77 61 6c 6b 20 28 72 65 63 75  tines walk (recu
2480: 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72  rsively) an expr
2490: 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20  ession tree and 
24a0: 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20 62 69  generate.** a bi
24b0: 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67  tmask indicating
24c0: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   which tables ar
24d0: 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65  e used in that e
24e0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65  xpression.** tre
24f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  e..*/.static Bit
2500: 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62  mask exprListTab
2510: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
2520: 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  kSet*, ExprList*
2530: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
2540: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2550: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2560: 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  Set*, Select*);.
2570: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2580: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57 68  xprTableUsage(Wh
2590: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
25a0: 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a  kSet, Expr *p){.
25b0: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
25c0: 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   0;.  if( p==0 )
25d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
25e0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
25f0: 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  N ){.    mask = 
2600: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
2610: 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  , p->iTable);.  
2620: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20    return mask;. 
2630: 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72   }.  mask = expr
2640: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2650: 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  Set, p->pRight);
2660: 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54  .  mask |= exprT
2670: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2680: 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  et, p->pLeft);. 
2690: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
26a0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
26b0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61 73  lect) ){.    mas
26c0: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
26d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
26e0: 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  et, p->x.pSelect
26f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2700: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
2710: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2720: 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  Set, p->x.pList)
2730: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
2740: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
2750: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
2760: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2770: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2780: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2790: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69  ){.  int i;.  Bi
27a0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
27b0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
27c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
27d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
27e0: 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20  {.      mask |= 
27f0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
2800: 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e  MaskSet, pList->
2810: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
2820: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2830: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
2840: 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63  itmask exprSelec
2850: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
2860: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
2870: 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29 7b  et, Select *pS){
2880: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
2890: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  = 0;.  while( pS
28a0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
28b0: 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70 53 72 63  *pSrc = pS->pSrc
28c0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
28d0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
28e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
28f0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b  EList);.    mask
2900: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2910: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2920: 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a   pS->pGroupBy);.
2930: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2940: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
2950: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72  MaskSet, pS->pOr
2960: 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  derBy);.    mask
2970: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
2980: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2990: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61  >pWhere);.    ma
29a0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
29b0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
29c0: 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  S->pHaving);.   
29d0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
29e0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  !=0) ){.      in
29f0: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
2a00: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
2a10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2a20: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
2a30: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
2a40: 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69  skSet, pSrc->a[i
2a50: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
2a60: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2a70: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2a80: 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  Set, pSrc->a[i].
2a90: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pOn);.      }.  
2aa0: 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70 53 2d    }.    pS = pS-
2ab0: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72  >pPrior;.  }.  r
2ac0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f  eturn mask;.}../
2ad0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2ae0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70   if the given op
2af0: 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66  erator is one of
2b00: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74   the operators t
2b10: 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65  hat is.** allowe
2b20: 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62  d for an indexab
2b30: 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
2b40: 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77  term.  The allow
2b50: 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  ed operators are
2b60: 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e  .** "=", "<", ">
2b70: 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22  ", "<=", ">=", "
2b80: 49 4e 22 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c  IN", and "IS NUL
2b90: 4c 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  L".*/.static int
2ba0: 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f   allowedOp(int o
2bb0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b  p){.  assert( TK
2bc0: 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _GT>TK_EQ && TK_
2bd0: 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  GT<TK_GE );.  as
2be0: 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45  sert( TK_LT>TK_E
2bf0: 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45  Q && TK_LT<TK_GE
2c00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
2c10: 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _LE>TK_EQ && TK_
2c20: 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  LE<TK_GE );.  as
2c30: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
2c40: 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e  EQ+4 );.  return
2c50: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f   op==TK_IN || (o
2c60: 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d  p>=TK_EQ && op<=
2c70: 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_GE) || op==TK
2c80: 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  _ISNULL;.}../*.*
2c90: 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63  * Swap two objec
2ca0: 74 73 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e  ts of type TYPE.
2cb0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .*/.#define SWAP
2cc0: 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45  (TYPE,A,B) {TYPE
2cd0: 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d   t=A; A=B; B=t;}
2ce0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20  ../*.** Commute 
2cf0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
2d00: 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69  rator.  Expressi
2d10: 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ons of the form 
2d20: 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20  "X op Y".** are 
2d30: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22  converted into "
2d40: 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49  Y op X"..**.** I
2d50: 66 20 6c 65 66 74 2f 72 69 67 68 74 20 70 72 65  f left/right pre
2d60: 63 65 64 65 6e 63 65 20 72 75 6c 65 73 20 63 6f  cedence rules co
2d70: 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 77 68 65  me into play whe
2d80: 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68  n determining th
2d90: 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73  e.** collating s
2da0: 65 71 75 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f  equence, then CO
2db0: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
2dc0: 61 72 65 20 61 64 6a 75 73 74 65 64 20 74 6f 20  are adjusted to 
2dd0: 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 74  ensure.** that t
2de0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
2df0: 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 63  uence does not c
2e00: 68 61 6e 67 65 2e 20 20 46 6f 72 20 65 78 61 6d  hange.  For exam
2e10: 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61  ple:.** "Y colla
2e20: 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20  te NOCASE op X" 
2e30: 62 65 63 6f 6d 65 73 20 22 58 20 6f 70 20 59 22  becomes "X op Y"
2e40: 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c   because any col
2e50: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
2e60: 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68  on.** the left h
2e70: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f  and side of a co
2e80: 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64  mparison overrid
2e90: 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  es any collation
2ea0: 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74   sequence .** at
2eb0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72 69  tached to the ri
2ec0: 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d  ght. For the sam
2ed0: 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f  e reason the EP_
2ee0: 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20  Collate flag.** 
2ef0: 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e  is not commuted.
2f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f10: 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73  exprCommute(Pars
2f20: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2f30: 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65  *pExpr){.  u16 e
2f40: 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70 72  xpRight = (pExpr
2f50: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
2f60: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20  & EP_Collate);. 
2f70: 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28   u16 expLeft = (
2f80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
2f90: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
2fa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  );.  assert( all
2fb0: 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70  owedOp(pExpr->op
2fc0: 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ) && pExpr->op!=
2fd0: 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20 65  TK_IN );.  if( e
2fe0: 78 70 52 69 67 68 74 3d 3d 65 78 70 4c 65 66 74  xpRight==expLeft
2ff0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
3000: 72 20 58 20 61 6e 64 20 59 20 62 6f 74 68 20 68  r X and Y both h
3010: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
3020: 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 65 72 20  ator or neither 
3030: 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 78  do */.    if( ex
3040: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
3050: 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 20 59 20  /* Both X and Y 
3060: 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65  have COLLATE ope
3070: 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75  rators.  Make su
3080: 72 65 20 58 20 69 73 20 61 6c 77 61 79 73 0a 20  re X is always. 
3090: 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20       ** used by 
30a0: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 45 50 5f  clearing the EP_
30b0: 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66 72 6f  Collate flag fro
30c0: 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45  m Y. */.      pE
30d0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
30e0: 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74  gs &= ~EP_Collat
30f0: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  e;.    }else if(
3100: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
3110: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
3120: 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
3130: 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72        /* Neither
3140: 20 58 20 6e 6f 72 20 59 20 68 61 76 65 20 43 4f   X nor Y have CO
3150: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2c  LLATE operators,
3160: 20 62 75 74 20 58 20 68 61 73 20 61 20 6e 6f 6e   but X has a non
3170: 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 20 20 2a  -default.      *
3180: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
3190: 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 20 74 68  ence.  So add th
31a0: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72  e EP_Collate mar
31b0: 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 61 75 73  ker on X to caus
31c0: 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f  e.      ** it to
31d0: 20 62 65 20 73 65 61 72 63 68 65 64 20 66 69 72   be searched fir
31e0: 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78  st. */.      pEx
31f0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
3200: 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a   |= EP_Collate;.
3210: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50      }.  }.  SWAP
3220: 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52  (Expr*,pExpr->pR
3230: 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66  ight,pExpr->pLef
3240: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
3250: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op>=TK_GT ){.  
3260: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
3270: 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20  =TK_GT+2 );.    
3280: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
3290: 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_LE+2 );.    as
32a0: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
32b0: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
32c0: 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a   TK_GT<TK_LE );.
32d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
32e0: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20  r->op>=TK_GT && 
32f0: 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45  pExpr->op<=TK_GE
3300: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
3310: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d  p = ((pExpr->op-
3320: 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b  TK_GT)^2)+TK_GT;
3330: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
3340: 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f  anslate from TK_
3350: 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57  xx operator to W
3360: 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f  O_xx bitmask..*/
3370: 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65 72  .static u16 oper
3380: 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29  atorMask(int op)
3390: 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73  {.  u16 c;.  ass
33a0: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f  ert( allowedOp(o
33b0: 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  p) );.  if( op==
33c0: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IN ){.    c =
33d0: 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20   WO_IN;.  }else 
33e0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
33f0: 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  L ){.    c = WO_
3400: 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  ISNULL;.  }else{
3410: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57 4f  .    assert( (WO
3420: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
3430: 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20 20   < 0x7fff );.   
3440: 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45 51   c = (u16)(WO_EQ
3450: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20  <<(op-TK_EQ));. 
3460: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21   }.  assert( op!
3470: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d  =TK_ISNULL || c=
3480: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =WO_ISNULL );.  
3490: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
34a0: 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b  N || c==WO_IN );
34b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
34c0: 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51  K_EQ || c==WO_EQ
34d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
34e0: 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LT || c==WO
34f0: 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LT );.  assert(
3500: 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d   op!=TK_LE || c=
3510: 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65  =WO_LE );.  asse
3520: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  rt( op!=TK_GT ||
3530: 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61   c==WO_GT );.  a
3540: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45  ssert( op!=TK_GE
3550: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a   || c==WO_GE );.
3560: 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
3570: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20  *.** Advance to 
3580: 74 68 65 20 6e 65 78 74 20 57 68 65 72 65 54 65  the next WhereTe
3590: 72 6d 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  rm that matches 
35a0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
35b0: 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74   criteria.** est
35c0: 61 62 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68  ablished when th
35d0: 65 20 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77  e pScan object w
35e0: 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  as initialized b
35f0: 79 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  y whereScanInit(
3600: 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  )..** Return NUL
3610: 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  L if there are n
3620: 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20  o more matching 
3630: 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73  WhereTerms..*/.s
3640: 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20  tatic WhereTerm 
3650: 2a 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57  *whereScanNext(W
3660: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29  hereScan *pScan)
3670: 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  {.  int iCur;   
3680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3690: 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48  cursor on the LH
36a0: 53 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f  S of the term */
36b0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20  .  int iColumn; 
36c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
36d0: 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53  olumn on the LHS
36e0: 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d   of the term.  -
36f0: 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45  1 for IPK */.  E
3700: 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
3710: 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
3720: 73 69 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65  sion being teste
3730: 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
3740: 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53  se *pWC;    /* S
3750: 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63  horthand for pSc
3760: 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65  an->pWC */.  Whe
3770: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
3780: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65    /* The term be
3790: 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ing tested */.  
37a0: 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b  int k = pScan->k
37b0: 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f  ;    /* Where to
37c0: 20 73 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20   start scanning 
37d0: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63  */..  while( pSc
37e0: 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61  an->iEquiv<=pSca
37f0: 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20  n->nEquiv ){.   
3800: 20 69 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61   iCur = pScan->a
3810: 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71  Equiv[pScan->iEq
3820: 75 69 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c  uiv-2];.    iCol
3830: 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71  umn = pScan->aEq
3840: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
3850: 76 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  v-1];.    while(
3860: 20 28 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70   (pWC = pScan->p
3870: 57 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  WC)!=0 ){.      
3880: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
3890: 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d  +k; k<pWC->nTerm
38a0: 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; k++, pTerm++){
38b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
38c0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
38d0: 69 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26  iCur.         &&
38e0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
38f0: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20  lumn==iColumn.  
3900: 20 20 20 20 20 20 20 26 26 20 28 70 53 63 61 6e         && (pScan
3910: 2d 3e 69 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21  ->iEquiv<=2 || !
3920: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
3930: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
3940: 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20  _FromJoin)).    
3950: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3960: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
3970: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49  erator & WO_EQUI
3980: 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  V)!=0.          
3990: 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69   && pScan->nEqui
39a0: 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61  v<ArraySize(pSca
39b0: 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20  n->aEquiv).     
39c0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
39d0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
39e0: 20 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69         pX = sqli
39f0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
3a00: 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  te(pTerm->pExpr-
3a10: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
3a20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
3a30: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
3a40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
3a50: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d  or(j=0; j<pScan-
3a60: 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a  >nEquiv; j+=2){.
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3a80: 28 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ( pScan->aEquiv[
3a90: 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20  j]==pX->iTable. 
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
3ab0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
3ac0: 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e  +1]==pX->iColumn
3ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3ae0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3af0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3b00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3b10: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53         if( j==pS
3b20: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
3b40: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20  an->aEquiv[j] = 
3b50: 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
3b60: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
3b70: 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70  >aEquiv[j+1] = p
3b80: 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  X->iColumn;.    
3b90: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
3ba0: 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20  >nEquiv += 2;.  
3bb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3bd0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
3be0: 70 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d  perator & pScan-
3bf0: 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20  >opMask)!=0 ){. 
3c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
3c10: 72 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74  rify the affinit
3c20: 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  y and collating 
3c30: 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a  sequence match *
3c40: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
3c50: 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  ( pScan->zCollNa
3c60: 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f  me && (pTerm->eO
3c70: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
3c80: 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
3c90: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
3ca0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
3cb0: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
3cc0: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e  arse = pWC->pWIn
3cd0: 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  fo->pParse;.    
3ce0: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70            pX = p
3cf0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
3d00: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
3d10: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
3d20: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e  nityOk(pX, pScan
3d30: 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20  ->idxaff) ){.   
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
3d50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
3d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3d70: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
3d80: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
3d90: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
3da0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
3db0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
3dc0: 2c 0a 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 20                  
3df0: 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70      pX->pLeft, p
3e00: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
3e10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
3e20: 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
3e30: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
3e40: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
3e50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3e60: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
3e70: 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43  zName, pScan->zC
3e80: 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ollName) ){.    
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
3ea0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
3eb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3ec0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3ed0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
3ee0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d  rator & WO_EQ)!=
3ef0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
3f00: 26 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  & (pX = pTerm->p
3f10: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f  Expr->pRight)->o
3f20: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
3f30: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
3f40: 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e  >iTable==pScan->
3f50: 61 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20  aEquiv[0].      
3f60: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43         && pX->iC
3f70: 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45  olumn==pScan->aE
3f80: 71 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20  quiv[1].        
3f90: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3fa0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
3fb0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3fc0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
3fd0: 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20  k = k+1;.       
3fe0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
3ff0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
4000: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4010: 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57  .      pScan->pW
4020: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e  C = pScan->pWC->
4030: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
4040: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
4050: 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61  Scan->pWC = pSca
4060: 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20  n->pOrigWC;.    
4070: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
4080: 2d 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20  ->iEquiv += 2;. 
4090: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
40a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
40b0: 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ze a WHERE claus
40c0: 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74  e scanner object
40d0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
40e0: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69  ter to the.** fi
40f0: 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75  rst match.  Retu
4100: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
4110: 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e   are no matches.
4120: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e  .**.** The scann
4130: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  er will be searc
4140: 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63  hing the WHERE c
4150: 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77  lause pWC.  It w
4160: 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20  ill look.** for 
4170: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
4180: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
4190: 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c  " where X is col
41a0: 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  umn iColumn of t
41b0: 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54  able.** iCur.  T
41c0: 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20  he <op> must be 
41d0: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
41e0: 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62  tors described b
41f0: 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  y opMask..**.** 
4200: 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73  If the search is
4210: 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57   for X and the W
4220: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
4230: 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68  ains terms of th
4240: 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68  e.** form X=Y th
4250: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
4260: 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72  might also retur
4270: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
4280: 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c  orm.** "Y <op> <
4290: 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d  expr>".  The num
42a0: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66  ber of levels of
42b0: 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73   transitivity is
42c0: 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74   limited,.** but
42d0: 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61   is enough to ha
42e0: 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  ndle most common
42f0: 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c  ly occurring SQL
4300: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
4310: 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74  ** If X is not t
4320: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
4330: 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75  RY KEY then X mu
4340: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
4350: 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70   with.** index p
4360: 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  Idx..*/.static W
4370: 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53  hereTerm *whereS
4380: 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65  canInit(.  Where
4390: 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20  Scan *pScan,    
43a0: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53     /* The WhereS
43b0: 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67  can object being
43c0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
43d0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
43e0: 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  WC,       /* The
43f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
4400: 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
4410: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
4420: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
4430: 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  or to scan for *
4440: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
4450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4460: 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f  olumn to scan fo
4470: 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73  r */.  u32 opMas
4480: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
4490: 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f  * Operator(s) to
44a0: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49   scan for */.  I
44b0: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
44c0: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
44d0: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
44e0: 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  h this index */.
44f0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f  ){.  int j;..  /
4500: 2a 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20  * memset(pScan, 
4510: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e  0, sizeof(*pScan
4520: 29 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e  )); */.  pScan->
4530: 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20  pOrigWC = pWC;. 
4540: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57   pScan->pWC = pW
4550: 43 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26  C;.  if( pIdx &&
4560: 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
4570: 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66     pScan->idxaff
4580: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
4590: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
45a0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72  ffinity;.    for
45b0: 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f  (j=0; pIdx->aiCo
45c0: 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e  lumn[j]!=iColumn
45d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
45e0: 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d  ( NEVER(j>=pIdx-
45f0: 3e 6e 4b 65 79 43 6f 6c 29 20 29 20 72 65 74 75  >nKeyCol) ) retu
4600: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
4610: 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65  pScan->zCollName
4620: 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
4630: 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  j];.  }else{.   
4640: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d   pScan->idxaff =
4650: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a   0;.    pScan->z
4660: 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  CollName = 0;.  
4670: 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73  }.  pScan->opMas
4680: 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53  k = opMask;.  pS
4690: 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53  can->k = 0;.  pS
46a0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d  can->aEquiv[0] =
46b0: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
46c0: 61 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c  aEquiv[1] = iCol
46d0: 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45  umn;.  pScan->nE
46e0: 71 75 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61  quiv = 2;.  pSca
46f0: 6e 2d 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20  n->iEquiv = 2;. 
4700: 20 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61   return whereSca
4710: 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a  nNext(pScan);.}.
4720: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
4730: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
4740: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
4750: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
4760: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
4770: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
4780: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
4790: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
47a0: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
47b0: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
47c0: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
47d0: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
47e0: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
47f0: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
4800: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4810: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
4820: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
4830: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65  *.** The term re
4840: 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20  turned might by 
4850: 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72  Y=<expr> if ther
4860: 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e  e is another con
4870: 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68  straint in.** th
4880: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
4890: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
48a0: 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63  at X=Y.  Any suc
48b0: 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  h constraints wi
48c0: 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66  ll be.** identif
48d0: 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51  ied by the WO_EQ
48e0: 55 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70  UIV bit in the p
48f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
4900: 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61  field.  The.** a
4910: 45 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f  Equiv[] array ho
4920: 6c 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74  lds X and all it
4930: 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77  s equivalents, w
4940: 69 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72  ith each SQL var
4950: 69 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20  iable.** taking 
4960: 75 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20  up two slots in 
4970: 61 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66  aEquiv[].  The f
4980: 69 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72  irst slot is for
4990: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
49a0: 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  er.** and the se
49b0: 63 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20  cond is for the 
49c0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20  column number.  
49d0: 54 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f  There are 22 slo
49e0: 74 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a  ts in aEquiv[].*
49f0: 2a 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20  * so that means 
4a00: 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20  we can look for 
4a10: 58 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20  X plus up to 10 
4a20: 6f 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74  other equivalent
4a30: 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63   values..** Henc
4a40: 65 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58  e a search for X
4a50: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78   will return <ex
4a60: 70 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20  pr> if X=A1 and 
4a70: 41 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a  A1=A2 and A2=A3.
4a80: 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41  ** and ... and A
4a90: 39 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65  9=A10 and A10=<e
4aa0: 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  xpr>..**.** If t
4ab0: 68 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c  here are multipl
4ac0: 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
4ad0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
4ae0: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4af0: 3c 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20  <expr>".** then 
4b00: 74 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20  try for the one 
4b10: 77 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e  with no dependen
4b20: 63 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d  cies on <expr> -
4b30: 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   in other words 
4b40: 77 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20  where.** <expr> 
4b50: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  is a constant ex
4b60: 70 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65  pression of some
4b70: 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74   kind.  Only ret
4b80: 75 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a  urn entries of.*
4b90: 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  * the form "X <o
4ba0: 70 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73  p> Y" where Y is
4bb0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f   a column in ano
4bc0: 74 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f  ther table if no
4bd0: 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65   terms of.** the
4be0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63   form "X <op> <c
4bf0: 6f 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73  onst-expr>" exis
4c00: 74 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73  t.   If no terms
4c10: 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74   with a constant
4c20: 20 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74   RHS.** exist, t
4c30: 72 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74  ry to return a t
4c40: 65 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  erm that does no
4c50: 74 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a  t use WO_EQUIV..
4c60: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4c70: 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20  erm *findTerm(. 
4c80: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
4c90: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
4ca0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
4cb0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
4cc0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
4cd0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
4ce0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
4cf0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
4d00: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
4d10: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
4d20: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
4d30: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
4d40: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
4d50: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
4d60: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d80: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
4d90: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
4da0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
4db0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
4dc0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
4dd0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
4de0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
4df0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
4e00: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
4e10: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
4e20: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
4e30: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
4e40: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
4e50: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
4e60: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
4e70: 78 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  x);.  while( p )
4e80: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  {.    if( (p->pr
4e90: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
4ea0: 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
4eb0: 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52    if( p->prereqR
4ec0: 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65  ight==0 && (p->e
4ed0: 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21  Operator&WO_EQ)!
4ee0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
4ef0: 74 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a  turn p;.      }.
4f00: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 75 6c        if( pResul
4f10: 74 3d 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d  t==0 ) pResult =
4f20: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20   p;.    }.    p 
4f30: 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
4f40: 26 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  &scan);.  }.  re
4f50: 74 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a  turn pResult;.}.
4f60: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
4f70: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
4f80: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
4f90: 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65  (SrcList*, Where
4fa0: 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a  Clause*, int);..
4fb0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41  /*.** Call exprA
4fc0: 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65  nalyze on all te
4fd0: 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63  rms in a WHERE c
4fe0: 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74  lause.  .*/.stat
4ff0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
5000: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
5010: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
5020: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
5030: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5040: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
5050: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
5060: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
5070: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
5080: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
5090: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
50a0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
50b0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
50c0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
50d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
50e0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
50f0: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
5100: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
5110: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
5120: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
5130: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
5140: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
5150: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
5160: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5170: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
5180: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
5190: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
51a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
51b0: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
51c0: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
51d0: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
51e0: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
51f0: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
5200: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
5210: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
5220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
5230: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
5240: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5250: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5260: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5270: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
5280: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
5290: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
52a0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
52b0: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
52c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
52d0: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
52e0: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
52f0: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
5300: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
5310: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
5320: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
5330: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
5340: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
5350: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
5360: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
5370: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
5380: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
5390: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
53a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
53b0: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
53c0: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
53d0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
53e0: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
53f0: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
5400: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
5410: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
5420: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
5430: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
5440: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
5450: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5460: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
5490: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
54a0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
54b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
54c0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
54d0: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
54e0: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
54f0: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
5500: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
5510: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
5520: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5530: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
5540: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5550: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
5560: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
5570: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5590: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
55a0: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
55b0: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
55c0: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
55d0: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
55e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
55f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
5600: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
5610: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
5620: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
5630: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
5640: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
5650: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
5660: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
5670: 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20  K_COLUMN .   || 
5680: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
5690: 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49  ity(pLeft)!=SQLI
56a0: 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20  TE_AFF_TEXT .   
56b0: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65  || IsVirtual(pLe
56c0: 66 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20  ft->pTab).  ){. 
56d0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30     /* IMP: R-020
56e0: 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66  65-49465 The lef
56f0: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
5700: 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20  he LIKE or GLOB 
5710: 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20  operator must.  
5720: 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65    ** be the name
5730: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
5740: 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20  olumn with TEXT 
5750: 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
5760: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5770: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
5780: 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b  iColumn!=(-1) );
5790: 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20   /* Because IPK 
57a0: 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54 45  never has AFF_TE
57b0: 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20  XT */..  pRight 
57c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
57d0: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
57e0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 6f  a[0].pExpr);.  o
57f0: 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a  p = pRight->op;.
5800: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52    if( op==TK_VAR
5810: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62  IABLE ){.    Vdb
5820: 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20  e *pReprepare = 
5830: 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
5840: 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  re;.    int iCol
5850: 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75   = pRight->iColu
5860: 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  mn;.    pVal = s
5870: 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
5880: 6e 64 56 61 6c 75 65 28 70 52 65 70 72 65 70 61  ndValue(pReprepa
5890: 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45  re, iCol, SQLITE
58a0: 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20  _AFF_NONE);.    
58b0: 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69  if( pVal && sqli
58c0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
58d0: 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Val)==SQLITE_TEX
58e0: 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28  T ){.      z = (
58f0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
5900: 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b  alue_text(pVal);
5910: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5920: 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
5930: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
5940: 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  iCol);.    asser
5950: 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  t( pRight->op==T
5960: 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52  K_VARIABLE || pR
5970: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ight->op==TK_REG
5980: 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65  ISTER );.  }else
5990: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49   if( op==TK_STRI
59a0: 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52  NG ){.    z = pR
59b0: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  ight->u.zToken;.
59c0: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20    }.  if( z ){. 
59d0: 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
59e0: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d  while( (c=z[cnt]
59f0: 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d  )!=0 && c!=wc[0]
5a00: 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20   && c!=wc[1] && 
5a10: 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20  c!=wc[2] ){.    
5a20: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20    cnt++;.    }. 
5a30: 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26     if( cnt!=0 &&
5a40: 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d   255!=(u8)z[cnt-
5a50: 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  1] ){.      Expr
5a60: 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20   *pPrefix;.     
5a70: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   *pisComplete = 
5a80: 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e  c==wc[0] && z[cn
5a90: 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70  t+1]==0;.      p
5aa0: 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33  Prefix = sqlite3
5ab0: 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49  Expr(db, TK_STRI
5ac0: 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66  NG, z);.      if
5ad0: 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65  ( pPrefix ) pPre
5ae0: 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e  fix->u.zToken[cn
5af0: 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70  t] = 0;.      *p
5b00: 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69  pPrefix = pPrefi
5b10: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  x;.      if( op=
5b20: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
5b30: 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20          Vdbe *v 
5b40: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5b50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5b60: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76  VdbeSetVarmask(v
5b70: 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  , pRight->iColum
5b80: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
5b90: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20  *pisComplete && 
5ba0: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
5bb0: 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [1] ){.         
5bc0: 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f   /* If the rhs o
5bd0: 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65  f the LIKE expre
5be0: 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61  ssion is a varia
5bf0: 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ble, and the cur
5c00: 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  rent.          *
5c10: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76  * value of the v
5c20: 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68  ariable means th
5c30: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
5c40: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b  o invoke the LIK
5c50: 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  E.          ** f
5c60: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f  unction, then no
5c70: 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c   OP_Variable wil
5c80: 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
5c90: 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20  e program..     
5ca0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75       ** This cau
5cb0: 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72  ses problems for
5cc0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
5cd0: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
5ce0: 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ().          ** 
5cf0: 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75  API. To workarou
5d00: 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64  nd them, add a d
5d10: 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65  ummy OP_Variable
5d20: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20   here..         
5d30: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69   */ .          i
5d40: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
5d50: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5d60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5d70: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
5d80: 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  et(pParse, pRigh
5d90: 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  t, r1);.        
5da0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5db0: 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33  ngeP3(v, sqlite3
5dc0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5dd0: 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  v)-1, 0);.      
5de0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5df0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5e00: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , r1);.        }
5e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5e20: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b  se{.      z = 0;
5e30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
5e40: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
5e50: 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Val);.  return (
5e60: 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  z!=0);.}.#endif 
5e70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
5e80: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
5e90: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
5ea0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
5eb0: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65  LTABLE./*.** Che
5ec0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
5ed0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
5ee0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
5ef0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  .**.**         c
5f00: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
5f10: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
5f20: 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45  then return TRUE
5f30: 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  .  If not, retur
5f40: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
5f50: 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66  ic int isMatchOf
5f60: 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a  Column(.  Expr *
5f70: 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65  pExpr      /* Te
5f80: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
5f90: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  on */.){.  ExprL
5fa0: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69  ist *pList;..  i
5fb0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
5fc0: 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
5fd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5fe0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
5ff0: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
6000: 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20  ken,"match")!=0 
6010: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6020: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70  .  }.  pList = p
6030: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
6040: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
6050: 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  r!=2 ){.    retu
6060: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
6070: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6080: 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55  r->op != TK_COLU
6090: 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  MN ){.    return
60a0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
60b0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
60c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
60d0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
60e0: 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20  ** If the pBase 
60f0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
6100: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
6110: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
6120: 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68  of.** a join, th
6130: 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
6140: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b  appropriate mark
6150: 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72  ings over to der
6160: 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ived..*/.static 
6170: 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69  void transferJoi
6180: 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a  nMarkings(Expr *
6190: 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a  pDerived, Expr *
61a0: 70 42 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44  pBase){.  if( pD
61b0: 65 72 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44  erived ){.    pD
61c0: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
61d0: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
61e0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20  EP_FromJoin;.   
61f0: 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68   pDerived->iRigh
6200: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61  tJoinTable = pBa
6210: 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  se->iRightJoinTa
6220: 62 6c 65 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  ble;.  }.}..#if 
6230: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6240: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
6250: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
6260: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
6270: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e  BQUERY)./*.** An
6280: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
6290: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  t consists of tw
62a0: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
62b0: 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72  nected.** subter
62c0: 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a  ms.  So in:.**.*
62d0: 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20  *     ... WHERE 
62e0: 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20   (a=5) AND (b=7 
62f0: 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20  OR c=9 OR d=13) 
6300: 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20  AND (d=13).**   
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e         ^^^^^^^^^
6330: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a  ^^^^^^^^^^^.**.*
6340: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
6350: 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75  nalyzes terms su
6360: 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65  ch as the middle
6370: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f   term in the abo
6380: 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41  ve example..** A
6390: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
63a0: 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ect is computed 
63b0: 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20  and attached to 
63c0: 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a  the term under.*
63d0: 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61  * analysis, rega
63e0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
63f0: 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61  tcome of the ana
6400: 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a  lysis.  Hence:.*
6410: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
6420: 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20  rm.wtFlags   |= 
6430: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20   TERM_ORINFO.** 
6440: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
6450: 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79  pOrInfo  =  a dy
6460: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
6470: 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20  ted WhereOrTerm 
6480: 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  object.**.** The
6490: 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
64a0: 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74  yzed must have t
64b0: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52  wo or more of OR
64c0: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
64d0: 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  rms..** A single
64e0: 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62   subterm might b
64f0: 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63  e a set of AND-c
6500: 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62  onnected sub-sub
6510: 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c  terms..** Exampl
6520: 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65  es of terms unde
6530: 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a  r analysis:.**.*
6540: 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31  *     (A)     t1
6550: 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d  .x=t2.y OR t1.x=
6560: 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20  t2.z OR t1.y=15 
6570: 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a  OR t1.z=t3.a+5.*
6580: 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d  *     (B)     x=
6590: 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78  expr1 OR expr2=x
65a0: 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20   OR x=expr3.**  
65b0: 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d     (C)     t1.x=
65c0: 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32  t2.y OR (t1.x=t2
65d0: 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a  .z AND t1.y=15).
65e0: 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78  **     (D)     x
65f0: 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20  =expr1 OR (y>11 
6600: 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c  AND y<22 AND z L
6610: 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a  IKE '*hello*').*
6620: 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70  *     (E)     (p
6630: 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41  .a=1 AND q.b=2 A
6640: 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e  ND r.c=3) OR (p.
6650: 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e  x=4 AND q.y=5 AN
6660: 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43  D r.z=6).**.** C
6670: 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 1:.**.** If 
6680: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
6690: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43   of the form T.C
66a0: 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73  =expr for some s
66b0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
66c0: 43 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c  C and.** a singl
66d0: 65 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68  e table T (as sh
66e0: 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42  own in example B
66f0: 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65   above) then cre
6700: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
6710: 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69  l.** term that i
6720: 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  s an equivalent 
6730: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  IN expression.  
6740: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
6750: 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62  if the term.** b
6760: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73  eing analyzed is
6770: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d  :.**.**      x =
6780: 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72   expr1  OR  expr
6790: 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65  2 = x  OR  x = e
67a0: 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  xpr3.**.** then 
67b0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
67c0: 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74  tual term like t
67d0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
67e0: 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72  x IN (expr1,expr
67f0: 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43  2,expr3).**.** C
6800: 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 2:.**.** If 
6810: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
6820: 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20   indexable by a 
6830: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20  single table T, 
6840: 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20  then set.**.**  
6850: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70     WhereTerm.eOp
6860: 65 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20  erator          
6870: 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20      =  WO_OR.** 
6880: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
6890: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
68a0: 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73  le  |=  the curs
68b0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
68c0: 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75  ble T.**.** A su
68d0: 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61  bterm is "indexa
68e0: 62 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66  ble" if it is of
68f0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e   the form.** "T.
6900: 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  C <op> <expr>" w
6910: 68 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f  here C is any co
6920: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20  lumn of table T 
6930: 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20  and .** <op> is 
6940: 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c  one of "=", "<",
6950: 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22   "<=", ">", ">="
6960: 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20  , "IS NULL", or 
6970: 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65  "IN"..** A subte
6980: 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78  rm is also index
6990: 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e  able if it is an
69a0: 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d   AND of two or m
69b0: 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72  ore.** subsubter
69c0: 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ms at least one 
69d0: 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65  of which is inde
69e0: 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c  xable.  Indexabl
69f0: 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72  e AND .** subter
6a00: 6d 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f  ms have their eO
6a10: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57  perator set to W
6a20: 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68  O_AND and they h
6a30: 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66  ave.** u.pAndInf
6a40: 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d  o set to a dynam
6a50: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
6a60: 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62   WhereAndTerm ob
6a70: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d  ject..**.** From
6a80: 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f   another point o
6a90: 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62  f view, "indexab
6aa0: 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74  le" means that t
6ab0: 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64  he subterm could
6ac0: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
6ad0: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
6ae0: 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72  index if an appr
6af0: 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78  opriate index ex
6b00: 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e  ists..** This an
6b10: 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20  alysis does not 
6b20: 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72  consider whether
6b30: 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65   or not the inde
6b40: 78 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a  x exists; that.*
6b50: 2a 20 69 73 20 64 65 63 69 64 65 64 20 65 6c 73  * is decided els
6b60: 65 77 68 65 72 65 2e 20 20 54 68 69 73 20 61 6e  ewhere.  This an
6b70: 61 6c 79 73 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b  alysis only look
6b80: 73 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62  s at whether sub
6b90: 74 65 72 6d 73 0a 2a 2a 20 61 70 70 72 6f 70 72  terms.** appropr
6ba0: 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e  iate for indexin
6bb0: 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  g exist..**.** A
6bc0: 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68  ll examples A th
6bd0: 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 73 61  rough E above sa
6be0: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42  tisfy case 2.  B
6bf0: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
6c00: 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20  also statisfies 
6c10: 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20  case 1 (such as 
6c20: 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  B) we know that 
6c30: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69  the optimizer wi
6c40: 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65  ll.** always pre
6c50: 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69  fer case 1, so i
6c60: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70  n that case we p
6c70: 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65  retend that case
6c80: 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74   2 is not.** sat
6c90: 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  isfied..**.** It
6ca0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
6cb0: 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  se that multiple
6cc0: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65   tables are inde
6cd0: 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d  xable.  For exam
6ce0: 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76  ple,.** (E) abov
6cf0: 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f  e is indexable o
6d00: 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61  n tables P, Q, a
6d10: 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  nd R..**.** Term
6d20: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
6d30: 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64  ase 2 are candid
6d40: 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20  ates for lookup 
6d50: 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61  by using.** sepa
6d60: 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20  rate indices to 
6d70: 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20  find rowids for 
6d80: 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64  each subterm and
6d90: 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68   composing.** th
6da0: 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72  e union of all r
6db0: 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f  owids using a Ro
6dc0: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
6dd0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  is is similar.**
6de0: 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69   to "bitmap indi
6df0: 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61  ces" in other da
6e00: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a  tabase engines..
6e10: 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a  **.** OTHERWISE:
6e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
6e30: 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73  r case 1 nor cas
6e40: 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20  e 2 apply, then 
6e50: 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61  leave the eOpera
6e60: 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  tor set to.** ze
6e70: 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69  ro.  This term i
6e80: 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72  s not useful for
6e90: 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74   search..*/.stat
6ea0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
6eb0: 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63  yzeOrTerm(.  Src
6ec0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
6ed0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
6ee0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
6ef0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
6f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
6f10: 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63  complete WHERE c
6f20: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
6f30: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
6f40: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
6f50: 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20   the OR-term to 
6f60: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
6f70: 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
6f80: 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
6f90: 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  nfo;        /* W
6fa0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
6fb0: 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  essing context *
6fc0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
6fd0: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
6fe0: 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se;         /* P
6ff0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
7000: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7010: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
7020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
7030: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
7040: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
7050: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
7060: 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f  a[idxTerm];    /
7070: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
7080: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45   analyzed */.  E
7090: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
70a0: 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20  rm->pExpr;      
70b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
70c0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
70d0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  term */.  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 20 20 20                  
7100: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7110: 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  rs */.  WhereCla
7120: 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20  use *pOrWc;     
7130: 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20    /* Breakup of 
7140: 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65  pTerm into subte
7150: 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  rms */.  WhereTe
7160: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20  rm *pOrTerm;    
7170: 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d     /* A Sub-term
7180: 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57   within the pOrW
7190: 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e  c */.  WhereOrIn
71a0: 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20  fo *pOrInfo;    
71b0: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69   /* Additional i
71c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63  nformation assoc
71d0: 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d  iated with pTerm
71e0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68   */.  Bitmask ch
71f0: 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20  ngToIN;         
7200: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
7210: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
7220: 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  e 1 */.  Bitmask
7230: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
7240: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
7250: 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c  t are indexable,
7260: 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65   satisfying case
7270: 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   2 */..  /*.  **
7280: 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c   Break the OR cl
7290: 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65  ause into its se
72a0: 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e  parate subterms.
72b0: 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61    The subterms a
72c0: 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  re.  ** stored i
72d0: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  n a WhereClause 
72e0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
72f0: 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20  ning within the 
7300: 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a  WhereOrInfo.  **
7310: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
7320: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
7330: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75  original OR clau
7340: 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  se term..  */.  
7350: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
7360: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
7370: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49  DYNAMIC|TERM_ORI
7380: 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  NFO|TERM_ANDINFO
7390: 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
73a0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
73b0: 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  _OR );.  pTerm->
73c0: 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49  u.pOrInfo = pOrI
73d0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
73e0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
73f0: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
7400: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
7410: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
7420: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
7430: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
7440: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
7450: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
7460: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
7470: 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70  Info);.  whereSp
7480: 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72  lit(pOrWc, pExpr
7490: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72  , TK_OR);.  expr
74a0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
74b0: 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64   pOrWc);.  if( d
74c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
74d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
74e0: 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  rt( pOrWc->nTerm
74f0: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  >=2 );..  /*.  *
7500: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65  * Compute the se
7510: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7520: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
7530: 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a  ases 1 or 2..  *
7540: 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20  /.  indexable = 
7550: 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63  ~(Bitmask)0;.  c
7560: 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d  hngToIN = ~(Bitm
7570: 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70  ask)0;.  for(i=p
7580: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
7590: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
75a0: 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62   i>=0 && indexab
75b0: 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  le; i--, pOrTerm
75c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f  ++){.    if( (pO
75d0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
75e0: 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30   & WO_SINGLE)==0
75f0: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41   ){.      WhereA
7600: 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f  ndInfo *pAndInfo
7610: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7620: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
7630: 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46  s & (TERM_ANDINF
7640: 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d  O|TERM_ORINFO))=
7650: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67  =0 );.      chng
7660: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
7670: 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pAndInfo = sqlit
7680: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
7690: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e  , sizeof(*pAndIn
76a0: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
76b0: 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pAndInfo ){.    
76c0: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
76d0: 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20  *pAndWC;.       
76e0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64   WhereTerm *pAnd
76f0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Term;.        in
7700: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74  t j;.        Bit
7710: 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20  mask b = 0;.    
7720: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70      pOrTerm->u.p
7730: 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e  AndInfo = pAndIn
7740: 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  fo;.        pOrT
7750: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
7760: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20  TERM_ANDINFO;.  
7770: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65        pOrTerm->e
7780: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e  Operator = WO_AN
7790: 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  D;.        pAndW
77a0: 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77  C = &pAndInfo->w
77b0: 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  c;.        where
77c0: 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57  ClauseInit(pAndW
77d0: 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b  C, pWC->pWInfo);
77e0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70  .        whereSp
77f0: 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54  lit(pAndWC, pOrT
7800: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41  erm->pExpr, TK_A
7810: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  ND);.        exp
7820: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
7830: 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20  , pAndWC);.     
7840: 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65     pAndWC->pOute
7850: 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20  r = pWC;.       
7860: 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d   testcase( db->m
7870: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7880: 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
7890: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
78a0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
78b0: 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64  0, pAndTerm=pAnd
78c0: 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d  WC->a; j<pAndWC-
78d0: 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e  >nTerm; j++, pAn
78e0: 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  dTerm++){.      
78f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41        assert( pA
7900: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b  ndTerm->pExpr );
7910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7920: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54   allowedOp(pAndT
7930: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20  erm->pExpr->op) 
7940: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7950: 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70   b |= getMask(&p
7960: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
7970: 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43   pAndTerm->leftC
7980: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
7990: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
79a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
79b0: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
79c0: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
79d0: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
79e0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
79f0: 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20  M_COPIED ){.    
7a00: 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74    /* Skip this t
7a10: 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65  erm for now.  We
7a20: 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e   revisit it when
7a30: 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a   we process the.
7a40: 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70        ** corresp
7a50: 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54  onding TERM_VIRT
7a60: 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  UAL term */.    
7a70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
7a80: 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20  mask b;.      b 
7a90: 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
7aa0: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72  o->sMaskSet, pOr
7ab0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
7ad0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7ae0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a  TERM_VIRTUAL ){.
7af0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
7b00: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72  m *pOther = &pOr
7b10: 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69  Wc->a[pOrTerm->i
7b20: 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20  Parent];.       
7b30: 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70   b |= getMask(&p
7b40: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
7b50: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
7b60: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
7b70: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
7b80: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   b;.      if( (p
7b90: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
7ba0: 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b  r & WO_EQ)==0 ){
7bb0: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
7bc0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  N = 0;.      }el
7bd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67  se{.        chng
7be0: 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20  ToIN &= b;.     
7bf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
7c00: 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74  /*.  ** Record t
7c10: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
7c20: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
7c30: 73 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d  se 2.  The set m
7c40: 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70  ight be.  ** emp
7c50: 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e  ty..  */.  pOrIn
7c60: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20  fo->indexable = 
7c70: 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65  indexable;.  pTe
7c80: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
7c90: 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30  indexable==0 ? 0
7ca0: 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a   : WO_OR;..  /*.
7cb0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f    ** chngToIN ho
7cc0: 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62  lds a set of tab
7cd0: 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a  les that *might*
7ce0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e   satisfy case 1.
7cf0: 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61    But.  ** we ha
7d00: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64  ve to do some ad
7d10: 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e  ditional checkin
7d20: 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65  g to see if case
7d30: 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69   1 really.  ** i
7d40: 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a  s satisfied..  *
7d50: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
7d60: 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72  will hold either
7d70: 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73   0, 1, or 2 bits
7d80: 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73  .  The 0-bit cas
7d90: 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  e means.  ** tha
7da0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  t there is no po
7db0: 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61  ssibility of tra
7dc0: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52  nsforming the OR
7dd0: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a   clause into an.
7de0: 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72    ** IN operator
7df0: 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20   because one or 
7e00: 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68  more terms in th
7e10: 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74  e OR clause cont
7e20: 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69  ain.  ** somethi
7e30: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d  ng other than ==
7e40: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   on a column in 
7e50: 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  the single table
7e60: 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a  .  The 1-bit.  *
7e70: 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61  * case means tha
7e80: 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  t every term of 
7e90: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73  the OR clause is
7ea0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a   of the form.  *
7eb0: 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d  * "table.column=
7ec0: 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73  expr" for some s
7ed0: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
7ee0: 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69  e one bit that i
7ef0: 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  s set.  ** will 
7f00: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
7f10: 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20  e common table. 
7f20: 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   We still need t
7f30: 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a  o check to make.
7f40: 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61    ** sure the sa
7f50: 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  me column is use
7f60: 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20  d on all terms. 
7f70: 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   The 2-bit case 
7f80: 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65  is when.  ** the
7f90: 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f   all terms are o
7fa0: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
7fb0: 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32  e1.column=table2
7fc0: 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20  .column".  It.  
7fd0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73  ** might be poss
7fe0: 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20  ible to form an 
7ff0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
8000: 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63   either table1.c
8010: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61  olumn.  ** or ta
8020: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74  ble2.column as t
8030: 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72  he LHS if either
8040: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76   is common to ev
8050: 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  ery term of.  **
8060: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a   the OR clause..
8070: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
8080: 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  hat terms of the
8090: 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c   form "table.col
80a0: 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d  umn1=table.colum
80b0: 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61  n2" (the.  ** sa
80c0: 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68  me table on both
80d0: 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d   sizes of the ==
80e0: 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  ) cannot be opti
80f0: 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  mized..  */.  if
8100: 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ( chngToIN ){.  
8110: 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    int okToChngTo
8120: 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  IN = 0;     /* T
8130: 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65  rue if the conve
8140: 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76  rsion to IN is v
8150: 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alid */.    int 
8160: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
8170: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
8180: 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20  index on lhs of 
8190: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
81a0: 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d     int iCursor =
81b0: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
81c0: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d  Table cursor com
81d0: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73  mon to all terms
81e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   */.    int j = 
81f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8200: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8210: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  r */..    /* Sea
8220: 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20  rch for a table 
8230: 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  and column that 
8240: 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73  appears on one s
8250: 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ide or the.    *
8260: 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d  * other of the =
8270: 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76  = operator in ev
8280: 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68  ery subterm.  Th
8290: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  at table and col
82a0: 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  umn.    ** will 
82b0: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69  be recorded in i
82c0: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
82d0: 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  mn.  There might
82e0: 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20   not be any.    
82f0: 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e  ** such table an
8300: 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f  d column.  Set o
8310: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61  kToChngToIN if a
8320: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  n appropriate ta
8330: 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63  ble.    ** and c
8340: 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62  olumn is found b
8350: 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e  ut leave okToChn
8360: 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e  gToIN false if n
8370: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f  ot found..    */
8380: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
8390: 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f  2 && !okToChngTo
83a0: 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  IN; j++){.      
83b0: 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d  pOrTerm = pOrWc-
83c0: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
83d0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20  pOrWc->nTerm-1; 
83e0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
83f0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
8400: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
8410: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
8420: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
8430: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
8440: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
8450: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
8460: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
8470: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
8480: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
8490: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e  he 2-bit case an
84a0: 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20  d we are on the 
84b0: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
84c0: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
84d0: 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  * current term i
84e0: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
84f0: 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   iteration.  So 
8500: 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20  skip this term. 
8510: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
8520: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
8530: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8540: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8550: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
8560: 20 26 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   & getMask(&pWIn
8570: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
8580: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8590: 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r))==0 ){.      
85a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d      /* This term
85b0: 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20   must be of the 
85c0: 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20  form t1.a==t2.b 
85d0: 77 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74  where t2 is in t
85e0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
85f0: 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74  chngToIN set but
8600: 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69   t1 is not.  Thi
8610: 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65  s term will be e
8620: 69 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a  ither preceeded.
8630: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
8640: 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e  follwed by an in
8650: 76 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e  verted copy (t2.
8660: 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20  b==t1.a).  Skip 
8670: 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20  this term .     
8680: 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20       ** and use 
8690: 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a  its inversion. *
86a0: 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
86b0: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
86c0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
86d0: 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  PIED );.        
86e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54    testcase( pOrT
86f0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8700: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
8710: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8720: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8730: 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44  s & (TERM_COPIED
8740: 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29  |TERM_VIRTUAL) )
8750: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
8760: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
8770: 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
8780: 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  = pOrTerm->u.lef
8790: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
87a0: 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65   iCursor = pOrTe
87b0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a  rm->leftCursor;.
87c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
87d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
87e0: 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
87f0: 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20  /* No candidate 
8800: 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73  table+column was
8810: 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61   found.  This ca
8820: 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20  n only occur.   
8830: 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73       ** on the s
8840: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
8850: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
8860: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
8870: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
8880: 65 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e  erOfTwo(chngToIN
8890: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
88a0: 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67  ert( chngToIN==g
88b0: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
88c0: 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f  sMaskSet, iCurso
88d0: 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  r) );.        br
88e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
88f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
8900: 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  1 );..      /* W
8910: 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63  e have found a c
8920: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61  andidate table a
8930: 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63  nd column.  Chec
8940: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74  k to see if that
8950: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
8960: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f  and column is co
8970: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
8980: 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  rm in the OR cla
8990: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54  use */.      okT
89a0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20  oChngToIN = 1;. 
89b0: 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20       for(; i>=0 
89c0: 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  && okToChngToIN;
89d0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
89e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
89f0: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8a00: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8a10: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
8a20: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
8a30: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
8a40: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
8a50: 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  tFlags &= ~TERM_
8a60: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
8a70: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
8a80: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d  ->u.leftColumn!=
8a90: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
8aa0: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
8ab0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  N = 0;.        }
8ac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8ad0: 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66  int affLeft, aff
8ae0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
8af0: 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74   /* If the right
8b00: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c  -hand side is al
8b10: 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  so a column, the
8b20: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  n the affinities
8b30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
8b40: 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20   both right and 
8b50: 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20  left sides must 
8b60: 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20  be such that no 
8b70: 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a  type.          *
8b80: 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72  * conversions ar
8b90: 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68  e required on th
8ba0: 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65  e right.  (Ticke
8bb0: 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20  t #2249).       
8bc0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
8bd0: 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74  affRight = sqlit
8be0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
8bf0: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
8c00: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
8c10: 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69    affLeft = sqli
8c20: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
8c30: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
8c40: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
8c50: 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d    if( affRight!=
8c60: 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61  0 && affRight!=a
8c70: 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  ffLeft ){.      
8c80: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
8c90: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
8ca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8cb0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8cc0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
8cd0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
8ce0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8cf0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
8d00: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
8d10: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20  okToChngToIN is 
8d20: 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c  true if original
8d30: 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73   pTerm satisfies
8d40: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20  .    ** case 1. 
8d50: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63   In that case, c
8d60: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76  onstruct a new v
8d70: 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74  irtual term that
8d80: 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72   is .    ** pTer
8d90: 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  m converted into
8da0: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
8db0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8dc0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a  okToChngToIN ){.
8dd0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
8de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8df0: 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c  A transient dupl
8e00: 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  icate expression
8e10: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
8e20: 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20  st *pList = 0;  
8e30: 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74   /* The RHS of t
8e40: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
8e50: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
8e60: 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  eft = 0;       /
8e70: 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
8e80: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
8e90: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
8ea0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8eb0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20  The complete IN 
8ec0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20  operator */..   
8ed0: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
8ee0: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
8ef0: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b  =pOrWc->a; i>=0;
8f00: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
8f10: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
8f20: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8f30: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30  & TERM_OR_OK)==0
8f40: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8f50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
8f60: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8f70: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
8f80: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
8f90: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
8fa0: 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20  iCursor );.     
8fb0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
8fc0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
8fd0: 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==iColumn );.   
8fe0: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
8ff0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
9000: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
9010: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
9020: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
9030: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
9040: 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
9050: 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20   pList, pDup);. 
9060: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70         pLeft = p
9070: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
9080: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Left;.      }.  
9090: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
90a0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44  t!=0 );.      pD
90b0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
90c0: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
90d0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
90e0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
90f0: 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70  rse, TK_IN, pDup
9100: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
9110: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
9120: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
9130: 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a         transferJ
9140: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
9150: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
9160: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9170: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
9180: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9190: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
91a0: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
91b0: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
91c0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
91d0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54  ert(pWC, pNew, T
91e0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
91f0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
9200: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
9210: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
9220: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
9230: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
9240: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
9250: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
9260: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d  m];.        pWC-
9270: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
9280: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
9290: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
92a0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ild = 1;.      }
92b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
92c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
92d0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
92e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
92f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
9300: 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61   WO_NOOP;  /* ca
9310: 73 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65  se 1 trumps case
9320: 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a   2 */.    }.  }.
9330: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
9340: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
9350: 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c  MIZATION && !SQL
9360: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9370: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  Y */../*.** The 
9380: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
9390: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
93a0: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
93b0: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
93c0: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
93d0: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
93e0: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
93f0: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
9400: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
9410: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
9420: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
9430: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
9440: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
9450: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
9460: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9470: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
9480: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
9490: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
94a0: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
94b0: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
94c0: 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a  > <expr>"..**.**
94d0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
94e0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
94f0: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
9500: 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20  re both X and Y 
9510: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20  are.** columns, 
9520: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
9530: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  l expression is 
9540: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
9550: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
9560: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
9570: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
9580: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
9590: 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61   clause and.** a
95a0: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
95b0: 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  ly.  The origina
95c0: 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  l term is marked
95d0: 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45   with TERM_COPIE
95e0: 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77  D.** and the new
95f0: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
9600: 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49  with TERM_DYNAMI
9610: 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20  C (because it's 
9620: 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74  pExpr.** needs t
9630: 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20  o be freed with 
9640: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29  the WhereClause)
9650: 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41   and TERM_VIRTUA
9660: 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a  L (because it.**
9670: 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63   is a commuted c
9680: 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74  opy of a prior t
9690: 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69  erm.)  The origi
96a0: 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68  nal term has nCh
96b0: 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65  ild=1.** and the
96c0: 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72   copy has idxPar
96d0: 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69  ent set to the i
96e0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67  ndex of the orig
96f0: 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  inal term..*/.st
9700: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
9710: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
9720: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
9730: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
9740: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
9750: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
9760: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
9770: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
9780: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
9790: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
97a0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
97b0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
97c0: 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
97d0: 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
97e0: 6e 66 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c  nfo; /* WHERE cl
97f0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
9800: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
9810: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9830: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
9840: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68  analyzed */.  Wh
9850: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
9860: 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  kSet;          /
9870: 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69  * Set of table i
9880: 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20  ndex masks */.  
9890: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
98c0: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
98d0: 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  d */.  Bitmask p
98e0: 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20  rereqLeft;      
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
9900: 71 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20  quesites of the 
9910: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a  pExpr->pLeft */.
9920: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
9930: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
9940: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
9950: 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a  tes of pExpr */.
9960: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52    Bitmask extraR
9970: 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ight = 0;       
9980: 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65     /* Extra depe
9990: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54  ndencies on LEFT
99a0: 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20   JOIN */.  Expr 
99b0: 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20  *pStr1 = 0;     
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
99d0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
99e0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
99f0: 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  t isComplete = 0
9a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9a10: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
9a20: 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c  OB ends with wil
9a30: 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  dcard */.  int n
9a40: 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20  oCase = 0;      
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9a60: 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67  IKE/GLOB disting
9a70: 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20  uishes case */. 
9a80: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f    /* Top-level o
9ab0: 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d  perator.  pExpr-
9ac0: 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  >op */.  Parse *
9ad0: 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
9ae0: 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72  >pParse;  /* Par
9af0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9b00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9b10: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
9b20: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
9b30: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
9b40: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
9b50: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
9b60: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  rn;.  }.  pTerm 
9b70: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
9b80: 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  m];.  pMaskSet =
9b90: 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53   &pWInfo->sMaskS
9ba0: 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54  et;.  pExpr = pT
9bb0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73  erm->pExpr;.  as
9bc0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
9bd0: 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d  =TK_AS && pExpr-
9be0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op!=TK_COLLATE 
9bf0: 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20  );.  prereqLeft 
9c00: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
9c10: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
9c20: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d  ->pLeft);.  op =
9c30: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
9c40: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
9c50: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
9c60: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
9c70: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
9c80: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
9c90: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
9ca0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
9cb0: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53 65  eqRight = exprSe
9cc0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
9cd0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9ce0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
9cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65  }else{.      pTe
9d00: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
9d10: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
9d20: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
9d30: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
9d40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
9d50: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
9d60: 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  ){.    pTerm->pr
9d70: 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20  ereqRight = 0;. 
9d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72   }else{.    pTer
9d90: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
9da0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
9db0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9dc0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  >pRight);.  }.  
9dd0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72  prereqAll = expr
9de0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9df0: 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  Set, pExpr);.  i
9e00: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
9e10: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
9e20: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69  mJoin) ){.    Bi
9e30: 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73  tmask x = getMas
9e40: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  k(pMaskSet, pExp
9e50: 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
9e60: 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41  le);.    prereqA
9e70: 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74  ll |= x;.    ext
9e80: 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20  raRight = x-1;  
9e90: 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  /* ON clause ter
9ea0: 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ms may not be us
9eb0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
9ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9ed0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65          ** on le
9ee0: 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ft table of a LE
9ef0: 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74  FT JOIN.  Ticket
9f00: 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20   #3015 */.  }.  
9f10: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
9f20: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
9f30: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
9f40: 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  r = -1;.  pTerm-
9f50: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
9f60: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
9f70: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c  r = 0;.  if( all
9f80: 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20  owedOp(op) ){.  
9f90: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
9fa0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
9fb0: 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c  ollate(pExpr->pL
9fc0: 65 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a  eft);.    Expr *
9fd0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
9fe0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
9ff0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
a000: 20 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d      u16 opMask =
a010: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
a020: 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66  ight & prereqLef
a030: 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a  t)==0 ? WO_ALL :
a040: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69   WO_EQUIV;.    i
a050: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
a060: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
a070: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
a080: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
a090: 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  le;.      pTerm-
a0a0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
a0b0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
a0c0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
a0d0: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
a0e0: 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61  rMask(op) & opMa
a0f0: 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sk;.    }.    if
a100: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
a110: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
a120: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
a130: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
a140: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
a150: 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f 70      u16 eExtraOp
a160: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
a170: 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20 70  Extra bits for p
a180: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  New->eOperator *
a190: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  /.      if( pTer
a1a0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30  m->leftCursor>=0
a1b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
a1c0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
a1d0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
a1e0: 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
a1f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
a200: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a210: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
a220: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
a230: 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  (db, pDup);.    
a240: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
a250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a260: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
a270: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
a280: 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55  pDup, TERM_VIRTU
a290: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
a2a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  ;.        if( id
a2b0: 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  xNew==0 ) return
a2c0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
a2d0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
a2e0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
a2f0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
a300: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
a310: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
a320: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  rm];.        pTe
a330: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
a340: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77          pTerm->w
a350: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
a360: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69  OPIED;.        i
a370: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
a380: 5f 45 51 0a 20 20 20 20 20 20 20 20 20 26 26 20  _EQ.         && 
a390: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a3a0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
a3b0: 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26  oin).         &&
a3c0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
a3d0: 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
a3e0: 54 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20  Transitive).    
a3f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
a400: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a410: 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20  r |= WO_EQUIV;. 
a420: 20 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f           eExtraO
a430: 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  p = WO_EQUIV;.  
a440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
a450: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75  lse{.        pDu
a460: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  p = pExpr;.     
a470: 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b     pNew = pTerm;
a480: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
a490: 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73  xprCommute(pPars
a4a0: 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  e, pDup);.      
a4b0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
a4c0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
a4d0: 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  Dup->pLeft);.   
a4e0: 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72     pNew->leftCur
a4f0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
a500: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ble;.      pNew-
a510: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
a520: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
a530: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a540: 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78  (prereqLeft | ex
a550: 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65  traRight) != pre
a560: 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  reqLeft );.     
a570: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67   pNew->prereqRig
a580: 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ht = prereqLeft 
a590: 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20  | extraRight;.  
a5a0: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
a5b0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
a5c0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70  .      pNew->eOp
a5d0: 65 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74  erator = (operat
a5e0: 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29  orMask(pDup->op)
a5f0: 20 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f   + eExtraOp) & o
a600: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  pMask;.    }.  }
a610: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a620: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
a630: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
a640: 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65  If a term is the
a650: 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
a660: 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65  r, create two ne
a670: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a  w virtual terms.
a680: 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65    ** that define
a690: 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20   the range that 
a6a0: 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c  the BETWEEN impl
a6b0: 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61  ements.  For exa
a6c0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
a6d0: 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62       a BETWEEN b
a6e0: 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a   AND c.  **.  **
a6f0: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   is converted in
a700: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
a710: 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20     (a BETWEEN b 
a720: 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62  AND c) AND (a>=b
a730: 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a  ) AND (a<=c).  *
a740: 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e  *.  ** The two n
a750: 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  ew terms are add
a760: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
a770: 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  of the WhereClau
a780: 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20  se object..  ** 
a790: 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72  The new terms ar
a7a0: 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20  e "dynamic" and 
a7b0: 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  are children of 
a7c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54  the original BET
a7d0: 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  WEEN.  ** term. 
a7e0: 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   That means that
a7f0: 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
a800: 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74  term is coded, t
a810: 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a  he children are.
a820: 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f    ** skipped.  O
a830: 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72  r, if the childr
a840: 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64  en are satisfied
a850: 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68   by an index, th
a860: 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
a870: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
a880: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
a890: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
a8a0: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26  op==TK_BETWEEN &
a8b0: 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  & pWC->op==TK_AN
a8c0: 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  D ){.    ExprLis
a8d0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
a8e0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69  ->x.pList;.    i
a8f0: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
a900: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
a910: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
a920: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
a930: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
a940: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
a950: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
a960: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
a970: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
a980: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
a990: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
a9a0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
a9b0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f  3PExpr(pParse, o
a9c0: 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20  ps[i], .        
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a9f0: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  Dup(db, pExpr->p
aa00: 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Left, 0),.      
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
aa30: 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  prDup(db, pList-
aa40: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c  >a[i].pExpr, 0),
aa50: 20 30 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73   0);.      trans
aa60: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
aa70: 70 4e 65 77 45 78 70 72 2c 20 70 45 78 70 72 29  pNewExpr, pExpr)
aa80: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
aa90: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
aaa0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
aab0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
aac0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
aad0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
aae0: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
aaf0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
ab00: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
ab10: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
ab20: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
ab30: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
ab40: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
ab50: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
ab60: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
ab70: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
ab80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ab90: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
aba0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
abb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
abc0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
abd0: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
abe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
abf0: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
ac00: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
ac10: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
ac20: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
ac30: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
ac40: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
ac50: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
ac60: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
ac70: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
ac80: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
ac90: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
aca0: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
acb0: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
acc0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
acd0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
ace0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
acf0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
ad00: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
ad10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ad20: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
ad30: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
ad40: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
ad50: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
ad60: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
ad70: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
ad80: 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  tor..  **.  ** A
ad90: 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66   like pattern of
ada0: 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b   the form "x LIK
adb0: 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61  E 'abc%'" is cha
adc0: 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72  nged into constr
add0: 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aints.  **.  ** 
ade0: 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63           x>='abc
adf0: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e  ' AND x<'abd' AN
ae00: 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a  D x LIKE 'abc%'.
ae10: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
ae20: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
ae30: 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22  the prefix "abc"
ae40: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
ae50: 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a  to form the.  **
ae60: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
ae70: 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20  dition "abd"..  
ae80: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70  */.  if( pWC->op
ae90: 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20  ==TK_AND .   && 
aea0: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61  isLikeOrGlob(pPa
aeb0: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74  rse, pExpr, &pSt
aec0: 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  r1, &isComplete,
aed0: 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20   &noCase).  ){. 
aee0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20     Expr *pLeft; 
aef0: 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20        /* LHS of 
af00: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
af10: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
af20: 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20  pStr2;       /* 
af30: 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20  Copy of pStr1 - 
af40: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
af50: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
af60: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
af70: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
af80: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
af90: 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20  dxNew1;.    int 
afa0: 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b  idxNew2;.    Tok
afb0: 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b  en sCollSeqName;
afc0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
afd0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
afe0: 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  */..    pLeft = 
aff0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b000: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
b010: 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45  pStr2 = sqlite3E
b020: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31  xprDup(db, pStr1
b030: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64  , 0);.    if( !d
b040: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b050: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
b060: 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73  pC;       /* Las
b070: 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  t character befo
b080: 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69 6c  re the first wil
b090: 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70  dcard */.      p
b0a0: 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d  C = (u8*)&pStr2-
b0b0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65  >u.zToken[sqlite
b0c0: 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d  3Strlen30(pStr2-
b0d0: 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20  >u.zToken)-1];. 
b0e0: 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20       c = *pC;.  
b0f0: 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29      if( noCase )
b100: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
b110: 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63   point is to inc
b120: 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20  rement the last 
b130: 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
b140: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
b150: 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20     ** wildcard. 
b160: 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72 65   But if we incre
b170: 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77  ment '@', that w
b180: 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f  ill push it into
b190: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
b1a0: 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67 65  alphabetic range
b1b0: 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76   where case conv
b1c0: 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73  ersions will mes
b1d0: 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20 20  s up the .      
b1e0: 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e    ** inequality.
b1f0: 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c    To avoid this,
b200: 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c   make sure to al
b210: 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a  so run the full.
b220: 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20          ** LIKE 
b230: 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65  on all candidate
b240: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20   expressions by 
b250: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73 43  clearing the isC
b260: 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20  omplete flag.   
b270: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b280: 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69  if( c=='A'-1 ) i
b290: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20  sComplete = 0;. 
b2a0: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
b2b0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
b2c0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
b2d0: 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20   *pC = c + 1;.  
b2e0: 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71    }.    sCollSeq
b2f0: 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20  Name.z = noCase 
b300: 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49  ? "NOCASE" : "BI
b310: 4e 41 52 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c  NARY";.    sColl
b320: 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20  SeqName.n = 6;. 
b330: 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
b340: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b350: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
b360: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
b370: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b380: 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20  , TK_GE, .      
b390: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b3a0: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
b3b0: 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31  pParse,pNewExpr1
b3c0: 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  ,&sCollSeqName),
b3d0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
b3e0: 31 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73  1, 0);.    trans
b3f0: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
b400: 70 4e 65 77 45 78 70 72 31 2c 20 70 45 78 70 72  pNewExpr1, pExpr
b410: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d  );.    idxNew1 =
b420: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
b430: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
b440: 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  1, TERM_VIRTUAL|
b450: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
b460: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
b470: 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New1==0 );.    e
b480: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
b490: 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a   pWC, idxNew1);.
b4a0: 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
b4b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b4c0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
b4d0: 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
b4e0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b4f0: 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20  e, TK_LT,.      
b500: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b510: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
b520: 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32  pParse,pNewExpr2
b530: 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  ,&sCollSeqName),
b540: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
b550: 32 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73  2, 0);.    trans
b560: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
b570: 70 4e 65 77 45 78 70 72 32 2c 20 70 45 78 70 72  pNewExpr2, pExpr
b580: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d  );.    idxNew2 =
b590: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
b5a0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
b5b0: 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  2, TERM_VIRTUAL|
b5c0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
b5d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
b5e0: 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New2==0 );.    e
b5f0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
b600: 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a   pWC, idxNew2);.
b610: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
b620: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
b630: 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65    if( isComplete
b640: 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61   ){.      pWC->a
b650: 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e  [idxNew1].iParen
b660: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
b670: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
b680: 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  2].iParent = idx
b690: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
b6a0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
b6b0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
b6c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
b6d0: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
b6e0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
b6f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
b700: 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61  TABLE.  /* Add a
b710: 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69   WO_MATCH auxili
b720: 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20  ary term to the 
b730: 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69  constraint set i
b740: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
b750: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  nt expression is
b760: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63   of the form:  c
b770: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
b780: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f  ..  ** This info
b790: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
b7a0: 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
b7b0: 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a  x methods of.  *
b7c0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * virtual tables
b7d0: 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75  .  The native qu
b7e0: 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f  ery optimizer do
b7f0: 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20  es not attempt. 
b800: 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69   ** to do anythi
b810: 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75  ng with MATCH fu
b820: 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
b830: 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  if( isMatchOfCol
b840: 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  umn(pExpr) ){.  
b850: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
b860: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
b870: 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72  *pLeft;.    Wher
b880: 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
b890: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65  .    Bitmask pre
b8a0: 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65  reqColumn, prere
b8b0: 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67  qExpr;..    pRig
b8c0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
b8d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
b8e0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
b8f0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
b900: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65  ].pExpr;.    pre
b910: 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61  reqExpr = exprTa
b920: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
b930: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
b940: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65  prereqColumn = e
b950: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
b960: 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a  askSet, pLeft);.
b970: 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45      if( (prereqE
b980: 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75  xpr & prereqColu
b990: 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mn)==0 ){.      
b9a0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
b9b0: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
b9c0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
b9d0: 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20  arse, TK_MATCH, 
b9e0: 0a 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 20 20 20 20 20 30                 0
ba00: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
ba10: 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c  (db, pRight, 0),
ba20: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
ba30: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
ba40: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
ba50: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
ba60: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
ba70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ba80: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
ba90: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
baa0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
bab0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bac0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
bad0: 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20  ereqExpr;.      
bae0: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
baf0: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
bb00: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
bb10: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
bb20: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
bb30: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
bb40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
bb50: 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20   WO_MATCH;.     
bb60: 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65   pNewTerm->iPare
bb70: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
bb80: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
bb90: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
bba0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
bbb0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65  d = 1;.      pTe
bbc0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
bbd0: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
bbe0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
bbf0: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
bc00: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a  rereqAll;.    }.
bc10: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
bc20: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
bc30: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65  LTABLE */..#ifde
bc40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
bc50: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
bc60: 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f   /* When sqlite_
bc70: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
bc80: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
bc90: 65 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66  e an operator of
bca0: 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22   the.  ** form "
bcb0: 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63  x IS NOT NULL" c
bcc0: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
bcd0: 65 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65  evaluated more e
bce0: 66 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20  fficiently.  ** 
bcf0: 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78  as "x>NULL" if x
bd00: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
bd10: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  ER PRIMARY KEY. 
bd20: 20 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a   So construct a.
bd30: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72    ** virtual ter
bd40: 6d 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a  m of that form..
bd50: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
bd60: 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20  hat the virtual 
bd70: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67  term must be tag
bd80: 67 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e  ged with TERM_VN
bd90: 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ULL.  This.  ** 
bda0: 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77  TERM_VNULL tag w
bdb0: 69 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65  ill suppress the
bdc0: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
bdd0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
bde0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f  .  ** of the loo
bdf0: 70 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20  p.  Without the 
be00: 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c  TERM_VNULL flag,
be10: 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68   the not-null ch
be20: 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  eck at.  ** the 
be30: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f  start of the loo
be40: 70 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61  p will prevent a
be50: 6e 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ny results from 
be60: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
be70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
be80: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
be90: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
bea0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
beb0: 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  MN.   && pExpr->
bec0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pLeft->iColumn>=
bed0: 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
bee0: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
bef0: 53 51 4c 49 54 45 5f 53 74 61 74 33 29 0a 20 20  SQLITE_Stat3).  
bf00: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
bf10: 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
bf20: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
bf30: 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
bf40: 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
bf50: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
bf60: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
bf70: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
bf80: 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bfb0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
bfc0: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
bff0: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
c000: 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
c010: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
c020: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c030: 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
c060: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
c070: 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
c080: 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
c090: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
c0a0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
c0b0: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
c0c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
c0d0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
c0e0: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
c0f0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
c100: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
c110: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
c120: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
c130: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c140: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
c150: 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
c160: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
c170: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
c180: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c190: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
c1a0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
c1b0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
c1c0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
c1d0: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
c1e0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
c1f0: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
c200: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
c210: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
c220: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
c230: 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  TAT4 */..  /* Pr
c240: 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
c250: 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
c260: 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
c270: 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
c280: 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
c290: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
c2a0: 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
c2b0: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
c2c0: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
c2d0: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
c2e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c2f0: 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66  searches pList f
c300: 6f 72 20 61 20 65 6e 74 72 79 20 74 68 61 74 20  or a entry that 
c310: 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c  matches the iCol
c320: 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  -th column.** of
c330: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
c340: 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78  ** If such an ex
c350: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
c360: 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20  d, its index in 
c370: 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65  pList->a[] is re
c380: 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f  turned. If.** no
c390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
c3a0: 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ound, -1 is retu
c3b0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
c3c0: 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  int findIndexCol
c3d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c3e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
c3f0: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
c400: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
c410: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
c420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
c430: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
c440: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
c450: 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20  iBase,          
c460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c470: 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20  ursor for table 
c480: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c490: 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
c4a0: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
c4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
c4c0: 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75  ex to match colu
c4d0: 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69  mn of */.  int i
c4e0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
c4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
c500: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f  lumn of index to
c510: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
c520: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
c530: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
c540: 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a  ->azColl[iCol];.
c550: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
c560: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
c570: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
c580: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
c590: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
c5a0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
c5b0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
c5c0: 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  UMN.     && p->i
c5d0: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
c5e0: 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20  Column[iCol].   
c5f0: 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d    && p->iTable==
c600: 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20  iBase.    ){.   
c610: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
c620: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
c630: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c640: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c650: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  );.      if( ALW
c660: 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d  AYS(pColl) && 0=
c670: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
c680: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
c690: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
c6a0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
c6b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
c6c0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
c6d0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
c6e0: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65  f the DISTINCT e
c6f0: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
c700: 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69  assed as the thi
c710: 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  rd argument.** i
c720: 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a  s redundant..**.
c730: 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69  ** A DISTINCT li
c740: 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20  st is redundant 
c750: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
c760: 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73 75  contains some su
c770: 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d  bset of.** colum
c780: 6e 73 20 74 68 61 74 20 61 72 65 20 75 6e 69 71  ns that are uniq
c790: 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e  ue and non-null.
c7a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
c7b0: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
c7c0: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
c7d0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
c7e0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c7f0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
c800: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
c810: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
c820: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
c830: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
c840: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
c850: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
c860: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
c870: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
c880: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
c890: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
c8a0: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
c8b0: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
c8c0: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
c8f0: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
c900: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
c910: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
c920: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
c930: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
c940: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
c950: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
c960: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
c970: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
c980: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
c990: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
c9a0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
c9b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
c9c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
c9d0: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
c9e0: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
c9f0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
ca00: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
ca10: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
ca20: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
ca30: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
ca40: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
ca50: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
ca60: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
ca70: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
ca80: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
ca90: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
caa0: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
cab0: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
cac0: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
cad0: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
cae0: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
caf0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
cb00: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
cb10: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
cb20: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
cb30: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
cb40: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
cb50: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
cb60: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
cb70: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
cb80: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
cb90: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
cba0: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
cbb0: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
cbc0: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
cbd0: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
cbe0: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
cbf0: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
cc00: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
cc10: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
cc20: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
cc30: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
cc40: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
cc50: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
cc60: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
cc70: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
cc80: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
cc90: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
cca0: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
ccb0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
ccc0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
ccd0: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
cce0: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
ccf0: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
cd00: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
cd10: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
cd20: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
cd30: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
cd40: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
cd50: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
cd60: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
cd70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
cd80: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
cd90: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
cda0: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
cdb0: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
cdc0: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
cdd0: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
cde0: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
cdf0: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
ce00: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
ce10: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
ce20: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
ce30: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
ce40: 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
ce50: 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f  or==OE_None ) co
ce60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
ce70: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
ce80: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
ce90: 20 20 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64    i16 iCol = pId
cea0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
ceb0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e        if( 0==fin
cec0: 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65  dTerm(pWC, iBase
ced0: 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73  , iCol, ~(Bitmas
cee0: 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  k)0, WO_EQ, pIdx
cef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
cf00: 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49   iIdxCol = findI
cf10: 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20  ndexCol(pParse, 
cf20: 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65  pDistinct, iBase
cf30: 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20  , pIdx, i);.    
cf40: 20 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c      if( iIdxCol<
cf50: 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 || pTab->aCol[
cf60: 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  iCol].notNull==0
cf70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
cf80: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
cf90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cfa0: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
cfb0: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
cfc0: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
cfd0: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
cfe0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
cff0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
d000: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
d010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
d020: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
d030: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
d040: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
d050: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
d060: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
d070: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
d080: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 4c 6f 67  LogEst N){.  Log
d090: 45 73 74 20 78 20 3d 20 73 71 6c 69 74 65 33 4c  Est x = sqlite3L
d0a0: 6f 67 45 73 74 28 4e 29 3b 0a 20 20 72 65 74 75  ogEst(N);.  retu
d0b0: 72 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33  rn x>33 ? x - 33
d0c0: 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   : 0;.}../*.** T
d0d0: 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
d0e0: 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
d0f0: 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
d100: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
d110: 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
d120: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
d130: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
d140: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
d150: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
d160: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
d170: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
d180: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
d190: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
d1a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
d1b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
d1c0: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
d1d0: 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
d1e0: 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69  BLED).static voi
d1f0: 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
d200: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
d210: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
d220: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
d230: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
d240: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
d250: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
d260: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
d270: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d280: 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
d290: 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
d2a0: 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
d2b0: 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
d2c0: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
d2d0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
d2e0: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
d2f0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
d300: 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
d310: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d320: 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
d330: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d340: 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
d350: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d360: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
d370: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
d380: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
d390: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
d3a0: 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
d3b0: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
d3c0: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
d3d0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
d3e0: 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
d3f0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
d400: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
d410: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
d420: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
d430: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
d440: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
d450: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
d460: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
d470: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
d480: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d490: 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
d4a0: 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
d4b0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
d4c0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
d4d0: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
d4e0: 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
d4f0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
d500: 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
d510: 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
d520: 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
d530: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
d540: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
d550: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
d560: 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
d570: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
d580: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
d590: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
d5a0: 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
d5b0: 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
d5c0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d5d0: 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
d5e0: 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
d5f0: 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69  tedCost);.  sqli
d600: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d610: 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d    estimatedRows=
d620: 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  %lld\n", p->esti
d630: 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65  matedRows);.}.#e
d640: 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43  lse.#define TRAC
d650: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a  E_IDX_INPUTS(A).
d660: 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
d670: 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e  X_OUTPUTS(A).#en
d680: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
d690: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
d6a0: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52  IC_INDEX./*.** R
d6b0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
d6c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
d6d0: 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20  erm pTerm is of 
d6e0: 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a  a form where it.
d6f0: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64  ** could be used
d700: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74   with an index t
d710: 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61  o access pSrc, a
d720: 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f  ssuming an appro
d730: 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20  priate.** index 
d740: 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  existed..*/.stat
d750: 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72  ic int termCanDr
d760: 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  iveIndex(.  Wher
d770: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
d780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
d790: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
d7a0: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74  to check */.  st
d7b0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
d7c0: 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  m *pSrc,     /* 
d7d0: 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79  Table we are try
d7e0: 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f  ing to access */
d7f0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
d800: 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ady             
d810: 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f    /* Tables in o
d820: 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68  uter loops of th
d830: 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63  e join */.){.  c
d840: 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70  har aff;.  if( p
d850: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
d860: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
d870: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d880: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
d890: 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20  tor & WO_EQ)==0 
d8a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d8b0: 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
d8c0: 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
d8d0: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
d8e0: 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e  .  if( pTerm->u.
d8f0: 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  leftColumn<0 ) r
d900: 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d  eturn 0;.  aff =
d910: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
d920: 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  l[pTerm->u.leftC
d930: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
d940: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
d950: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
d960: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66  Term->pExpr, aff
d970: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
d980: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
d990: 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
d9a0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
d9b0: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47  IC_INDEX./*.** G
d9c0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
d9d0: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  construct the In
d9e0: 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  dex object for a
d9f0: 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
da00: 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20  x.** and to set 
da10: 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65  up the WhereLeve
da20: 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20  l object pLevel 
da30: 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  so that the code
da40: 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61   generator.** ma
da50: 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61  kes use of the a
da60: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a  utomatic index..
da70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
da80: 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
da90: 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
daa0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
dab0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
dac0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
dad0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
dae0: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
daf0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
db00: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
db10: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
db20: 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
db30: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65  lause term to ge
db40: 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  t the next index
db50: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
db60: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
db70: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
db80: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
db90: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
dba0: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
dbb0: 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  vel          /* 
dbc0: 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20  Write new index 
dbd0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
dbe0: 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
dbf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
dc00: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
dc10: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
dc20: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
dc30: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
dc40: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
dc50: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
dc60: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
dc70: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
dc80: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
dc90: 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
dca0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
dcb0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
dcc0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63    /* Object desc
dcd0: 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73  ribing the trans
dce0: 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
dcf0: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
dd10: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
dd20: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
dd30: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
dd40: 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
dd50: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
dd60: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
dd70: 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
dd80: 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
dd90: 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
dda0: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
ddb0: 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
ddc0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
ddf0: 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f  dex fill loop */
de00: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
de10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
de20: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
de30: 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f  ng an index reco
de40: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  rd */.  int n;  
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f      /* Column co
de70: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
de80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de90: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
dea0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
deb0: 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20  mxBitCol;       
dec0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
ded0: 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72  um column in pSr
dee0: 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20  c->colUsed */.  
def0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
df00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
df10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
df20: 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  e to on a column
df30: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
df40: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
df50: 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62    /* The Loop ob
df60: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
df70: 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20  zNotUsed;       
df80: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
df90: 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20  pace on the end 
dfa0: 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74  of pIdx */.  Bit
dfb0: 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20  mask idxCols;   
dfc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
dfd0: 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73  ap of columns us
dfe0: 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  ed for indexing 
dff0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
e000: 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  raCols;         
e010: 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64   /* Bitmap of ad
e020: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
e030: 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72   */.  u8 sentWar
e040: 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  ning = 0;       
e050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77    /* True if a w
e060: 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e  arnning has been
e070: 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a   issued */..  /*
e080: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
e090: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
e0a0: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
e0b0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
e0c0: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
e0d0: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
e0e0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
e0f0: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
e100: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
e110: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
e120: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
e130: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
e140: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
e150: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
e160: 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  ge(v);..  /* Cou
e170: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
e180: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
e190: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
e1a0: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
e1b0: 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
e1c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
e1d0: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b  straints */.  nK
e1e0: 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  eyCol = 0;.  pTa
e1f0: 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
e200: 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
e210: 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
e220: 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
e230: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64  el->pWLoop;.  id
e240: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
e250: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
e260: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
e270: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
e280: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
e290: 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
e2a0: 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
e2b0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
e2c0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
e2d0: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
e2e0: 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
e2f0: 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   ? MASKBIT(BMS-1
e300: 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c  ) : MASKBIT(iCol
e310: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e320: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
e330: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e340: 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
e350: 20 20 20 20 20 69 66 28 20 21 73 65 6e 74 57 61       if( !sentWa
e360: 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  rning ){.       
e370: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
e380: 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f  ITE_WARNING_AUTO
e390: 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20  INDEX,.         
e3a0: 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e     "automatic in
e3b0: 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20  dex on %s(%s)", 
e3c0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20  pTable->zName,. 
e3d0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 6c             pTabl
e3e0: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  e->aCol[iCol].zN
e3f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65  ame);.        se
e400: 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20  ntWarning = 1;. 
e410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e420: 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73   (idxCols & cMas
e430: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
e440: 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
e450: 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  size(pParse->db,
e460: 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b   pLoop, nKeyCol+
e470: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  1) ) return;.   
e480: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65       pLoop->aLTe
e490: 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20  rm[nKeyCol++] = 
e4a0: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
e4b0: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
e4c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e4d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65   }.  assert( nKe
e4e0: 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f  yCol>0 );.  pLoo
e4f0: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
e500: 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
e510: 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f   nKeyCol;.  pLoo
e520: 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
e530: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57  RE_COLUMN_EQ | W
e540: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
e550: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20  WHERE_INDEXED.  
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f     | WHERE_AUTO_
e580: 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75  INDEX;..  /* Cou
e590: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
e5a0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
e5b0: 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72  mns needed to cr
e5c0: 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65  eate a.  ** cove
e5d0: 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22  ring index.  A "
e5e0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20  covering index" 
e5f0: 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
e600: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20   contains all.  
e610: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ** columns that 
e620: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
e630: 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61  e query.  With a
e640: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c   covering index,
e650: 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
e660: 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e  al table never n
e670: 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73  eeds to be acces
e680: 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20  sed.  Automatic 
e690: 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a  indices must.  *
e6a0: 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20  * be a covering 
e6b0: 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68  index because th
e6c0: 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74  e index will not
e6d0: 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74   be updated if t
e6e0: 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
e6f0: 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61   table changes a
e700: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  nd the index and
e710: 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f   table cannot bo
e720: 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20  th be used.  ** 
e730: 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f  if they go out o
e740: 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65  f sync..  */.  e
e750: 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d  xtraCols = pSrc-
e760: 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78  >colUsed & (~idx
e770: 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42  Cols | MASKBIT(B
e780: 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43  MS-1));.  mxBitC
e790: 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43  ol = (pTable->nC
e7a0: 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42  ol >= BMS-1) ? B
e7b0: 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e  MS-1 : pTable->n
e7c0: 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Col;.  testcase(
e7d0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
e7e0: 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
e7f0: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
e800: 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
e810: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
e820: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
e830: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
e840: 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c  BIT(i) ) nKeyCol
e850: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
e860: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
e870: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
e880: 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70      nKeyCol += p
e890: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
e8a0: 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f  S + 1;.  }.  pLo
e8b0: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
e8c0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
e8d0: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
e8e0: 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
e8f0: 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
e900: 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
e910: 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49  is index */.  pI
e920: 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f  dx = sqlite3Allo
e930: 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
e940: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79  pParse->db, nKey
e950: 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55  Col+1, 0, &zNotU
e960: 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78  sed);.  if( pIdx
e970: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e980: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
e990: 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
e9a0: 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61  pIdx->zName = "a
e9b0: 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49  uto-index";.  pI
e9c0: 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
e9d0: 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
e9e0: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
e9f0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
ea00: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
ea10: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
ea20: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
ea30: 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
ea40: 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
ea50: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
ea60: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
ea70: 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
ea80: 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
ea90: 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
eaa0: 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
eab0: 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
eac0: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
ead0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
eae0: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
eaf0: 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
eb00: 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
eb10: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
eb20: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
eb30: 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  pr;.        idxC
eb40: 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
eb50: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
eb60: 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d  lumn[n] = pTerm-
eb70: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
eb80: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
eb90: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
eba0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
ebb0: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
ebc0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
ebd0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
ebe0: 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
ebf0: 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
ec00: 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
ec10: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
ec20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
ec30: 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
ec40: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
ec50: 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
ec60: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
ec70: 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
ec80: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
ec90: 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
eca0: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
ecb0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
ecc0: 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
ecd0: 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
ece0: 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
ecf0: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
ed00: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
ed10: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
ed20: 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
ed30: 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
ed40: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
ed50: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
ed60: 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
ed70: 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
ed80: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
ed90: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
eda0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
edb0: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
edc0: 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
edd0: 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
ede0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
edf0: 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b  t( n==nKeyCol );
ee00: 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
ee10: 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49 64  n[n] = -1;.  pId
ee20: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
ee30: 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20 43  BINARY";..  /* C
ee40: 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
ee50: 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61  tic index */.  a
ee60: 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
ee70: 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70  IdxCur>=0 );.  p
ee80: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
ee90: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
eea0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
eeb0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp2(v, OP_OpenA
eec0: 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
eed0: 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79 43  ->iIdxCur, nKeyC
eee0: 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ol+1);.  sqlite3
eef0: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
ef00: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
ef10: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
ef20: 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62  , "for %s", pTab
ef30: 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  le->zName));..  
ef40: 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f  /* Fill the auto
ef50: 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68  matic index with
ef60: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64   content */.  ad
ef70: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
ef80: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ef90: 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e  Rewind, pLevel->
efa0: 69 54 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f  iTabCur); VdbeCo
efb0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67  verage(v);.  reg
efc0: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
efd0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
efe0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  e);.  sqlite3Gen
eff0: 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
f000: 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
f010: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
f020: 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c  Record, 0, 0, 0,
f030: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
f040: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f050: 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
f060: 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
f070: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
f080: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
f090: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
f0a0: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
f0b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f0c0: 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
f0d0: 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
f0e0: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
f0f0: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
f100: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
f110: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f120: 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71  AUTOINDEX);.  sq
f130: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f140: 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
f150: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f160: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f170: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20  egRecord);.  .  
f180: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
f190: 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
f1a0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
f1b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
f1c0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
f1d0: 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  it);.}.#endif /*
f1e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f1f0: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
f200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f210: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
f220: 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
f230: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
f240: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
f250: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
f260: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
f270: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
f280: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
f290: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
f2a0: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
f2b0: 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
f2c0: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
f2d0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
f2e0: 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
f2f0: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
f300: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f310: 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
f320: 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
f330: 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
f340: 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72  ause *pWC,.  str
f350: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
f360: 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69   *pSrc,.  ExprLi
f370: 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a  st *pOrderBy.){.
f380: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
f390: 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
f3a0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
f3b0: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
f3c0: 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
f3d0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
f3e0: 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
f3f0: 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
f400: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
f410: 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
f420: 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
f430: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
f440: 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
f450: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
f460: 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f  dxInfo;..  /* Co
f470: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
f480: 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
f490: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
f4a0: 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
f4b0: 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75  ** to this virtu
f4c0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  al table */.  fo
f4d0: 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
f4e0: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
f4f0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
f500: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
f510: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
f520: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
f530: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
f540: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
f550: 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
f560: 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
f570: 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
f580: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
f590: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
f5a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
f5b0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
f5c0: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
f5d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
f5e0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f5f0: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
f600: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
f610: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e  rator & ~(WO_ISN
f620: 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 29 29 3d 3d  ULL|WO_EQUIV))==
f630: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
f640: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
f650: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
f660: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
f670: 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    nTerm++;.  }..
f680: 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
f690: 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
f6a0: 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
f6b0: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
f6c0: 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74   .  ** virtual t
f6d0: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
f6e0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
f6f0: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
f700: 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
f710: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
f720: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ructure..  */.  
f730: 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
f740: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
f750: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64      int n = pOrd
f760: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
f770: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
f780: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
f790: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
f7a0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
f7b0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
f7c0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
f7d0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
f7e0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
f7f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f800: 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20   if( i==n){.    
f810: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a    nOrderBy = n;.
f820: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f830: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
f840: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f850: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
f860: 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
f870: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
f880: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
f890: 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
f8c0: 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
f8d0: 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
f8e0: 2a 28 69 36 34 29 6e 54 65 72 6d 0a 20 20 20 20  *(i64)nTerm.    
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f900: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
f910: 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 28 69  *pIdxOrderBy)*(i
f920: 36 34 29 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  64)nOrderBy );. 
f930: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
f940: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f950: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f960: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
f970: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f980: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
f990: 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
f9a0: 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
f9b0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
f9c0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
f9d0: 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
f9e0: 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
f9f0: 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
fa00: 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
fa10: 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69  from.  ** changi
fa20: 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
fa30: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
fa40: 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
fa50: 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  der to.  ** init
fa60: 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
fa70: 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  lds..  */.  pIdx
fa80: 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
fa90: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
faa0: 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
fab0: 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64  fo[1];.  pIdxOrd
fac0: 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
fad0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
fae0: 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
faf0: 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65  nTerm];.  pUsage
fb00: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
fb10: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
fb20: 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
fb30: 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
fb40: 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  ];.  *(int*)&pId
fb50: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
fb60: 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28  nt = nTerm;.  *(
fb70: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
fb80: 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
fb90: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
fba0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fbb0: 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
fbc0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
fbd0: 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
fbe0: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
fbf0: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
fc00: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
fc10: 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
fc20: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
fc30: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
fc40: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
fc50: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
fc60: 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28   pUsage;..  for(
fcc0: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
fcd0: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
fce0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
fcf0: 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20  {.    u8 op;.   
fd00: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
fd10: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
fd20: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
fd30: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
fd40: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
fd50: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fd60: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
fd70: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
fd80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
fd90: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
fda0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
fdb0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
fdc0: 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
fdd0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
fde0: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b  ator & WO_ALL );
fdf0: 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
fe00: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57  >eOperator & ~(W
fe10: 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49  O_ISNULL|WO_EQUI
fe20: 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  V))==0 ) continu
fe30: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
fe40: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
fe50: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
fe60: 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  e;.    pIdxCons[
fe70: 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
fe80: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
fe90: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
fea0: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
feb0: 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29  i;.    op = (u8)
fec0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fed0: 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69   & WO_ALL;.    i
fee0: 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f  f( op==WO_IN ) o
fef0: 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70  p = WO_EQ;.    p
ff00: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
ff10: 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  op;.    /* The d
ff20: 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74  irect assignment
ff30: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
ff40: 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c   line is possibl
ff50: 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20  e only because. 
ff60: 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e     ** the WO_ an
ff70: 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  d SQLITE_INDEX_C
ff80: 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73  ONSTRAINT_ codes
ff90: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
ffa0: 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
ffb0: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
ffc0: 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
ffd0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  */.    assert( W
ffe0: 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_EQ==SQLITE_IND
fff0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
10000 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10010 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LT==SQLITE_IN
10020 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
10030 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
10040 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_LE==SQLITE_I
10050 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10060 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
10070 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_GT==SQLITE_
10080 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10090 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GT );.    asser
100a0 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45  t( WO_GE==SQLITE
100b0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
100c0 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GE );.    asse
100d0 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51  rt( WO_MATCH==SQ
100e0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
100f0 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20  RAINT_MATCH );. 
10100 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
10110 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
10120 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54  O_IN|WO_EQ|WO_LT
10130 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
10140 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a  GE|WO_MATCH) );.
10150 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
10160 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
10170 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
10180 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
10190 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
101a0 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
101b0 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
101c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
101d0 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
101e0 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
101f0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
10200 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
10210 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a   pIdxInfo;.}../*
10220 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62  .** The table ob
10230 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70  ject reference p
10240 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
10250 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
10260 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
10270 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20   must represent 
10280 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
10290 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
102a0 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74  nvokes the xBest
102b0 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f  Index().** metho
102c0 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
102d0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
102e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
102f0 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  fo object that.*
10300 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68  * comes in as th
10310 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74  e 3rd argument t
10320 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
10330 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
10340 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73  or occurs, pPars
10350 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  e is populated w
10360 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ith an error mes
10370 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f  sage and a.** no
10380 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
10390 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
103a0 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
103b0 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
103c0 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  t.** part of the
103d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
103e0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
103f0 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e   left populated.
10400 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
10410 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  r not an error i
10420 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69  s returned, it i
10430 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
10440 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
10450 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
10460 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53  lly free p->idxS
10470 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46  tr if p->needToF
10480 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61  reeIdxStr indica
10490 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  tes.** that this
104a0 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
104b0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
104c0 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20  BestIndex(Parse 
104d0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
104e0 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pTab, sqlite3_in
104f0 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
10500 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
10510 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
10520 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
10530 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  b, pTab)->pVtab;
10540 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
10550 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58  rc;..  TRACE_IDX
10560 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63  _INPUTS(p);.  rc
10570 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
10580 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56  e->xBestIndex(pV
10590 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45  tab, p);.  TRACE
105a0 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b  _IDX_OUTPUTS(p);
105b0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
105c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
105d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
105e0 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  M ){.      pPars
105f0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
10600 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
10610 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a  se if( !pVtab->z
10620 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
10630 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10640 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71  pParse, "%s", sq
10650 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
10660 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10670 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10680 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
10690 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
106a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
106b0 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
106c0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
106d0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
106e0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
106f0 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
10700 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
10710 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
10720 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
10730 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
10740 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
10750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10760 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
10770 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
10780 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
10790 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
107a0 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
107b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
107c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61   }..  return pPa
107d0 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e  rse->nErr;.}.#en
107e0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
107f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10800 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23  UALTABLE) */...#
10810 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10820 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
10830 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
10840 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
10850 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
10860 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
10870 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
10880 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
10890 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
108a0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
108b0 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
108c0 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
108d0 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
108e0 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Val.**    aStat[
108f0 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
10900 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
10910 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20  l to pVal.**.** 
10920 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
10930 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
10940 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
10950 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72  eKeyStats(.  Par
10960 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
10970 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10980 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
10990 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
109a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
109b0 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e   /* Index to con
109c0 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20  sider domain of 
109d0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
109e0 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20  ord *pRec,      
109f0 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61   /* Vector of va
10a00 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  lues to consider
10a10 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55   */.  int roundU
10a20 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
10a30 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66    /* Round up if
10a40 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f   true.  Round do
10a50 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20  wn if false */. 
10a60 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20   tRowcnt *aStat 
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a80 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74  OUT: stats writt
10a90 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  en here */.){.  
10aa0 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
10ab0 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
10ac0 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  mple;.  int iCol
10ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10ae0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
10af0 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69  required stats i
10b00 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f  n anEq[] etc. */
10b10 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b  .  int iMin = 0;
10b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10b30 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
10b40 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64  e not yet tested
10b50 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 49   */.  int i = pI
10b60 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20  dx->nSample;    
10b70 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
10b80 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  mple larger than
10b90 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
10ba0 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74  c */.  int iTest
10bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10bc0 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c     /* Next sampl
10bd0 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69  e to test */.  i
10be0 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
10bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10c00 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
10c10 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
10c20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10c30 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
10c40 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65  ARAMETER( pParse
10c50 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
10c60 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a  ert( pRec!=0 );.
10c70 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e    iCol = pRec->n
10c80 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73 73  Field - 1;.  ass
10c90 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
10ca0 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
10cb0 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30  ( pRec->nField>0
10cc0 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e   && iCol<pIdx->n
10cd0 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20 64  SampleCol );.  d
10ce0 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28  o{.    iTest = (
10cf0 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20 72  iMin+i)/2;.    r
10d00 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
10d10 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
10d20 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c 20  ample[iTest].n, 
10d30 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 70  aSample[iTest].p
10d40 2c 20 70 52 65 63 2c 20 30 29 3b 0a 20 20 20 20  , pRec, 0);.    
10d50 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
10d60 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b     iMin = iTest+
10d70 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
10d80 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b 0a 20      i = iTest;. 
10d90 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
10da0 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29 3b 0a  es && iMin<i );.
10db0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
10dc0 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f  EBUG.  /* The fo
10dd0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
10de0 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20  tatements check 
10df0 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20  that the binary 
10e00 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a  search code.  **
10e10 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65   above found the
10e20 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54   right answer. T
10e30 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
10e40 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65   no purpose othe
10e50 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69  r.  ** than to i
10e60 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74  nvoke the assert
10e70 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73  s.  */.  if( res
10e80 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
10e90 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75   (res==0) is tru
10ea0 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65 20 24  e, then sample $
10eb0 69 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c 20  i must be equal 
10ec0 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20 20 61  to pRec */.    a
10ed0 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e  ssert( i<pIdx->n
10ee0 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 73  Sample );.    as
10ef0 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
10f00 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
10f10 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
10f20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
10f30 65 63 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20  ec, 0).         
10f40 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
10f50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
10f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
10f70 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20 6d  therwise, pRec m
10f80 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  ust be smaller t
10f90 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61 6e  han sample $i an
10fa0 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20  d larger than.  
10fb0 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69 2d    ** sample ($i-
10fc0 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  1).  */.    asse
10fd0 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61  rt( i==pIdx->nSa
10fe0 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 7c  mple .         |
10ff0 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
11000 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
11010 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
11020 5b 69 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29 3e  [i].p, pRec, 0)>
11030 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50  0.         || pP
11040 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
11050 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
11060 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20  sert( i==0.     
11070 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64      || sqlite3Vd
11080 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
11090 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20  aSample[i-1].n, 
110a0 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20  aSample[i-1].p, 
110b0 70 52 65 63 2c 20 30 29 3c 30 0a 20 20 20 20 20  pRec, 0)<0.     
110c0 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
110d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
110e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
110f0 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45   ifdef SQLITE_DE
11100 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20  BUG */..  /* At 
11110 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d  this point, aSam
11120 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69  ple[i] is the fi
11130 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20  rst sample that 
11140 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  is greater than.
11150 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f    ** or equal to
11160 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d   pVal.  Or if i=
11170 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20  =pIdx->nSample, 
11180 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  then all samples
11190 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74   are less.  ** t
111a0 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53  han pVal.  If aS
111b0 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20  ample[i]==pVal, 
111c0 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20 2a  then res==0..  *
111d0 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  /.  if( res==0 )
111e0 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  {.    aStat[0] =
111f0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
11200 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
11210 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
11220 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
11230 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63  }else{.    tRowc
11240 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65  nt iLower, iUppe
11250 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28  r, iGap;.    if(
11260 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69   i==0 ){.      i
11270 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
11280 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
11290 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[0].anLt[iCol];
112a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
112b0 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71    i64 nRow0 = sq
112c0 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
112d0 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  (pIdx->aiRowLogE
112e0 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 55  st[0]);.      iU
112f0 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e  pper = i>=pIdx->
11300 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f 77 30 20  nSample ? nRow0 
11310 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  : aSample[i].anL
11320 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  t[iCol];.      i
11330 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
11340 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20  i-1].anEq[iCol] 
11350 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61  + aSample[i-1].a
11360 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  nLt[iCol];.    }
11370 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
11380 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 69  (pIdx->nKeyCol>i
11390 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41 76 67  Col ? pIdx->aAvg
113a0 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b 0a 20  Eq[iCol] : 1);. 
113b0 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
113c0 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
113d0 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Gap = 0;.    }el
113e0 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
113f0 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
11400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11410 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
11420 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
11430 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
11440 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
11450 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
11460 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
11470 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a 23 65  + iGap;.  }.}.#e
11480 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
11490 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
114a0 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  TAT4 */../*.** I
114b0 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
114c0 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65 72  , pTerm is a ter
114d0 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20  m that provides 
114e0 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  an upper or lowe
114f0 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20  r.** bound on a 
11500 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74 68  range scan. With
11510 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  out considering 
11520 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73 74  pTerm, it is est
11530 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74 20  imated .** that 
11540 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69  the scan will vi
11550 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54  sit nNew rows. T
11560 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11570 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  urns the number.
11580 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20  ** estimated to 
11590 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65 72  be visited after
115a0 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e   taking pTerm in
115b0 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a  to account..**.*
115c0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65 78  * If the user ex
115d0 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
115e0 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  ed a likelihood(
115f0 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  ) value for this
11600 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74   term,.** then t
11610 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
11620 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f  is the likelihoo
11630 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  d multiplied by 
11640 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
11650 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74 68   input rows. Oth
11660 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75 6e  erwise, this fun
11670 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
11680 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55  at an "IS NOT NU
11690 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20  LL" term.** has 
116a0 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20  a likelihood of 
116b0 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74  0.50, and any ot
116c0 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c  her term a likel
116d0 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a  ihood of 0.25..*
116e0 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20  /.static LogEst 
116f0 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
11700 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72  (WhereTerm *pTer
11710 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b  m, LogEst nNew){
11720 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d  .  LogEst nRet =
11730 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54 65   nNew;.  if( pTe
11740 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  rm ){.    if( pT
11750 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
11760 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20  0 ){.      nRet 
11770 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
11780 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  rob;.    }else i
11790 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  f( (pTerm->wtFla
117a0 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
117b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  ==0 ){.      nRe
117c0 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20  t -= 20;        
117d0 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69  assert( 20==sqli
117e0 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a  te3LogEst(4) );.
117f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11800 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nRet;.}../*.*
11810 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11820 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d  is used to estim
11830 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
11840 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
11850 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62   be visited.** b
11860 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e  y scanning an in
11870 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
11880 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72  of values. The r
11890 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e  ange may have an
118a0 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c   upper.** bound,
118b0 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20   a lower bound, 
118c0 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45  or both. The WHE
118d0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
118e0 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70  that set the upp
118f0 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20  er.** and lower 
11900 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65  bounds are repre
11910 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72  sented by pLower
11920 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
11930 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a  ectively. For.**
11940 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
11950 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20  ng that index p 
11960 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a  is on t1(a):.**.
11970 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
11980 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
11990 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20   a < ? ....**   
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f   |_____|   |____
119c0 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _|.**           
119d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
119e0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11a00 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a  Lower    pUpper.
11a10 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
11a20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20  of the upper or 
11a30 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e  lower bound is n
11a40 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
11a50 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20   NULL is passed 
11a60 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74  in.** place of t
11a70 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11a80 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
11a90 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28  * The value in (
11aa0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
11ab0 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20  u.btree.nEq) is 
11ac0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
11ad0 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e   index.** column
11ae0 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
11af0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
11b00 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
11b10 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
11b20 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f  f.** equality co
11b30 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69  nstraints optimi
11b40 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
11b50 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
11b60 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
11b70 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
11b80 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c   is on t1(a, b),
11b90 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
11ba0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
11bb0 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
11bc0 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
11bd0 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
11be0 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
11bf0 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68   set to 1 (as th
11c00 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
11c10 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73  ed column, b, is
11c20 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
11c30 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
11c40 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
11c50 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
11c60 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
11c70 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
11c80 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
11c90 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
11ca0 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  q is set to 0..*
11cb0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
11cc0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11cd0 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74  d, *pnOut is set
11ce0 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c   to the sqlite3L
11cf0 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a  ogEst() of the.*
11d00 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
11d10 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
11d20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64  scan is expected
11d30 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75   to visit withou
11d40 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e  t .** considerin
11d50 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  g the range cons
11d60 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20  traints. If nEq 
11d70 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 74 68  is 0, this is th
11d80 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
11d90 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
11da0 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  x. Assuming no e
11db0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e  rror occurs, *pn
11dc0 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20  Out is adjusted 
11dd0 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20  (reduced).** to 
11de0 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
11df0 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73  range contraints
11e00 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
11e10 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68  er..** .** In th
11e20 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
11e30 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a  ite_stat4 ANALYZ
11e40 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75  E data, or if su
11e50 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62  ch data cannot b
11e60 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68 20  e.** used, each 
11e70 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
11e80 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
11e90 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
11ea0 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
11eb0 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66 20  Hence a pair of 
11ec0 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f  constraints (x>?
11ed0 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65   AND x<?) reduce
11ee0 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e  s the expected n
11ef0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73  umber of.** rows
11f00 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61   visited by a fa
11f10 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73  ctor of 16..*/.s
11f20 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
11f30 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50  angeScanEst(.  P
11f40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11f50 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
11f60 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
11f70 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
11f80 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
11f90 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72  pBuilder,.  Wher
11fa0 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
11fb0 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
11fc0 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
11fd0 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
11fe0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
11ff0 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
12000 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
12010 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
12020 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
12030 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
12040 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20  ereLoop *pLoop  
12050 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65     /* Modify the
12060 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65   .nOut and maybe
12070 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f   .rRun fields */
12080 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
12090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
120a0 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f  nOut = pLoop->nO
120b0 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65  ut;.  LogEst nNe
120c0 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w;..#ifdef SQLIT
120d0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
120e0 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20  R_STAT4.  Index 
120f0 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
12100 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
12110 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
12120 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69  .btree.nEq;..  i
12130 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a  f( p->nSample>0.
12140 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69 6c     && nEq==pBuil
12150 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20  der->nRecValid. 
12160 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d    && nEq<p->nSam
12170 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74  pleCol.   && Opt
12180 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
12190 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
121a0 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b  ITE_Stat3) .  ){
121b0 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63  .    UnpackedRec
121c0 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
121d0 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
121e0 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
121f0 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 2f    u8 aff;..    /
12200 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65  * Variable iLowe
12210 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  r will be set to
12220 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66   the estimate of
12230 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12240 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  ows in .    ** t
12250 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
12260 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  e less than the 
12270 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
12280 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
12290 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72  The.    ** lower
122a0 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
122b0 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
122c0 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
122d0 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
122e0 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66   ** key-prefix f
122f0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71  ormed by the nEq
12300 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20   values matched 
12310 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20  against the nEq 
12320 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a  left-most.    **
12330 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
12340 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
12350 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
12360 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ower..    **.   
12370 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65   ** Or, if pLowe
12380 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20  r is NULL or $L 
12390 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
123a0 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63  ted from it (bec
123b0 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20 69  ause it.    ** i
123c0 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
123d0 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
123e0 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
123f0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
12400 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69  e.    ** range i
12410 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71  s $P. Due to a q
12420 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20  uirk in the way 
12430 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
12440 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20  works, even.    
12450 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69  ** if $L is avai
12460 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53  lable, whereKeyS
12470 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64  tats() is called
12480 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61   for both ($P) a
12490 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24  nd .    ** ($P:$
124a0 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
124b0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
124c0 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65  urned values use
124d0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
124e0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70   Similarly, iUpp
124f0 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20  er is to be set 
12500 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
12510 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
12520 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73   rows.    ** les
12530 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72  s than the upper
12540 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
12550 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65  nge query. Where
12560 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
12570 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
12580 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
12590 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
125a0 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
125b0 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
125c0 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20     ** of iUpper 
125d0 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66  are requested of
125e0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
125f0 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72   and the smaller
12600 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20   used..    */.  
12610 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
12620 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55  ;.    tRowcnt iU
12630 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e  pper;..    if( n
12640 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Eq==p->nKeyCol )
12650 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
12660 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
12670 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12680 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62     aff = p->pTab
12690 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
126a0 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e  lumn[nEq]].affin
126b0 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  ity;.    }.    /
126c0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77  * Determine iLow
126d0 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73  er and iUpper us
126e0 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a  ing ($P) only. *
126f0 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30  /.    if( nEq==0
12700 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
12710 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
12720 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  er = sqlite3LogE
12730 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
12740 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20  LogEst[0]);.    
12750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
12760 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20  Note: this call 
12770 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a  could be optimiz
12780 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20  ed away - since 
12790 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20  the same values 
127a0 6d 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 68  must .      ** h
127b0 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
127c0 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20  ed when testing 
127d0 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45  key $P in whereE
127e0 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20  qualScanEst().  
127f0 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b 65  */.      whereKe
12800 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
12810 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
12820 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
12830 30 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72  0];.      iUpper
12840 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
12850 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12860 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
12870 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
12880 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
12890 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
128a0 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
128b0 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128d0 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
128e0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
128f0 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
12900 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
12910 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
12920 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
12930 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f  ert( (pLower->eO
12940 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
12950 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_GE))!=0 );. 
12960 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12970 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
12980 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
12990 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
129a0 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
129b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
129c0 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
129d0 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
129e0 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68  iNew;.        wh
129f0 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
12a00 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
12a10 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77  a);.        iNew
12a20 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77   = a[0] + ((pLow
12a30 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
12a40 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a 20  WO_GT) ? a[1] : 
12a50 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
12a60 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c  iNew>iLower ) iL
12a70 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  ower = iNew;.   
12a80 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
12a90 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
12aa0 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
12ab0 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
12ac0 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20 75  Upper estimate u
12ad0 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f  sing ($P:$U). */
12ae0 0a 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20  .    if( pUpper 
12af0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  ){.      int bOk
12b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12b10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
12b20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74  value is extract
12b30 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f  ed from pExpr */
12b40 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
12b50 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
12b60 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
12b70 20 20 61 73 73 65 72 74 28 20 28 70 55 70 70 65    assert( (pUppe
12b80 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
12b90 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30  WO_LT|WO_LE))!=0
12ba0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
12bb0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
12bc0 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
12bd0 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
12be0 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b  , aff, nEq, &bOk
12bf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
12c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f  =SQLITE_OK && bO
12c10 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52 6f  k ){.        tRo
12c20 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
12c30 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
12c40 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
12c50 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 1, a);.       
12c60 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28   iNew = a[0] + (
12c70 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
12c80 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61 5b  or & WO_LE) ? a[
12c90 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
12ca0 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72   if( iNew<iUpper
12cb0 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77   ) iUpper = iNew
12cc0 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d  ;.        nOut--
12cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12ce0 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
12cf0 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
12d00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12d10 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
12d20 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a  Upper>iLower ){.
12d30 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73          nNew = s
12d40 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70  qlite3LogEst(iUp
12d50 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20  per - iLower);. 
12d60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12d70 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20      nNew = 10;  
12d80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
12d90 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
12da0 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2) );.      }.  
12db0 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75      if( nNew<nOu
12dc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75  t ){.        nOu
12dd0 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
12de0 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  }.      pLoop->n
12df0 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
12e00 75 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ut;.      WHERET
12e10 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e  RACE(0x10, ("ran
12e20 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ge scan regions:
12e30 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
12e40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
12e60 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
12e70 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
12e80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12e90 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
12ea0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
12eb0 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
12ec0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12ed0 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b  METER(pBuilder);
12ee0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
12ef0 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
12f00 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
12f10 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
12f20 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20  pper->wtFlags & 
12f30 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
12f40 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
12f50 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77  RangeAdjust(pLow
12f60 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65  er, nOut);.  nNe
12f70 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64  w = whereRangeAd
12f80 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65  just(pUpper, nNe
12f90 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  w);..  /* TUNING
12fa0 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  : If there is bo
12fb0 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
12fc0 6c 6f 77 65 72 20 6c 69 6d 69 74 2c 20 61 73 73  lower limit, ass
12fd0 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69 73  ume the range is
12fe0 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79  .  ** reduced by
12ff0 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37   an additional 7
13000 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  5%. This means t
13010 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c  hat, by default,
13020 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20   an open-ended. 
13030 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20   ** range query 
13040 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69  (e.g. col > ?) i
13050 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74  s assumed to mat
13060 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f  ch 1/4 of the ro
13070 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ws in the.  ** i
13080 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c  ndex. While a cl
13090 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e  osed range (e.g.
130a0 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41   col BETWEEN ? A
130b0 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74  ND ?) is estimat
130c0 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  ed to.  ** match
130d0 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64   1/64 of the ind
130e0 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c  ex. */ .  if( pL
130f0 6f 77 65 72 20 26 26 20 70 55 70 70 65 72 20 29  ower && pUpper )
13100 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 0a 20 20   nNew -= 20;..  
13110 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21  nOut -= (pLower!
13120 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30  =0) + (pUpper!=0
13130 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30  );.  if( nNew<10
13140 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20   ) nNew = 10;.  
13150 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20  if( nNew<nOut ) 
13160 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 70  nOut = nNew;.  p
13170 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
13180 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74  gEst)nOut;.  ret
13190 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
131a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
131b0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
131c0 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
131d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
131e0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
131f0 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
13200 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  ** an equality c
13210 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55  onstraint x=VALU
13220 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74  E and where that
13230 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e   VALUE occurs in
13240 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61  .** the histogra
13250 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e  m data.  This on
13260 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20  ly works when x 
13270 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  is the left-most
13280 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  .** column of an
13290 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74   index and sqlit
132a0 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61  e_stat3 histogra
132b0 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  m data is availa
132c0 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  ble.** for that 
132d0 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78  index.  When pEx
132e0 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  pr==NULL that me
132f0 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ans the constrai
13300 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e  nt is.** "x IS N
13310 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20  ULL" instead of 
13320 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a  "x=VALUE"..**.**
13330 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
13340 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
13350 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
13360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
13370 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
13380 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
13390 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
133a0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
133b0 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
133c0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
133d0 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
133e0 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
133f0 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
13400 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
13410 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
13420 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
13430 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
13440 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
13450 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
13460 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
13470 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
13480 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
13490 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
134a0 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
134b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
134c0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
134d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
134e0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
134f0 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
13500 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
13510 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
13520 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
13530 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
13540 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
13550 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e  ion for VALUE in
13560 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e   the x=VALUE con
13570 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f  straint */.  tRo
13580 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
13590 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
135a0 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
135b0 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
135c0 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
135d0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
135e0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
135f0 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72  t nEq = pBuilder
13600 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
13610 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  nEq;.  UnpackedR
13620 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
13630 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
13640 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
13650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13660 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
13670 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
13680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13690 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
136a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
136b0 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
136c0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
136d0 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b  ics */.  int bOk
136e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  ;..  assert( nEq
136f0 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
13700 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43 6f   nEq<=(p->nKeyCo
13710 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  l+1) );.  assert
13720 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
13730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
13740 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
13750 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d  ssert( pBuilder-
13760 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29  >nRecValid<nEq )
13770 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65  ;..  /* If value
13780 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  s are not availa
13790 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c  ble for all fiel
137a0 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ds of the index 
137b0 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a  to the left.  **
137c0 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f   of this one, no
137d0 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65   estimate can be
137e0 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51   made. Return SQ
137f0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a  LITE_NOTFOUND. *
13800 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
13810 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71  ->nRecValid<(nEq
13820 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
13830 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
13840 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  D;.  }..  /* Thi
13850 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
13860 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63  tion only. The c
13870 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74  all to sqlite3St
13880 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
13890 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f  ().  ** below wo
138a0 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  uld return the s
138b0 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20  ame value.  */. 
138c0 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65 79   if( nEq>p->nKey
138d0 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f  Col ){.    *pnRo
138e0 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
138f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13900 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61  ..  aff = p->pTa
13910 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
13920 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66  olumn[nEq-1]].af
13930 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73  finity;.  rc = s
13940 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
13950 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
13960 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
13970 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62  , aff, nEq-1, &b
13980 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  Ok);.  pBuilder-
13990 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
139a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
139b0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
139c0 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65   if( bOk==0 ) re
139d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
139e0 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72  OUND;.  pBuilder
139f0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45  ->nRecValid = nE
13a00 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74  q;..  whereKeySt
13a10 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
13a20 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48  Rec, 0, a);.  WH
13a30 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
13a40 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65  equality scan re
13a50 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69  gions: %d\n", (i
13a60 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e  nt)a[1]));.  *pn
13a70 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20  Row = a[1];.  . 
13a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
13a90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13aa0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
13ab0 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20  TAT4 */..#ifdef 
13ac0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
13ad0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
13ae0 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
13af0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
13b00 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
13b10 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
13b20 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
13b30 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  t where the righ
13b40 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
13b50 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
13b60 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76  * is a list of v
13b70 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  alues.  Example:
13b80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48  .**.**        WH
13b90 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c  ERE x IN (1,2,3,
13ba0 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  4).**.** Write t
13bb0 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
13bc0 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
13bd0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
13be0 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
13bf0 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
13c00 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
13c10 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
13c20 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
13c30 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
13c40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
13c50 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
13c60 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
13c70 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
13c80 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
13c90 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
13ca0 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
13cb0 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
13cc0 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
13cd0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
13ce0 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
13cf0 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
13d00 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
13d10 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
13d20 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
13d30 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63  ic int whereInSc
13d40 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
13d50 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
13d60 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
13d70 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
13d80 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
13d90 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
13da0 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  er,.  ExprList *
13db0 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  pList,     /* Th
13dc0 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20  e value list on 
13dd0 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e  the RHS of "x IN
13de0 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22   (v1,v2,v3,...)"
13df0 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
13e00 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
13e10 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
13e20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
13e30 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
13e40 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
13e50 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
13e60 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30  dex;.  i64 nRow0
13e70 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
13e80 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f  ToInt(p->aiRowLo
13e90 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20  gEst[0]);.  int 
13ea0 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
13eb0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
13ec0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13ed0 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75  TE_OK;     /* Su
13ee0 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
13ef0 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
13f00 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20  nt nEst;        
13f10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13f20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  rows for a singl
13f30 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77  e term */.  tRow
13f40 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b  cnt nRowEst = 0;
13f50 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d      /* New estim
13f60 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
13f70 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69  r of rows */.  i
13f80 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
13f90 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
13fa0 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
13fb0 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
13fc0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
13fd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13fe0 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
13ff0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74  ; i++){.    nEst
14000 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63   = nRow0;.    rc
14010 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
14020 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
14030 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b  ilder, pList->a[
14040 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29  i].pExpr, &nEst)
14050 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d  ;.    nRowEst +=
14060 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c   nEst;.    pBuil
14070 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
14080 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a   nRecValid;.  }.
14090 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
140a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
140b0 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20  nRowEst > nRow0 
140c0 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77  ) nRowEst = nRow
140d0 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  0;.    *pnRow = 
140e0 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45  nRowEst;.    WHE
140f0 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 49  RETRACE(0x10,("I
14100 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20  N row estimate: 
14110 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77 45  est=%g\n", nRowE
14120 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  st));.  }.  asse
14130 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
14140 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c  ecValid==nRecVal
14150 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  id );.  return r
14160 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
14170 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
14180 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
14190 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
141a0 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
141b0 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
141c0 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
141d0 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
141e0 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
141f0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
14200 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
14210 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
14220 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
14230 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
14240 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
14250 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
14260 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
14270 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
14280 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
14290 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
142a0 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
142b0 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
142c0 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
142d0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
142e0 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
142f0 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
14300 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
14310 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
14320 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
14330 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
14340 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
14350 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
14360 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
14370 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
14380 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
14390 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
143a0 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
143b0 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
143c0 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
143d0 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
143e0 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
143f0 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
14400 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
14410 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
14420 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
14430 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
14440 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
14450 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
14460 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
14470 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
14480 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
14490 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
144a0 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
144b0 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
144c0 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
144d0 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
144e0 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
144f0 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
14500 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
14510 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
14520 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
14530 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
14540 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
14550 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
14560 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
14570 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
14580 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
14590 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
145a0 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
145b0 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
145c0 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
145d0 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
145e0 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
145f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
14600 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
14610 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
14620 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
14630 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20  .  if( pTerm.   
14640 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
14650 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
14660 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
14670 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
14680 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
14690 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
146a0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
146b0 69 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28 70  in)).      && (p
146c0 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20  Level->notReady 
146d0 26 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  & pTerm->prereqA
146e0 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  ll)==0.  ){.    
146f0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
14700 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
14710 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61    if( pTerm->iPa
14720 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rent>=0 ){.     
14730 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
14740 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43  er = &pTerm->pWC
14750 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65  ->a[pTerm->iPare
14760 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nt];.      if( (
14770 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64  --pOther->nChild
14780 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
14790 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
147a0 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20  el, pOther);.   
147b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
147c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
147d0 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
147e0 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  de to apply the 
147f0 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
14800 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74  string zAff.** t
14810 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  o the n register
14820 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
14830 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e  se. .**.** As an
14840 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53   optimization, S
14850 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
14860 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72  ntries (which ar
14870 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65  e no-ops) at the
14880 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e  .** beginning an
14890 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72  d end of zAff ar
148a0 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61  e ignored.  If a
148b0 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41  ll entries in zA
148c0 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45  ff are.** SQLITE
148d0 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20  _AFF_NONE, then 
148e0 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e  no code gets gen
148f0 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  erated..**.** Th
14900 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
14910 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
14920 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68   zAff so that th
14930 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65  e caller is free
14940 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41  .** to modify zA
14950 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ff after this ro
14960 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
14970 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
14980 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
14990 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
149a0 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
149b0 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56  char *zAff){.  V
149c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
149d0 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41  >pVdbe;.  if( zA
149e0 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ff==0 ){.    ass
149f0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
14a00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
14a10 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
14a20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
14a30 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20  );..  /* Adjust 
14a40 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b  base and n to sk
14a50 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41  ip over SQLITE_A
14a60 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
14a70 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
14a80 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66  .  ** and end of
14a90 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
14aa0 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ring..  */.  whi
14ab0 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b  le( n>0 && zAff[
14ac0 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  0]==SQLITE_AFF_N
14ad0 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
14ae0 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20      base++;.    
14af0 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  zAff++;.  }.  wh
14b00 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66  ile( n>1 && zAff
14b10 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  [n-1]==SQLITE_AF
14b20 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
14b30 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64  -;.  }..  /* Cod
14b40 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  e the OP_Affinit
14b50 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72  y opcode if ther
14b60 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65  e is anything le
14b70 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69  ft to do. */.  i
14b80 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  f( n>0 ){.    sq
14b90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14ba0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
14bb0 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71  base, n);.    sq
14bc0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14bd0 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e  4(v, -1, zAff, n
14be0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
14bf0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
14c00 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
14c10 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  se, n);.  }.}...
14c20 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14c30 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
14c40 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
14c50 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
14c60 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
14c70 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
14c80 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
14c90 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
14ca0 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
14cb0 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
14cc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
14cd0 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
14ce0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
14cf0 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
14d00 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   iReg..**.** For
14d10 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
14d20 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
14d30 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
14d40 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
14d50 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
14d60 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
14d70 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
14d80 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
14d90 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
14da0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
14db0 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
14dc0 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
14dd0 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
14de0 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
14df0 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
14e00 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
14e10 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
14e20 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
14e30 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
14e40 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
14e50 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
14e60 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
14e70 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
14e80 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
14e90 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20  /* The level of 
14ea0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
14eb0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
14ec0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20  n */.  int iEq, 
14ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14ee0 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c  dex of the equal
14ef0 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ity term within 
14f00 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  this level */.  
14f10 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
14f20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
14f30 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49 4e  reverse-order IN
14f40 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20   operations */. 
14f50 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20   int iTarget    
14f60 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
14f70 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73  to leave results
14f80 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
14f90 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  r */.){.  Expr *
14fa0 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
14fb0 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  r;.  Vdbe *v = p
14fc0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
14fd0 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20  int iReg;       
14fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14ff0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
15000 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73  esults */..  ass
15010 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29  ert( iTarget>0 )
15020 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  ;.  if( pX->op==
15030 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65  TK_EQ ){.    iRe
15040 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
15050 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
15060 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pX->pRight, iT
15070 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20  arget);.  }else 
15080 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  if( pX->op==TK_I
15090 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65  SNULL ){.    iRe
150a0 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20  g = iTarget;.   
150b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
150c0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
150d0 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66  , iReg);.#ifndef
150e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
150f0 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20  QUERY.  }else{. 
15100 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20     int eType;.  
15110 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20    int iTab;.    
15120 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
15130 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f  In;.    WhereLoo
15140 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  p *pLoop = pLeve
15150 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20  l->pWLoop;..    
15160 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
15170 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
15180 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20  UALTABLE)==0.   
15190 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62     && pLoop->u.b
151a0 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20  tree.pIndex!=0. 
151b0 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75       && pLoop->u
151c0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61  .btree.pIndex->a
151d0 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20  SortOrder[iEq]. 
151e0 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
151f0 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a  case( iEq==0 );.
15200 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15210 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
15220 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
15230 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58  }.    assert( pX
15240 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
15250 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
15260 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  t;.    eType = s
15270 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
15280 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29  x(pParse, pX, 0)
15290 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ;.    if( eType=
152a0 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
152b0 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74 65  DESC ){.      te
152c0 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
152d0 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
152e0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54  ev;.    }.    iT
152f0 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
15300 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15310 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
15320 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
15330 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
15340 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
15350 49 66 28 76 2c 20 62 52 65 76 29 3b 0a 20 20 20  If(v, bRev);.   
15360 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
15370 76 2c 20 21 62 52 65 76 29 3b 0a 20 20 20 20 61  v, !bRev);.    a
15380 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
15390 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
153a0 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20  ULTI_OR)==0 );. 
153b0 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
153c0 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42  s |= WHERE_IN_AB
153d0 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  LE;.    if( pLev
153e0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
153f0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
15400 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
15410 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15420 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
15430 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
15440 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
15450 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
15460 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
15470 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
15480 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
15490 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
154c0 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
154d0 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
154e0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
154f0 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
15500 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
15510 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
15520 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
15530 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
15540 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
15550 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
15560 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
15570 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
15580 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
15590 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
155a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
155b0 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
155c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
155d0 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
155e0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
155f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
15600 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
15610 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
15620 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f      pIn->eEndLoo
15630 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  pOp = bRev ? OP_
15640 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50 5f  PrevIfOpen : OP_
15650 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20 20  NextIfOpen;.    
15660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15670 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
15680 2c 20 69 52 65 67 29 3b 20 56 64 62 65 43 6f 76  , iReg); VdbeCov
15690 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65  erage(v);.    }e
156a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
156b0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
156c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
156d0 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
156e0 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
156f0 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
15700 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15710 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
15720 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
15730 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
15740 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
15750 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ex scan..**.** F
15760 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73  or example, cons
15770 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c  ider table t1(a,
15780 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20  b,c,d,e,f) with 
15790 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e  index i1(a,b,c).
157a0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20  .** Suppose the 
157b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
157c0 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20  this:  a==5 AND 
157d0 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44  b IN (1,2,3) AND
157e0 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a   c>5 AND c<10.**
157f0 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61   The index has a
15800 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20  s many as three 
15810 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
15820 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69  ints, but in thi
15830 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68  s.** example, th
15840 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75  e third "c" valu
15850 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  e is an inequali
15860 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f  ty.  So only two
15870 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73   .** constraints
15880 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69   are coded.  Thi
15890 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67  s routine will g
158a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
158b0 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35  evaluate.** a==5
158c0 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33   and b IN (1,2,3
158d0 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  ).  The current 
158e0 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64  values for a and
158f0 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65   b will be store
15900 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74  d.** in consecut
15910 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ive registers an
15920 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  d the index of t
15930 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
15940 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
15950 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
15960 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32  ple above nEq==2
15970 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72  .  But this subr
15980 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
15990 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   any value.** of
159a0 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30   nEq including 0
159b0 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68  .  If nEq==0, th
159c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
159d0 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  arly a no-op..**
159e0 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
159f0 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63  it does is alloc
15a00 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e  ate the pLevel->
15a10 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iMem memory cell
15a20 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20   and.** compute 
15a30 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
15a40 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
15a50 45 78 74 72 61 52 65 67 20 70 61 72 61 6d 65 74  ExtraReg paramet
15a60 65 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49  er is 0 or 1.  I
15a70 74 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57 48  t is 0 if all WH
15a80 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
15a90 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d 3d  raints.** are ==
15aa0 20 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20 63   or IN and are c
15ab0 6f 76 65 72 65 64 20 62 79 20 74 68 65 20 6e 45  overed by the nE
15ac0 71 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69 73  q.  nExtraReg is
15ad0 20 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a   1 if there is.*
15ae0 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  * an inequality 
15af0 63 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63 68  constraint (such
15b00 20 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41 4e   as the "c>=5 AN
15b10 44 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20 65  D c<10" in the e
15b20 78 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a 20  xample) that.** 
15b30 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65  occurs after the
15b40 20 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f 6e   nEq quality con
15b50 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  straints..**.** 
15b60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  This routine all
15b70 6f 63 61 74 65 73 20 61 20 72 61 6e 67 65 20 6f  ocates a range o
15b80 66 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67 20  f nEq+nExtraReg 
15b90 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64  memory cells and
15ba0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
15bb0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72  index of the fir
15bc0 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  st memory cell i
15bd0 6e 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54 68  n that range. Th
15be0 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63  e code that.** c
15bf0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
15c00 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20  e will use that 
15c10 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f 20  memory range to 
15c20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a 2a  store keys for.*
15c30 2a 20 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d  * start and term
15c40 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
15c50 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  ns of the loop..
15c60 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20  ** key value of 
15c70 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e  the loop.  If on
15c80 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65  e or more IN ope
15c90 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74  rators appear, t
15ca0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
15cb0 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ine allocates an
15cc0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20   additional nEq 
15cd0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
15ce0 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
15cf0 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
15d00 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66  eturning, *pzAff
15d10 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
15d20 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
15d30 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70  taining a.** cop
15d40 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  y of the column 
15d50 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
15d60 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c  of the index all
15d70 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ocated using.** 
15d80 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
15d90 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69  ). Except, entri
15da0 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f  es in the copy o
15db0 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73  f the string ass
15dc0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
15dd0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
15de0 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f  ints that use NO
15df0 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  NE affinity are 
15e00 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  set to.** SQLITE
15e10 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20  _AFF_NONE. This 
15e20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  is to deal with 
15e30 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20  SQL such as the 
15e40 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
15e50 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
15e60 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52  t1(a TEXT PRIMAR
15e70 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20  Y KEY, b);.**   
15e80 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
15e90 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45  t1 AS t2, t1 WHE
15ea0 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a  RE t1.a = t2.b;.
15eb0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
15ec0 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
15ed0 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68  index on t1(a) h
15ee0 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  as TEXT affinity
15ef0 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74  . But since.** t
15f00 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69  he right hand si
15f10 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  de of the equali
15f20 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74  ty constraint (t
15f30 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66  2.b) has NONE af
15f40 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
15f50 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
15f60 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
15f70 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
15f80 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
15f90 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
15fa0 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
15fb0 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
15fc0 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
15fd0 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
15fe0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
15ff0 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
16000 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
16010 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74  FF_NONE..*/.stat
16020 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
16030 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
16040 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16050 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
16060 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
16070 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
16080 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
16090 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
160a0 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
160b0 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  g */.  int bRev,
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
160d0 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65  Reverse the orde
160e0 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  r of IN operator
160f0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
16100 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
16110 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
16120 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
16130 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
16140 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
16150 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
16160 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
16170 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
16180 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20 20   u16 nEq;       
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
161a0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
161b0 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
161c0 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
161d0 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20 20    u16 nSkip;    
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 66  /* Number of lef
16200 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 74  t-most columns t
16210 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62 65  o skip */.  Vdbe
16220 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
16230 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
16240 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   vm under constr
16250 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
16260 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
16270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16280 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65   index being use
16290 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  d for this loop 
162a0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
162b0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
162c0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
162d0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
162e0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
162f0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
16300 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
16310 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
16320 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16340 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
16350 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
16380 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20   */.  int nReg; 
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
163b0 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
163c0 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
163d0 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20   *zAff;         
163e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
163f0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20  inity string to 
16400 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  return */..  /* 
16410 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f  This module is o
16420 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75  nly called on qu
16430 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75  ery plans that u
16440 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a  se an index. */.
16450 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
16460 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73 65  ->pWLoop;.  asse
16470 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
16480 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
16490 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
164a0 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75    nEq = pLoop->u
164b0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e 53  .btree.nEq;.  nS
164c0 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  kip = pLoop->u.b
164d0 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 70 49  tree.nSkip;.  pI
164e0 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
164f0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73  ree.pIndex;.  as
16500 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
16510 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16520 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
16530 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
16540 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
16550 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  te them..  */.  
16560 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
16570 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52  ->nMem + 1;.  nR
16580 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  eg = pLoop->u.bt
16590 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61  ree.nEq + nExtra
165a0 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  Reg;.  pParse->n
165b0 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20  Mem += nReg;..  
165c0 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  zAff = sqlite3Db
165d0 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
165e0 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  b, sqlite3IndexA
165f0 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49  ffinityStr(v, pI
16600 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66  dx));.  if( !zAf
16610 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  f ){.    pParse-
16620 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16630 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66  d = 1;.  }..  if
16640 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 69  ( nSkip ){.    i
16650 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
16660 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
16670 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16680 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f  Op1(v, (bRev?OP_
16690 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c  Last:OP_Rewind),
166a0 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56   iIdxCur);.    V
166b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
166c0 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56   bRev==0);.    V
166d0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
166e0 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 56   bRev!=0);.    V
166f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
16700 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20  begin skip-scan 
16710 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  on %s", pIdx->zN
16720 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73  ame));.    j = s
16730 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
16740 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
16750 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b    pLevel->addrSk
16760 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ip = sqlite3Vdbe
16770 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62 52  AddOp4Int(v, (bR
16780 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f  ev?OP_SeekLT:OP_
16790 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20 20  SeekGT),.       
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30 2c       iIdxCur, 0,
167c0 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70 29   regBase, nSkip)
167d0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
167e0 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29  geIf(v, bRev==0)
167f0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
16800 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
16810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16820 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b  eJumpHere(v, j);
16830 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
16840 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nSkip; j++){.   
16850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16860 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
16870 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20 72  n, iIdxCur, j, r
16880 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20  egBase+j);.     
16890 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
168a0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b  iColumn[j]>=0 );
168b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
168c0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
168d0 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
168e0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
168f0 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  ]].zName));.    
16900 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20  }.  }    ..  /* 
16910 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
16920 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
16930 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
16940 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74   zAff==0 || (int
16950 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e  )strlen(zAff)>=n
16960 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53  Eq );.  for(j=nS
16970 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  kip; j<nEq; j++)
16980 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20  {.    int r1;.  
16990 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
169a0 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
169b0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
169c0 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   );.    /* The f
169d0 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61 73  ollowing testcas
169e0 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 69 6e  e is true for in
169f0 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
16a00 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
16a10 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
16a20 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
16a30 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
16a40 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
16a50 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
16a60 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
16a70 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
16a80 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
16a90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
16aa0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
16ab0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
16ac0 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75      r1 = codeEqu
16ad0 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
16ae0 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
16af0 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73   j, bRev, regBas
16b00 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
16b10 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
16b20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
16b30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16b40 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16b50 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
16b60 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
16b70 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
16b80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
16b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16ba0 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
16bb0 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
16bc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16bd0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
16be0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
16bf0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
16c00 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
16c10 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
16c20 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
16c30 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
16c40 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
16c50 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ))==0 ){.      E
16c60 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
16c70 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
16c80 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ht;.      if( sq
16c90 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
16ca0 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ll(pRight) ){.  
16cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16cc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
16cd0 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c  Null, regBase+j,
16ce0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
16cf0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
16d00 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
16d10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 41    }.      if( zA
16d20 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
16d30 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
16d40 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
16d50 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
16d60 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
16d70 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
16d80 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
16d90 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
16da0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16db0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
16dc0 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
16dd0 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
16de0 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
16df0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
16e00 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
16e10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
16e20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
16e30 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
16e40 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
16e50 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
16e60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16e70 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20  ine is a helper 
16e80 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  for explainIndex
16e90 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a  Range() below.**
16ea0 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74  .** pStr holds t
16eb0 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78  he text of an ex
16ec0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65  pression that we
16ed0 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70   are building up
16ee0 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20   one term.** at 
16ef0 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f  a time.  This ro
16f00 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77  utine adds a new
16f10 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64   term to the end
16f20 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
16f30 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65  on..** Terms are
16f40 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e   separated by AN
16f50 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e  D so add the "AN
16f60 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f  D" text for seco
16f70 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
16f80 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e  t.** terms only.
16f90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16fa0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
16fb0 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  m(.  StrAccum *p
16fc0 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Str,            
16fd0 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70   /* The text exp
16fe0 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75  ression being bu
16ff0 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ilt */.  int iTe
17000 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
17010 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
17020 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72   this term.  Fir
17030 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20  st is zero */.  
17040 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
17050 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  umn,        /* N
17060 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
17070 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
17080 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20  r *zOp          
17090 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
170a0 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  e operator */.){
170b0 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73  .  if( iTerm ) s
170c0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
170d0 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
170e0 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65   ", 5);.  sqlite
170f0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
17100 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e  ll(pStr, zColumn
17110 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
17120 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
17130 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69   zOp, 1);.  sqli
17140 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
17150 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b  d(pStr, "?", 1);
17160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
17170 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69  nt pLevel descri
17180 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66  bes a strategy f
17190 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c  or scanning tabl
171a0 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a  e pTab. This .**
171b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
171c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
171d0 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63   string buffer c
171e0 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63  ontaining a desc
171f0 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ription.** of th
17200 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c  e subset of tabl
17210 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62  e rows scanned b
17220 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69  y the strategy i
17230 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e  n the form of an
17240 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69  .** SQL expressi
17250 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72  on. Or, if all r
17260 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c  ows are scanned,
17270 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
17280 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
17290 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
172a0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry:.**.**   SELE
172b0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
172c0 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a  RE a=1 AND b>2;.
172d0 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64  **.** is run and
172e0 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
172f0 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68  ex on (a, b), th
17300 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
17310 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74   returns a.** st
17320 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ring similar to:
17330 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e  .**.**   "a=? AN
17340 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65  D b>?".**.** The
17350 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
17360 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f  r points to memo
17370 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
17380 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
17390 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
173a0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
173b0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
173c0 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72   free the buffer
173d0 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e   when it is.** n
173e0 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
173f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
17400 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  r *explainIndexR
17410 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62  ange(sqlite3 *db
17420 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f  , WhereLoop *pLo
17430 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  op, Table *pTab)
17440 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
17450 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
17460 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31 36  ee.pIndex;.  u16
17470 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
17480 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31 36  btree.nEq;.  u16
17490 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e   nSkip = pLoop->
174a0 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20  u.btree.nSkip;. 
174b0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c   int i, j;.  Col
174c0 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62  umn *aCol = pTab
174d0 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61  ->aCol;.  i16 *a
174e0 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
174f0 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74  ->aiColumn;.  St
17500 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69  rAccum txt;..  i
17510 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c  f( nEq==0 && (pL
17520 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
17530 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
17540 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
17550 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
17560 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
17570 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
17580 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49  &txt, 0, 0, SQLI
17590 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a  TE_MAX_LENGTH);.
175a0 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20    txt.db = db;. 
175b0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
175c0 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28  Append(&txt, " (
175d0 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ", 2);.  for(i=0
175e0 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20  ; i<nEq; i++){. 
175f0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 69 3d     char *z = (i=
17600 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  =pIndex->nKeyCol
17610 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   ) ? "rowid" : a
17620 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Col[aiColumn[i]]
17630 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
17640 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  i>=nSkip ){.    
17650 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
17660 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20  erm(&txt, i, z, 
17670 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  "=");.    }else{
17680 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20 73  .      if( i ) s
17690 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
176a0 70 65 6e 64 28 26 74 78 74 2c 20 22 20 41 4e 44  pend(&txt, " AND
176b0 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73 71   ", 5);.      sq
176c0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
176d0 65 6e 64 28 26 74 78 74 2c 20 22 41 4e 59 28 22  end(&txt, "ANY("
176e0 2c 20 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 4);.      sqli
176f0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
17700 64 41 6c 6c 28 26 74 78 74 2c 20 7a 29 3b 0a 20  dAll(&txt, z);. 
17710 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
17720 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
17730 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a   ")", 1);.    }.
17740 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20    }..  j = i;.  
17750 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
17760 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
17770 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
17780 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
17790 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77  nKeyCol ) ? "row
177a0 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
177b0 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
177c0 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
177d0 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20  Term(&txt, i++, 
177e0 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69  z, ">");.  }.  i
177f0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
17800 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  s&WHERE_TOP_LIMI
17810 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
17820 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e   = (j==pIndex->n
17830 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69  KeyCol ) ? "rowi
17840 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
17850 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[j]].zName;.  
17860 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
17870 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20  erm(&txt, i, z, 
17880 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  "<");.  }.  sqli
17890 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
178a0 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b  d(&txt, ")", 1);
178b0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
178c0 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
178d0 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &txt);.}../*.** 
178e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
178f0 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
17900 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
17910 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20  sing an EXPLAIN 
17920 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f  QUERY PLAN.** co
17930 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75  mmand. If the qu
17940 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c  ery being compil
17950 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  ed is an EXPLAIN
17960 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73   QUERY PLAN, a s
17970 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20  ingle.** record 
17980 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
17990 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
179a0 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
179b0 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a  n strategy in .*
179c0 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  * pLevel..*/.sta
179d0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
179e0 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65  OneScan(.  Parse
179f0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
17a10 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
17a20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
17a30 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
17a40 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74   /* Table list t
17a50 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20  his loop refers 
17a60 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  to */.  WhereLev
17a70 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20  el *pLevel,     
17a80 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
17a90 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c  to write OP_Expl
17aa0 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a  ain opcode for *
17ab0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ad0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
17ae0 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20   "level" column 
17af0 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  of output */.  i
17b00 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b20 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f  * Value for "fro
17b30 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  m" column of out
17b40 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  put */.  u16 wct
17b50 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
17b60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
17b70 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  s passed to sqli
17b80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
17b90 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
17ba0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
17bb0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
17bc0 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b  ==2 ).#endif.  {
17bd0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
17be0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
17bf0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
17c00 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
17c10 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
17c20 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
17c30 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e   /* VM being con
17c40 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20  structed */.    
17c50 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
17c60 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a  arse->db;     /*
17c70 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
17c80 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   */.    char *zM
17c90 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sg;             
17ca0 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f        /* Text to
17cb0 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70   add to EQP outp
17cc0 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  ut */.    int iI
17cd0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
17ce0 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63  ectId;  /* Selec
17cf0 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20  t id (left-most 
17d00 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a  output column) *
17d10 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72  /.    int isSear
17d20 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
17d30 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
17d40 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20  a SEARCH. False 
17d50 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20  for SCAN. */.   
17d60 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
17d70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p;             /
17d80 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e  * The controllin
17d90 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  g WhereLoop obje
17da0 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c  ct */.    u32 fl
17db0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
17dc0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
17dd0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
17de0 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  his loop */..   
17df0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
17e00 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61  >pWLoop;.    fla
17e10 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  gs = pLoop->wsFl
17e20 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  ags;.    if( (fl
17e30 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f  ags&WHERE_MULTI_
17e40 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61  OR) || (wctrlFla
17e50 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  gs&WHERE_ONETABL
17e60 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e  E_ONLY) ) return
17e70 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20  ;..    isSearch 
17e80 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f  = (flags&(WHERE_
17e90 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
17ea0 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20  TOP_LIMIT))!=0. 
17eb0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28             || ((
17ec0 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52 54  flags&WHERE_VIRT
17ed0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20  UALTABLE)==0 && 
17ee0 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  (pLoop->u.btree.
17ef0 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20  nEq>0)).        
17f00 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61      || (wctrlFla
17f10 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42  gs&(WHERE_ORDERB
17f20 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45  Y_MIN|WHERE_ORDE
17f30 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20  RBY_MAX));..    
17f40 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
17f50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
17f60 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43 48  isSearch?"SEARCH
17f70 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69  ":"SCAN");.    i
17f80 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
17f90 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  t ){.      zMsg 
17fa0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
17fb0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
17fc0 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d  SUBQUERY %d", zM
17fd0 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63  sg,pItem->iSelec
17fe0 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tId);.    }else{
17ff0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
18000 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
18010 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c  , zMsg, "%s TABL
18020 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  E %s", zMsg, pIt
18030 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
18040 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  }..    if( pItem
18050 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
18060 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
18070 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
18080 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a  g, "%s AS %s", z
18090 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  Msg, pItem->zAli
180a0 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  as);.    }.    i
180b0 66 28 20 28 66 6c 61 67 73 20 26 20 28 57 48 45  f( (flags & (WHE
180c0 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52  RE_IPK|WHERE_VIR
180d0 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20  TUALTABLE))==0. 
180e0 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 4c      && ALWAYS(pL
180f0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
18100 64 65 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  dex!=0).    ){. 
18110 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
18120 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  e = explainIndex
18130 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c  Range(db, pLoop,
18140 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
18150 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
18160 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
18170 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  zMsg,.          
18180 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
18190 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
181a0 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   ? .            
181b0 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e 47         "%s USING
181c0 20 41 55 54 4f 4d 41 54 49 43 20 25 73 49 4e 44   AUTOMATIC %sIND
181d0 45 58 25 2e 30 73 25 73 22 20 3a 0a 20 20 20 20  EX%.0s%s" :.    
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
181f0 25 73 20 55 53 49 4e 47 20 25 73 49 4e 44 45 58  %s USING %sINDEX
18200 20 25 73 25 73 22 29 2c 20 0a 20 20 20 20 20 20   %s%s"), .      
18210 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 28           zMsg, (
18220 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
18230 44 58 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f 56 45  DX_ONLY) ? "COVE
18240 52 49 4e 47 20 22 20 3a 20 22 22 29 2c 0a 20 20  RING " : ""),.  
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
18260 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
18270 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72  ex->zName, zWher
18280 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
18290 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65  3DbFree(db, zWhe
182a0 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  re);.    }else i
182b0 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
182c0 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c  E_IPK)!=0 && (fl
182d0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
182e0 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20  TRAINT)!=0 ){.  
182f0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
18300 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
18310 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49  Msg, "%s USING I
18320 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
18330 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20  EY", zMsg);..   
18340 20 20 20 69 66 28 20 66 6c 61 67 73 26 28 57 48     if( flags&(WH
18350 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
18360 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29  ERE_COLUMN_IN) )
18370 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
18380 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
18390 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
183a0 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29  rowid=?)", zMsg)
183b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
183c0 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42  ( (flags&WHERE_B
183d0 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52  OTH_LIMIT)==WHER
183e0 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a  E_BOTH_LIMIT ){.
183f0 20 20 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 28 72 6f  b, zMsg, "%s (ro
18420 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c  wid>? AND rowid<
18430 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
18440 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
18450 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  s&WHERE_BTM_LIMI
18460 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  T ){.        zMs
18470 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
18480 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
18490 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d  s (rowid>?)", zM
184a0 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
184b0 20 69 66 28 20 41 4c 57 41 59 53 28 66 6c 61 67   if( ALWAYS(flag
184c0 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  s&WHERE_TOP_LIMI
184d0 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  T) ){.        zM
184e0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
184f0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
18500 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a  %s (rowid<?)", z
18510 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Msg);.      }.  
18520 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
18530 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
18540 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66  ABLE.    else if
18550 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
18560 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
18570 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  0 ){.      zMsg 
18580 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
18590 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
185a0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
185b0 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67  DEX %d:%s", zMsg
185c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
185d0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
185e0 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d  b.idxNum, pLoop-
185f0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
18600 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
18610 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
18620 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
18630 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a  g, "%s", zMsg);.
18640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18650 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
18660 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c  ain, iId, iLevel
18670 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50  , iFrom, zMsg, P
18680 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
18690 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
186a0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
186b0 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
186c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
186d0 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a  IT_EXPLAIN */...
186e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
186f0 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ode for the star
18700 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d  t of the iLevel-
18710 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57  th loop in the W
18720 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69  HERE clause.** i
18730 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65  mplementation de
18740 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66  scribed by pWInf
18750 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  o..*/.static Bit
18760 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70  mask codeOneLoop
18770 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e  Start(.  WhereIn
18780 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a  fo *pWInfo,   /*
18790 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d   Complete inform
187a0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
187b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
187c0 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
187d0 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
187e0 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d  level of pWInfo-
187f0 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63  >a[] should be c
18800 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73  oded */.  Bitmas
18810 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f  k notReady     /
18820 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61  * Which tables a
18830 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  re currently ava
18840 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  ilable */.){.  i
18850 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  nt j, k;        
18860 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
18870 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
18880 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
18890 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
188a0 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
188b0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74  */.  int addrNxt
188c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  ;         /* Whe
188d0 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f  re to jump to co
188e0 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
188f0 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a  next IN case */.
18900 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
18910 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
18920 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64  f we use the ind
18930 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ex only */.  int
18940 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
18950 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
18960 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20  need to scan in 
18970 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
18980 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
18990 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77  Level;  /* The w
189a0 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65  here level to be
189b0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
189c0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
189d0 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
189e0 70 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63  p object being c
189f0 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  oded */.  WhereC
18a00 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
18a10 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
18a20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48  of the entire WH
18a30 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
18a40 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
18a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18a60 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73  /* A WHERE claus
18a70 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73  e term */.  Pars
18a80 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
18a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
18aa0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
18ab0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ad0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
18ae0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
18af0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
18b20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  stmt under const
18b30 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74  ructions */.  st
18b40 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18b50 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
18b60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
18b70 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  m being coded */
18b80 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20  .  int addrBrk; 
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ba0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
18bb0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
18bc0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
18bd0 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20  t addrCont;     
18be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18bf0 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
18c00 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
18c10 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
18c20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20  iRowidReg = 0;  
18c30 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
18c40 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73  s stored in this
18c50 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f   register, if no
18c60 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  t zero */.  int 
18c70 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b  iReleaseReg = 0;
18c80 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
18c90 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62  gister to free b
18ca0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
18cb0 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
18cc0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
18cd0 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
18ce0 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  be;.  pWC = &pWI
18cf0 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d  nfo->sWC;.  db =
18d00 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
18d10 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
18d20 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c  >a[iLevel];.  pL
18d30 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
18d40 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d  Loop;.  pTabItem
18d50 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
18d60 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
18d70 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d  iFrom];.  iCur =
18d80 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
18d90 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f  or;.  pLevel->no
18da0 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64  tReady = notRead
18db0 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57  y & ~getMask(&pW
18dc0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
18dd0 69 43 75 72 29 3b 0a 20 20 62 52 65 76 20 3d 20  iCur);.  bRev = 
18de0 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b  (pWInfo->revMask
18df0 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f  >>iLevel)&1;.  o
18e00 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f  mitTable = (pLoo
18e10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
18e20 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20  RE_IDX_ONLY)!=0 
18e30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
18e40 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
18e50 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45  gs & WHERE_FORCE
18e60 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64  _TABLE)==0;.  Vd
18e70 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
18e80 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45  (v, "Begin WHERE
18e90 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69 4c 65  -loop%d: %s",iLe
18ea0 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e 70 54  vel,pTabItem->pT
18eb0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  ab->zName));..  
18ec0 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
18ed0 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
18ee0 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
18ef0 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
18f00 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
18f10 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
18f20 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61   addrBrk to brea
18f30 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  k out of a loop.
18f40 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f  .  ** Jump to co
18f50 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
18f60 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
18f70 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
18f80 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a  e.  ** loop..  *
18f90 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72  *.  ** When ther
18fa0 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
18fb0 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
18fc0 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61  e a "addrNxt" la
18fd0 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65  bel that.  ** me
18fe0 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
18ff0 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
19000 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
19010 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74  on.  When.  ** t
19020 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
19030 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
19040 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
19050 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
19060 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  .  ** is the sam
19070 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a  e as "addrBrk"..
19080 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d    */.  addrBrk =
19090 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
190a0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
190b0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
190c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
190d0 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65  addrCont = pLeve
190e0 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  l->addrCont = sq
190f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19100 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  el(v);..  /* If 
19110 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
19120 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
19130 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
19140 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20  locate and.  ** 
19150 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
19160 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
19170 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
19180 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
19190 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
191a0 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
191b0 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
191c0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
191d0 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
191e0 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  0].jointype & JT
191f0 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
19200 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
19210 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  in = ++pParse->n
19220 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
19230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19240 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65  _Integer, 0, pLe
19250 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
19260 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
19270 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
19280 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
19290 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ag"));.  }..  /*
192a0 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   Special case of
192b0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73   a FROM clause s
192c0 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e  ubquery implemen
192d0 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
192e0 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ine */.  if( pTa
192f0 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  bItem->viaCorout
19300 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
19310 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
19320 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
19330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19340 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
19350 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
19360 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d  ld, 0, pTabItem-
19370 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
19380 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
19390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
193a0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
193b0 72 65 67 59 69 65 6c 64 2c 20 61 64 64 72 42 72  regYield, addrBr
193c0 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
193d0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
193e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
193f0 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22  xt row of \"%s\"
19400 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  ", pTabItem->pTa
19410 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
19420 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
19430 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  Goto;.  }else..#
19440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19450 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
19460 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77    if(  (pLoop->w
19470 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
19480 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
19490 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
194a0 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  :  The table is 
194b0 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e  a virtual-table.
194c0 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65    Use the VFilte
194d0 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20  r and VNext.    
194e0 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61  **          to a
194f0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a  ccess the data..
19500 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69      */.    int i
19510 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c  Reg;   /* P3 Val
19520 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65  ue for OP_VFilte
19530 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
19540 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69  rNotFound;.    i
19550 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
19560 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a   pLoop->nLTerm;.
19570 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19580 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
19590 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  );.    iReg = sq
195a0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
195b0 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74  e(pParse, nConst
195c0 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64  raint+2);.    ad
195d0 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65  drNotFound = pLe
195e0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20  vel->addrBrk;.  
195f0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
19600 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
19610 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67 65        int iTarge
19620 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20  t = iReg+j+2;.  
19630 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
19640 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
19650 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
19660 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
19670 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
19680 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
19690 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45  ){.        codeE
196a0 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
196b0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
196c0 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72  l, j, bRev, iTar
196d0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64  get);.        ad
196e0 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65  drNotFound = pLe
196f0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
19700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19710 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
19720 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  de(pParse, pTerm
19730 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
19740 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
19750 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
19760 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19770 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c  , OP_Integer, pL
19780 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  oop->u.vtab.idxN
19790 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73  um, iReg);.    s
197a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
197b0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
197c0 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65  nConstraint, iRe
197d0 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g+1);.    sqlite
197e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
197f0 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
19800 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69   addrNotFound, i
19810 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Reg,.           
19820 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
19830 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
19840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19850 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
19860 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20  vtab.needFree ? 
19870 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f  P4_MPRINTF : P4_
19880 53 54 41 54 49 43 29 3b 0a 20 20 20 20 56 64 62  STATIC);.    Vdb
19890 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
198a0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
198b0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
198c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
198d0 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36  nstraint && j<16
198e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
198f0 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  ( (pLoop->u.vtab
19900 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20  .omitMask>>j)&1 
19910 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
19920 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
19930 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29  Loop->aLTerm[j])
19940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19950 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
19960 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70   OP_VNext;.    p
19970 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
19980 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
19990 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
199a0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
199b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
199c0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
199d0 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
199e0 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  int+2);.    sqli
199f0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
19a00 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65  pParse);.  }else
19a10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19a20 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
19a30 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70  BLE */..  if( (p
19a40 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
19a50 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20  WHERE_IPK)!=0.  
19a60 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
19a70 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
19a80 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
19a90 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b  UMN_EQ))!=0.  ){
19aa0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
19ab0 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
19ac0 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
19ad0 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
19ae0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
19af0 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
19b00 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
19b10 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
19b20 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
19b30 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d    we reference m
19b40 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69  ultiple rows usi
19b50 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28  ng a "rowid IN (
19b60 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20  ...)".    **    
19b70 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
19b80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
19b90 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  rt( pLoop->u.btr
19ba0 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20  ee.nEq==1 );.   
19bb0 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
19bc0 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61  aLTerm[0];.    a
19bd0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
19be0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
19bf0 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
19c00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
19c10 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
19c20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
19c30 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
19c40 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
19c50 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 2b   iReleaseReg = +
19c60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
19c70 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63     iRowidReg = c
19c80 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
19c90 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
19ca0 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20  Level, 0, bRev, 
19cb0 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
19cc0 20 20 69 66 28 20 69 52 6f 77 69 64 52 65 67 21    if( iRowidReg!
19cd0 3d 69 52 65 6c 65 61 73 65 52 65 67 20 29 20 73  =iReleaseReg ) s
19ce0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19cf0 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
19d00 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
19d10 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
19d20 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
19d30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19d40 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
19d50 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
19d60 4e 78 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Nxt); VdbeCovera
19d70 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
19d80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19d90 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
19da0 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f  ur, addrNxt, iRo
19db0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62  widReg);.    Vdb
19dc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19dd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19de0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
19df0 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64 52  (pParse, iRowidR
19e00 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  eg, 1);.    sqli
19e10 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
19e20 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
19e30 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
19e40 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19e50 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
19e60 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
19e70 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Noop;.  }else if
19e80 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
19e90 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
19ea0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
19eb0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
19ec0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
19ed0 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  GE)!=0.  ){.    
19ee0 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20 68  /* Case 3:  We h
19ef0 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
19f00 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
19f10 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
19f20 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
19f30 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
19f40 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
19f50 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
19f60 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
19f70 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
19f80 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
19f90 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
19fa0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20  ble==0 );.    j 
19fb0 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20  = 0;.    pStart 
19fc0 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20  = pEnd = 0;.    
19fd0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
19fe0 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
19ff0 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d 20  IMIT ) pStart = 
1a000 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
1a010 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  +];.    if( pLoo
1a020 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1a030 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70  RE_TOP_LIMIT ) p
1a040 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
1a050 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73  erm[j++];.    as
1a060 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30 20  sert( pStart!=0 
1a070 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  || pEnd!=0 );.  
1a080 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
1a090 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61      pTerm = pSta
1a0a0 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74  rt;.      pStart
1a0b0 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70   = pEnd;.      p
1a0c0 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
1a0d0 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72   }.    if( pStar
1a0e0 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
1a0f0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
1a100 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1a110 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  on that defines 
1a120 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20  the start bound 
1a130 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  */.      int r1,
1a140 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f   rTemp;        /
1a150 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20  * Registers for 
1a160 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72  holding the star
1a170 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20  t boundary */.. 
1a180 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
1a190 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d  owing constant m
1a1a0 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20  aps TK_xx codes 
1a1b0 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69  into correspondi
1a1c0 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65  ng .      ** see
1a1d0 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64  k opcodes.  It d
1a1e0 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74  epends on a part
1a1f0 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20  icular ordering 
1a200 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a  of TK_xx.      *
1a210 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  /.      const u8
1a220 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20   aMoveOp[] = {. 
1a230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1a240 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 54  GT */  OP_SeekGT
1a250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1a260 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LE */  OP_See
1a270 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLE,.           
1a280 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f  /* TK_LT */  OP_
1a290 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20 20 20  SeekLT,.        
1a2a0 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20     /* TK_GE */  
1a2b0 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20 20  OP_SeekGE.      
1a2c0 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  };.      assert(
1a2d0 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20   TK_LE==TK_GT+1 
1a2e0 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );      /* Make 
1a2f0 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e  sure the orderin
1a300 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  g.. */.      ass
1a310 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
1a320 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+2 );      /*  
1a330 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78  ... of the TK_xx
1a340 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20   values... */.  
1a350 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
1a360 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20  E==TK_GT+3 );   
1a370 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f     /*  ... is co
1a380 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20  rrecct. */..    
1a390 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61 72    assert( (pStar
1a3a0 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1a3b0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
1a3c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1a3d0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1a3e0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1a3f0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61  .      pX = pSta
1a400 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
1a410 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1a420 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a430 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75  ( pStart->leftCu
1a440 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a  rsor!=iCur ); /*
1a450 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   transitive cons
1a460 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
1a470 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1a480 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1a490 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
1a4a0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
1a4b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a4c0 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
1a4d0 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
1a4e0 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
1a4f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1a500 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
1a510 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1a520 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  v, pX->op==TK_GT
1a530 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1a540 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f  erageIf(v, pX->o
1a550 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20  p==TK_LE);.     
1a560 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1a570 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  v, pX->op==TK_LT
1a580 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1a590 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f  erageIf(v, pX->o
1a5a0 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20  p==TK_GE);.     
1a5b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a5c0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1a5d0 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
1a5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1a5f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a600 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
1a610 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1a620 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
1a630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a650 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
1a660 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
1a670 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
1a680 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1a690 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
1a6a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1a6b0 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 21  erageIf(v, bRev!
1a6c0 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  =0);.    }.    i
1a6d0 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  f( pEnd ){.     
1a6e0 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
1a6f0 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70   pX = pEnd->pExp
1a700 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1a710 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
1a720 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e 77  assert( (pEnd->w
1a730 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1a740 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ULL)==0 );.     
1a750 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
1a760 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
1a770 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69  r ); /* Transiti
1a780 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
1a790 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
1a7a0 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ( pEnd->wtFlags 
1a7b0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1a7c0 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61  ;.      memEndVa
1a7d0 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lue = ++pParse->
1a7e0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
1a7f0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1a800 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
1a810 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20  memEndValue);.  
1a820 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d      if( pX->op==
1a830 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LT || pX->op=
1a840 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20  =TK_GT ){.      
1a850 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
1a860 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b  ? OP_Le : OP_Ge;
1a870 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a880 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1a890 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50  Rev ? OP_Lt : OP
1a8a0 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _Gt;.      }.   
1a8b0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1a8c0 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
1a8d0 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20    }.    start = 
1a8e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1a8f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70  ntAddr(v);.    p
1a900 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
1a910 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
1a920 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
1a930 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
1a940 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
1a950 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  art;.    assert(
1a960 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
1a970 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f 70  ;.    if( testOp
1a980 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
1a990 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b     iRowidReg = +
1a9a0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a9b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a9c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1a9d0 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  id, iCur, iRowid
1a9e0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1a9f0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1aa00 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1aa10 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1aa20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1aa30 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
1aa40 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20  p, memEndValue, 
1aa50 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52  addrBrk, iRowidR
1aa60 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  eg);.      VdbeC
1aa70 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73  overageIf(v, tes
1aa80 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  tOp==OP_Le);.   
1aa90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1aaa0 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f  f(v, testOp==OP_
1aab0 4c 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Lt);.      VdbeC
1aac0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73  overageIf(v, tes
1aad0 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  tOp==OP_Ge);.   
1aae0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1aaf0 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f  f(v, testOp==OP_
1ab00 47 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Gt);.      sqlit
1ab10 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1ab20 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
1ab30 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55  ERIC | SQLITE_JU
1ab40 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  MPIFNULL);.    }
1ab50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f  .  }else if( pLo
1ab60 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1ab70 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
1ab80 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20     /* Case 4: A 
1ab90 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e  scan using an in
1aba0 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
1abb0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57  **         The W
1abc0 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20  HERE clause may 
1abd0 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20  contain zero or 
1abe0 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20  more equality . 
1abf0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65     **         te
1ac00 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e  rms ("==" or "IN
1ac10 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61  " operators) tha
1ac20 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e  t refer to the N
1ac30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ac40 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1ac50 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  s of the index. 
1ac60 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  It may also cont
1ac70 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ain.    **      
1ac80 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f     inequality co
1ac90 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c  nstraints (>, <,
1aca0 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68   >= or <=) on th
1acb0 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a  e indexed.    **
1acc0 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
1acd0 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  that immediately
1ace0 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65   follows the N e
1acf0 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20  qualities. Only 
1ad00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ad10 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
1ad20 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20  olumn can be an 
1ad30 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65  inequality - the
1ad40 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a   rest must.    *
1ad50 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
1ad60 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
1ad70 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65  operators. For e
1ad80 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
1ad90 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1ada0 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c  ndex is on (x,y,
1adb0 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  z), then the fol
1adc0 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61  lowing clauses a
1add0 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20  re all .    **  
1ade0 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64         optimized
1adf0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1ae00 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20             x=5. 
1ae10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ae20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20   x=5 AND y=10.  
1ae30 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1ae40 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  x=5 AND y<10.   
1ae50 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1ae60 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79  =5 AND y>5 AND y
1ae70 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
1ae80 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1ae90 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20  5 AND z<=10.    
1aea0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1aeb0 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20    The z<10 term 
1aec0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1aed0 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
1aee0 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20   only.    **    
1aef0 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72       the x=5 ter
1af00 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m:.    **.    **
1af10 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1af20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a  AND z<10.    **.
1af30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e      **         N
1af40 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20   may be zero if 
1af50 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
1af60 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1af70 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
1af80 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1af90 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1afa0 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20  traints, then N 
1afb0 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20  is at.    **    
1afc0 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a       least one..
1afd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1afe0 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
1aff0 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
1b000 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
1b010 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
1b020 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
1b030 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
1b040 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
1b050 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
1b060 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1b070 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
1b080 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
1b090 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
1b0a0 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20   BY..    */  .  
1b0b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1b0c0 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b  8 aStartOp[] = {
1b0d0 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
1b0e0 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69  0,.      OP_Rewi
1b0f0 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nd,           /*
1b100 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   2: (!start_cons
1b110 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1b120 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f  Eq &&  !bRev) */
1b130 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20  .      OP_Last, 
1b140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
1b150 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
1b160 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
1b170 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20   &&   bRev) */. 
1b180 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 54 2c 20       OP_SeekGT, 
1b190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20            /* 4: 
1b1a0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1b1b0 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1b1c0 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1b1d0 20 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 20 20 20     OP_SeekLT,   
1b1e0 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73          /* 5: (s
1b1f0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1b200 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
1b210 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1b220 20 4f 50 5f 53 65 65 6b 47 45 2c 20 20 20 20 20   OP_SeekGE,     
1b230 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61        /* 6: (sta
1b240 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1b250 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21  &&  startEq && !
1b260 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1b270 50 5f 53 65 65 6b 4c 45 20 20 20 20 20 20 20 20  P_SeekLE        
1b280 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74      /* 7: (start
1b290 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1b2a0 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52    startEq &&  bR
1b2b0 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
1b2c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1b2d0 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20  8 aEndOp[] = {. 
1b2e0 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20       OP_IdxGE,  
1b2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
1b300 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1b310 20 26 26 20 21 62 52 65 76 20 26 26 20 21 65 6e   && !bRev && !en
1b320 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  dEq) */.      OP
1b330 5f 49 64 78 47 54 2c 20 20 20 20 20 20 20 20 20  _IdxGT,         
1b340 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f     /* 1: (end_co
1b350 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
1b360 65 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a 2f  ev &&  endEq) */
1b370 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 45 2c  .      OP_IdxLE,
1b380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1b390 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1b3a0 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20 21  ts &&  bRev && !
1b3b0 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20  endEq) */.      
1b3c0 4f 50 5f 49 64 78 4c 54 2c 20 20 20 20 20 20 20  OP_IdxLT,       
1b3d0 20 20 20 20 20 2f 2a 20 33 3a 20 28 65 6e 64 5f       /* 3: (end_
1b3e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 20  constraints &&  
1b3f0 62 52 65 76 20 26 26 20 20 65 6e 64 45 71 29 20  bRev &&  endEq) 
1b400 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 31  */.    };.    u1
1b410 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  6 nEq = pLoop->u
1b420 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 20 20 20  .btree.nEq;     
1b430 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
1b440 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20  or IN terms */. 
1b450 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20     int regBase; 
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
1b480 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61   holding constra
1b490 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  int values */.  
1b4a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1b4b0 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
1b4c0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1b4d0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1b4e0 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
1b4f0 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
1b500 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
1b510 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1b520 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
1b530 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
1b540 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
1b550 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1b560 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
1b570 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1b580 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1b5b0 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
1b5c0 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
1b5d0 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
1b5e0 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
1b5f0 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
1b600 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
1b610 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1b620 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1b630 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1b640 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1b650 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1b660 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1b670 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1b680 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
1b690 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
1b6a0 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
1b6b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1b6c0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1b6d0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1b6e0 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
1b6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b700 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1b710 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
1b720 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b740 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
1b750 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
1b760 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b780 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
1b790 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
1b7a0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
1b7b0 61 72 20 63 45 6e 64 41 66 66 20 3d 20 30 3b 20  ar cEndAff = 0; 
1b7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
1b7d0 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
1b7e0 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
1b7f0 6e 74 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 65  nt */.    u8 bSe
1b800 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b 20  ekPastNull = 0; 
1b810 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
1b820 6f 20 73 65 65 6b 20 70 61 73 74 20 69 6e 69 74  o seek past init
1b830 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20 20  ial nulls */.   
1b840 20 75 38 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20   u8 bStopAtNull 
1b850 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
1b860 20 41 64 64 20 63 6f 6e 64 69 74 69 6f 6e 20 74   Add condition t
1b870 6f 20 74 65 72 6d 69 6e 61 74 65 20 61 74 20 4e  o terminate at N
1b880 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20 20 70 49 64  ULLs */..    pId
1b890 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
1b8a0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
1b8b0 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
1b8c0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 61 73  >iIdxCur;.    as
1b8d0 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f 70  sert( nEq>=pLoop
1b8e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20  ->u.btree.nSkip 
1b8f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
1b900 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65  is loop satisfie
1b910 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28  s a sort order (
1b920 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73  pOrderBy) reques
1b930 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77  t that .    ** w
1b940 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  as passed to thi
1b950 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d  s function to im
1b960 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43  plement a "SELEC
1b970 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20  T min(x) ..." . 
1b980 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65     ** query, the
1b990 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  n the caller wil
1b9a0 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65  l only allow the
1b9b0 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72   loop to run for
1b9c0 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65  .    ** a single
1b9d0 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   iteration. This
1b9e0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1b9f0 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e  first row return
1ba00 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  ed.    ** should
1ba10 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c   not have a NULL
1ba20 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
1ba30 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20   'x'. If column 
1ba40 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68  'x' is.    ** th
1ba50 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65  e first one afte
1ba60 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69  r the nEq equali
1ba70 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  ty constraints i
1ba80 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20  n the index,.   
1ba90 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72 65   ** this require
1baa0 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68  s some special h
1bab0 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  andling..    */.
1bac0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
1bad0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a  fo->pOrderBy==0.
1bae0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e           || pWIn
1baf0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
1bb00 78 70 72 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  xpr==1.         
1bb10 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
1bb20 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  lFlags&WHERE_ORD
1bb30 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a  ERBY_MIN)==0 );.
1bb40 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
1bb50 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
1bb60 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d  E_ORDERBY_MIN)!=
1bb70 30 0a 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f  0.     && pWInfo
1bb80 2d 3e 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20 20  ->nOBSat>0.     
1bb90 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  && (pIdx->nKeyCo
1bba0 6c 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  l>nEq).    ){.  
1bbb0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
1bbc0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
1bbd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 53 65  ==0 );.      bSe
1bbe0 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a  ekPastNull = 1;.
1bbf0 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
1bc00 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1bc10 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
1bc20 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1bc30 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
1bc40 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
1bc50 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
1bc60 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
1bc70 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  j = nEq;.    if(
1bc80 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1bc90 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1bca0 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
1bcb0 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e  eStart = pLoop->
1bcc0 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
1bcd0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
1bce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bcf0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1bd00 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1bd10 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
1bd20 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
1bd30 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
1bd40 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1bd50 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53       if( pRangeS
1bd60 74 61 72 74 3d 3d 30 0a 20 20 20 20 20 20 20 26  tart==0.       &
1bd70 26 20 28 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43  & (j = pIdx->aiC
1bd80 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a  olumn[nEq])>=0 .
1bd90 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
1bda0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e  pTable->aCol[j].
1bdb0 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20  notNull==0.     
1bdc0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65 65   ){.        bSee
1bdd0 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  kPastNull = 1;. 
1bde0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1bdf0 20 61 73 73 65 72 74 28 20 70 52 61 6e 67 65 45   assert( pRangeE
1be00 6e 64 3d 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65  nd==0 || (pRange
1be10 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1be20 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
1be30 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
1be40 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
1be50 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
1be60 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
1be70 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e   or IN.    ** an
1be80 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  d store the valu
1be90 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
1bea0 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  s in an array of
1beb0 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
1bec0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  * starting at re
1bed0 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  gBase..    */.  
1bee0 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65    regBase = code
1bef0 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
1bf00 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62  (pParse,pLevel,b
1bf10 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a  Rev,nExtraReg,&z
1bf20 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61  StartAff);.    a
1bf30 73 73 65 72 74 28 20 7a 53 74 61 72 74 41 66 66  ssert( zStartAff
1bf40 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
1bf50 72 6c 65 6e 33 30 28 7a 53 74 61 72 74 41 66 66  rlen30(zStartAff
1bf60 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 20 20 69 66  )>=nEq );.    if
1bf70 28 20 7a 53 74 61 72 74 41 66 66 20 29 20 63 45  ( zStartAff ) cE
1bf80 6e 64 41 66 66 20 3d 20 7a 53 74 61 72 74 41 66  ndAff = zStartAf
1bf90 66 5b 6e 45 71 5d 3b 0a 20 20 20 20 61 64 64 72  f[nEq];.    addr
1bfa0 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
1bfb0 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  drNxt;..    /* I
1bfc0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1bfd0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73   reverse order s
1bfe0 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  can on an ascend
1bff0 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20  ing index, or.  
1c000 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f    ** a forward o
1c010 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64  rder scan on a d
1c020 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  escending index,
1c030 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65   interchange the
1c040 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61   .    ** start a
1c050 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52  nd end terms (pR
1c060 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52  angeStart and pR
1c070 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f  angeEnd)..    */
1c080 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49  .    if( (nEq<pI
1c090 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62  dx->nKeyCol && b
1c0a0 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72  Rev==(pIdx->aSor
1c0b0 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c  tOrder[nEq]==SQL
1c0c0 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20  ITE_SO_ASC)).   
1c0d0 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49    || (bRev && pI
1c0e0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71  dx->nKeyCol==nEq
1c0f0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53  ).    ){.      S
1c100 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c  WAP(WhereTerm *,
1c110 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e   pRangeEnd, pRan
1c120 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  geStart);.      
1c130 53 57 41 50 28 75 38 2c 20 62 53 65 65 6b 50 61  SWAP(u8, bSeekPa
1c140 73 74 4e 75 6c 6c 2c 20 62 53 74 6f 70 41 74 4e  stNull, bStopAtN
1c150 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ull);.    }..   
1c160 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1c170 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
1c180 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
1c190 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
1c1a0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1c1b0 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
1c1c0 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1c1d0 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
1c1e0 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1c1f0 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1c200 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
1c210 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
1c220 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1c230 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1c240 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
1c250 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
1c260 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71  0 );.    startEq
1c270 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20   = !pRangeStart 
1c280 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  || pRangeStart->
1c290 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1c2a0 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65  LE|WO_GE);.    e
1c2b0 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65  ndEq =   !pRange
1c2c0 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64  End || pRangeEnd
1c2d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1c2e0 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
1c2f0 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1c300 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ts = pRangeStart
1c310 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20   || nEq>0;..    
1c320 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65  /* Seek the inde
1c330 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  x cursor to the 
1c340 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e  start of the ran
1c350 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73  ge. */.    nCons
1c360 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
1c370 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
1c380 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
1c390 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
1c3a0 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52  Start->pExpr->pR
1c3b0 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
1c3c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1c3d0 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
1c3e0 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
1c3f0 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74  if( (pRangeStart
1c400 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1c410 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  _VNULL)==0.     
1c420 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
1c430 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
1c440 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
1c450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c460 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1c470 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
1c480 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
1c490 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1c4a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c4b0 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29   if( zStartAff )
1c4c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1c4d0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1c4e0 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74  nity(pRight, zSt
1c4f0 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51  artAff[nEq])==SQ
1c500 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a  LITE_AFF_NONE){.
1c510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
1c520 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
1c530 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f  n is to be perfo
1c540 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e  rmed with no con
1c550 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  versions.       
1c560 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f     ** applied to
1c570 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73   the operands, s
1c580 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  et the affinity 
1c590 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67  to apply to pRig
1c5a0 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20  ht to .         
1c5b0 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   ** SQLITE_AFF_N
1c5c0 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ONE.  */.       
1c5d0 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
1c5e0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
1c5f0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
1c600 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1c610 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
1c620 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
1c630 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
1c640 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  q]) ){.         
1c650 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
1c660 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1c670 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1c680 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f     }  .      nCo
1c690 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1c6a0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1c6b0 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
1c6c0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1c6d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1c6e0 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 29   bSeekPastNull )
1c6f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1c700 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c710 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65  Null, 0, regBase
1c720 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f  +nEq);.      nCo
1c730 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1c740 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20    startEq = 0;. 
1c750 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74       start_const
1c760 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20  raints = 1;.    
1c770 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41  }.    codeApplyA
1c780 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
1c790 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
1c7a0 61 69 6e 74 20 2d 20 62 53 65 65 6b 50 61 73 74  aint - bSeekPast
1c7b0 4e 75 6c 6c 2c 20 7a 53 74 61 72 74 41 66 66 29  Null, zStartAff)
1c7c0 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72  ;.    op = aStar
1c7d0 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74  tOp[(start_const
1c7e0 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74  raints<<2) + (st
1c7f0 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76  artEq<<1) + bRev
1c800 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ];.    assert( o
1c810 70 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  p!=0 );.    sqli
1c820 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1c830 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
1c840 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
1c850 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
1c860 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1c870 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
1c880 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1c890 4f 50 5f 52 65 77 69 6e 64 29 3b 20 20 74 65 73  OP_Rewind);  tes
1c8a0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65  tcase( op==OP_Re
1c8b0 77 69 6e 64 20 29 3b 0a 20 20 20 20 56 64 62 65  wind );.    Vdbe
1c8c0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1c8d0 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20 20 20 20 74  ==OP_Last);    t
1c8e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1c8f0 4c 61 73 74 20 29 3b 0a 20 20 20 20 56 64 62 65  Last );.    Vdbe
1c900 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1c910 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 20 20 74  ==OP_SeekGT);  t
1c920 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1c930 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20 56 64  SeekGT );.    Vd
1c940 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1c950 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 29 3b 20  op==OP_SeekGE); 
1c960 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1c970 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20 20 20  P_SeekGE );.    
1c980 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1c990 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29  , op==OP_SeekLE)
1c9a0 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1c9b0 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20  =OP_SeekLE );.  
1c9c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1c9d0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  (v, op==OP_SeekL
1c9e0 54 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  T);  testcase( o
1c9f0 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 29 3b 0a  p==OP_SeekLT );.
1ca00 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
1ca10 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
1ca20 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1ca30 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  aint at the end 
1ca40 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61  of the.    ** ra
1ca50 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  nge (if any)..  
1ca60 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72    */.    nConstr
1ca70 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
1ca80 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b  if( pRangeEnd ){
1ca90 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1caa0 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d  ght = pRangeEnd-
1cab0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
1cac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1cad0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
1cae0 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  rse, regBase+nEq
1caf0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
1cb00 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1cb10 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
1cb20 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
1cb30 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e  if( (pRangeEnd->
1cb40 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1cb50 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20  NULL)==0.       
1cb60 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
1cb70 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a  nBeNull(pRight).
1cb80 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1cb90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cba0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1cbb0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
1cbc0 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20  drNxt);.        
1cbd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1cbe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1cbf0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1cc00 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1cc10 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51 4c 49  , cEndAff)!=SQLI
1cc20 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20 20 20  TE_AFF_NONE.    
1cc30 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 45 78     && !sqlite3Ex
1cc40 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1cc50 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1cc60 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20 20 29  cEndAff).      )
1cc70 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 41 70  {.        codeAp
1cc80 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
1cc90 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
1cca0 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b 0a 20   1, &cEndAff);. 
1ccb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f       }.      nCo
1ccc0 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1ccd0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1cce0 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
1ccf0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1cd00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62  .    }else if( b
1cd10 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a 20 20  StopAtNull ){.  
1cd20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cd30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1cd40 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
1cd50 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71 20 3d  );.      endEq =
1cd60 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74   0;.      nConst
1cd70 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  raint++;.    }. 
1cd80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1cd90 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  (db, zStartAff);
1cda0 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
1cdb0 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
1cdc0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1cdd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1cde0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
1cdf0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
1ce00 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
1ce10 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
1ce20 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
1ce30 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74 72 61      if( nConstra
1ce40 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 20  int ){.      op 
1ce50 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a 32 20  = aEndOp[bRev*2 
1ce60 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20 20 20  + endEq];.      
1ce70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ce80 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1ce90 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1cea0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1ceb0 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  nt);.      testc
1cec0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
1ced0 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  T );  VdbeCovera
1cee0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
1cef0 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  dxGT );.      te
1cf00 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
1cf10 64 78 47 45 20 29 3b 20 20 56 64 62 65 43 6f 76  dxGE );  VdbeCov
1cf20 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1cf30 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20  P_IdxGE );.     
1cf40 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1cf50 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64 62 65  P_IdxLT );  Vdbe
1cf60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1cf70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20  ==OP_IdxLT );.  
1cf80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1cf90 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20 20 56  ==OP_IdxLE );  V
1cfa0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1cfb0 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b   op==OP_IdxLE );
1cfc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
1cfd0 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75  eek the table cu
1cfe0 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65  rsor, if require
1cff0 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65  d */.    disable
1d000 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
1d010 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64  ngeStart);.    d
1d020 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1d030 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20  l, pRangeEnd);. 
1d040 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c 65     if( omitTable
1d050 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49 64   ){.      /* pId
1d060 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  x is a covering 
1d070 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20  index.  No need 
1d080 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d 61  to access the ma
1d090 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  in table. */.   
1d0a0 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f   }else if( HasRo
1d0b0 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  wid(pIdx->pTable
1d0c0 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  ) ){.      iRowi
1d0d0 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  dReg = ++pParse-
1d0e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1d0f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d100 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
1d110 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65  IdxCur, iRowidRe
1d120 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1d130 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
1d140 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
1d150 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1d160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d170 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp2(v, OP_Seek
1d180 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
1d190 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64  g);  /* Deferred
1d1a0 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c   seek */.    }el
1d1b0 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
1d1c0 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
1d1d0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
1d1e0 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20  dx->pTable);.   
1d1f0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 73     iRowidReg = s
1d200 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1d210 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e  ge(pParse, pPk->
1d220 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20  nKeyCol);.      
1d230 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e  for(j=0; j<pPk->
1d240 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
1d250 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74         k = sqlit
1d260 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1d270 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  pIdx, pPk->aiCol
1d280 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  umn[j]);.       
1d290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d2a0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1d2b0 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69 52 6f   iIdxCur, k, iRo
1d2c0 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20 20  widReg+j);.     
1d2d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1d2e0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1d2f0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 43   OP_NotFound, iC
1d300 75 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20 20  ur, addrCont,.  
1d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d320 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 52           iRowidR
1d330 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  eg, pPk->nKeyCol
1d340 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1d350 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  v);.    }..    /
1d360 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73  * Record the ins
1d370 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f  truction used to
1d380 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
1d390 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20  oop. Disable .  
1d3a0 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73    ** WHERE claus
1d3b0 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64  e terms made red
1d3c0 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e  undant by the in
1d3d0 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a  dex range scan..
1d3e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1d3f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1d400 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a  WHERE_ONEROW ){.
1d410 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
1d420 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1d430 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
1d440 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1d450 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20  op = OP_Prev;.  
1d460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1d470 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1d480 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
1d490 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78  Level->p1 = iIdx
1d4a0 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
1d4b0 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73  >p3 = (pLoop->ws
1d4c0 46 6c 61 67 73 26 57 48 45 52 45 5f 55 4e 51 5f  Flags&WHERE_UNQ_
1d4d0 57 41 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a 30  WANTED)!=0 ? 1:0
1d4e0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ;.    if( (pLoop
1d4f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1d500 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30  E_CONSTRAINT)==0
1d510 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1d520 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
1d530 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
1d540 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73  N_STEP;.    }els
1d550 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1d560 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
1d570 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
1d580 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d590 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
1d5a0 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70  TION.  if( pLoop
1d5b0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1d5c0 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
1d5d0 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77    /* Case 5:  Tw
1d5e0 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
1d5f0 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72  tely indexed ter
1d600 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
1d610 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  OR.    **.    **
1d620 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1d630 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1d640 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c   TABLE t1(a,b,c,
1d650 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  d);.    **   CRE
1d660 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
1d670 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(a);.    **   
1d680 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
1d690 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a  ON t1(b);.    **
1d6a0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
1d6b0 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20  i3 ON t1(c);.   
1d6c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
1d6d0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1d6e0 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f  ERE a=5 OR b=7 O
1d6f0 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33  R (c=11 AND d=13
1d700 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1d710 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20  In the example, 
1d720 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
1d730 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
1d740 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20  nnected by OR.. 
1d750 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66     ** The top of
1d760 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20   the loop looks 
1d770 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
1d780 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1d790 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1d7b0 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
1d7c0 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a  in reg 1.    **.
1d7d0 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72      ** Then, for
1d7e0 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65   each indexed te
1d7f0 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm, the followin
1d800 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  g. The arguments
1d810 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65   to.    ** RowSe
1d820 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74  tTest are such t
1d830 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66  hat the rowid of
1d840 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1d850 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20   is inserted.   
1d860 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   ** into the Row
1d870 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c  Set. If it is al
1d880 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63  ready present, c
1d890 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65  ontrol skips the
1d8a0 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70  .    ** Gosub op
1d8b0 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73  code and jumps s
1d8c0 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63  traight to the c
1d8d0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
1d8e0 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20   WhereEnd()..   
1d8f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1d900 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65    sqlite3WhereBe
1d910 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20  gin(<term>).    
1d920 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53  **          RowS
1d930 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20  etTest          
1d940 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74          # Insert
1d950 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73   rowid into rows
1d960 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  et.    **       
1d970 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20     Gosub      2 
1d980 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  A.    **        
1d990 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1d9a0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1d9b0 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62  Following the ab
1d9c0 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72  ove, code to ter
1d9d0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
1d9e0 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61   Label A, the ta
1d9f0 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  rget.    ** of t
1da00 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20  he Gosub above, 
1da10 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73  jumps to the ins
1da20 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61  truction right a
1da30 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20  fter the Goto.. 
1da40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1da50 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
1da60 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
1da70 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
1da80 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
1da90 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74   **          Got
1daa0 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20  o       B       
1dab0 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c           # The l
1dac0 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e  oop is finished.
1dad0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1dae0 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f       A: <loop bo
1daf0 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  dy>             
1db00 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74      # Return dat
1db10 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20  a, whatever..   
1db20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1db30 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32      Return     2
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74  # Jump back to t
1db60 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a  he Gosub.    **.
1db70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20      **       B: 
1db80 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e  <after the loop>
1db90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20  .    **.    */. 
1dba0 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
1dbb0 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65  pOrWc;    /* The
1dbc0 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65   OR-clause broke
1dbd0 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65  n out into subte
1dbe0 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  rms */.    SrcLi
1dbf0 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20  st *pOrTab;     
1dc00 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74    /* Shortened t
1dc10 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d  able list or OR-
1dc20 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f  clause generatio
1dc30 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
1dc40 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20  pCov = 0;       
1dc50 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69        /* Potenti
1dc60 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  al covering inde
1dc70 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  x (or NULL) */. 
1dc80 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d     int iCovCur =
1dc90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1dca0 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64    /* Cursor used
1dcb0 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73   for index scans
1dcc0 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20   (if any) */..  
1dcd0 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20    int regReturn 
1dce0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1dcf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1dd00 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69 74  egister used wit
1dd10 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20  h OP_Gosub */.  
1dd20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20    int regRowset 
1dd30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1dd50 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53  egister for RowS
1dd60 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  et object */.   
1dd70 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
1dd80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1dd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1dda0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
1ddb0 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
1ddc0 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69  iLoopBody = sqli
1ddd0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1dde0 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  (v);  /* Start o
1ddf0 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  f loop body */. 
1de00 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b     int iRetInit;
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de30 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52 65  Address of regRe
1de40 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20  turn init */.   
1de50 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72   int untestedTer
1de60 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ms = 0;         
1de70 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d      /* Some term
1de80 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
1de90 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69   tested */.    i
1dea0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1ded0 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
1dee0 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20  AndExpr = 0;    
1def0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1df00 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22  n ".. AND (...)"
1df10 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1df20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70    .    pTerm = p
1df30 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
1df40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1df50 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
1df60 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
1df70 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b  rator & WO_OR );
1df80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
1df90 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1dfa0 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29  ERM_ORINFO)!=0 )
1dfb0 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70  ;.    pOrWc = &p
1dfc0 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
1dfd0 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  >wc;.    pLevel-
1dfe0 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b  >op = OP_Return;
1dff0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1e000 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20  = regReturn;..  
1e010 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65    /* Set up a ne
1e020 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72  w SrcList in pOr
1e030 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  Tab containing t
1e040 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73  he table being s
1e050 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79  canned.    ** by
1e060 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68   this loop in th
1e070 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20  e a[0] slot and 
1e080 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62  all notReady tab
1e090 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c  les in a[1..] sl
1e0a0 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  ots..    ** This
1e0b0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63   becomes the Src
1e0c0 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75  List in the recu
1e0d0 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71  rsive call to sq
1e0e0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1e0f0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1e100 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
1e110 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
1e120 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20  nNotReady;      
1e130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e140 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52  e number of notR
1e150 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  eady tables */. 
1e160 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
1e170 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72  ist_item *origSr
1e180 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  c;     /* Origin
1e190 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65  al list of table
1e1a0 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52  s */.      nNotR
1e1b0 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  eady = pWInfo->n
1e1c0 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d  Level - iLevel -
1e1d0 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62   1;.      pOrTab
1e1e0 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41   = sqlite3StackA
1e1f0 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20  llocRaw(db,.    
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
1e220 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61  pOrTab)+ nNotRea
1e230 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  dy*sizeof(pOrTab
1e240 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[0]));.      
1e250 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20  if( pOrTab==0 ) 
1e260 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b  return notReady;
1e270 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
1e280 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f  Alloc = (u8)(nNo
1e290 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20  tReady + 1);.   
1e2a0 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20     pOrTab->nSrc 
1e2b0 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63  = pOrTab->nAlloc
1e2c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1e2d0 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74  OrTab->a, pTabIt
1e2e0 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62  em, sizeof(*pTab
1e2f0 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72  Item));.      or
1e300 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e  igSrc = pWInfo->
1e310 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pTabList->a;.   
1e320 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e     for(k=1; k<=n
1e330 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a  NotReady; k++){.
1e340 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1e350 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f  pOrTab->a[k], &o
1e360 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d  rigSrc[pLevel[k]
1e370 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28  .iFrom], sizeof(
1e380 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a  pOrTab->a[k]));.
1e390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1e3a0 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  e{.      pOrTab 
1e3b0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1e3c0 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  st;.    }..    /
1e3d0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1e3e0 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72   rowset register
1e3f0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c   to contain NULL
1e400 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73  . An SQL NULL is
1e410 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c   .    ** equival
1e420 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ent to an empty 
1e430 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20  rowset..    **. 
1e440 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69     ** Also initi
1e450 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20  alize regReturn 
1e460 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61  to contain the a
1e470 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
1e480 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a  struction .    *
1e490 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
1e4a0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52  llowing the OP_R
1e4b0 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74  eturn at the bot
1e4c0 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  tom of the loop.
1e4d0 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
1e4e0 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65  required in a fe
1e4f0 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a  w obscure LEFT J
1e500 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20  OIN cases where 
1e510 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20  control jumps.  
1e520 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f    ** over the to
1e530 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e  p of the loop in
1e540 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69  to the body of i
1e550 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
1e560 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72  the .    ** corr
1e570 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72  ect response for
1e580 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70   the end-of-loop
1e590 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65   code (the OP_Re
1e5a0 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20  turn) is to .   
1e5b0 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   ** fall through
1e5c0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
1e5d0 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61  truction, just a
1e5e0 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65  s an OP_Next doe
1e5f0 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s if.    ** call
1e600 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
1e610 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20  alized cursor.. 
1e620 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
1e630 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1e640 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
1e650 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
1e660 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
1e670 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1e680 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
1e690 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1e6a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e6b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e6c0 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
1e6d0 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
1e6e0 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
1e6f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e700 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
1e710 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
1e720 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
1e730 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
1e740 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
1e750 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
1e760 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
1e770 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
1e780 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
1e790 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
1e7a0 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
1e7b0 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
1e7c0 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
1e7d0 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
1e7e0 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
1e7f0 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
1e800 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
1e810 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
1e820 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
1e830 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
1e840 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1e850 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
1e860 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
1e870 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
1e880 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
1e890 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
1e8a0 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
1e8b0 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
1e8c0 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
1e8d0 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
1e8e0 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
1e8f0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
1e900 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
1e910 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
1e920 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
1e930 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
1e940 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** This optimiza
1e950 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61  tion also only a
1e960 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78  pplies if the (x
1e970 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
1e980 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e  term.    ** is n
1e990 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1e9a0 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
1e9b0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20   a LEFT JOIN..  
1e9c0 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20    ** See ticket 
1e9d0 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
1e9e0 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66  e.org/src/info/f
1e9f0 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f  2369304e4.    */
1ea00 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
1ea10 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  erm>1 ){.      i
1ea20 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt iTerm;.      
1ea30 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65  for(iTerm=0; iTe
1ea40 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  rm<pWC->nTerm; i
1ea50 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
1ea60 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1ea70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
1ea80 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
1ea90 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d  &pWC->a[iTerm] =
1eaa0 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e  = pTerm ) contin
1eab0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1eac0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ead0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
1eae0 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  in) ) continue;.
1eaf0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1eb00 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
1eb10 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
1eb20 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20  RINFO );.       
1eb30 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e   testcase( pWC->
1eb40 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
1eb50 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1eb60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1eb70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46  WC->a[iTerm].wtF
1eb80 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49  lags & (TERM_ORI
1eb90 4e 46 4f 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c  NFO|TERM_VIRTUAL
1eba0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1ebb0 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e        if( (pWC->
1ebc0 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74  a[iTerm].eOperat
1ebd0 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20  or & WO_ALL)==0 
1ebe0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ebf0 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
1ec00 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
1ec10 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
1ec20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
1ec30 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
1ec40 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29  pAndExpr, pExpr)
1ec50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ec60 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
1ec70 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
1ec80 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1ec90 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20  pParse, TK_AND, 
1eca0 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b  0, pAndExpr, 0);
1ecb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ecc0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1ecd0 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69  <pOrWc->nTerm; i
1ece0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i++){.      Wher
1ecf0 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d  eTerm *pOrTerm =
1ed00 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a   &pOrWc->a[ii];.
1ed10 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
1ed20 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
1ed30 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d  Cur || (pOrTerm-
1ed40 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1ed50 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
1ed60 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53     WhereInfo *pS
1ed70 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  ubWInfo;        
1ed80 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69    /* Info for si
1ed90 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61  ngle OR-term sca
1eda0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  n */.        Exp
1edb0 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72  r *pOrExpr = pOr
1edc0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
1edd0 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70       if( pAndExp
1ede0 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  r && !ExprHasPro
1edf0 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45  perty(pOrExpr, E
1ee00 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
1ee10 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70           pAndExp
1ee20 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78  r->pLeft = pOrEx
1ee30 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  pr;.          pO
1ee40 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72  rExpr = pAndExpr
1ee50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ee60 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
1ee70 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
1ee80 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
1ee90 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
1eea0 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20        pSubWInfo 
1eeb0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
1eec0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54  gin(pParse, pOrT
1eed0 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20  ab, pOrExpr, 0, 
1eee0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1eef0 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
1ef00 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
1ef10 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   | WHERE_AND_ONL
1ef20 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y |.            
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
1ef40 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20  E_FORCE_TABLE | 
1ef50 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
1ef60 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20  NLY, iCovCur);. 
1ef70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ef80 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72  SubWInfo || pPar
1ef90 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1efa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1efb0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
1efc0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
1efd0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53     WhereLoop *pS
1efe0 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  ubLoop;.        
1eff0 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
1f000 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
1f010 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
1f020 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
1f030 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c  , iLevel, pLevel
1f040 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20  ->iFrom, 0.     
1f050 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1f060 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1f070 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1f080 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
1f090 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1f0a0 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
1f0b0 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
1f0c0 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
1f0d0 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
1f0e0 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
1f0f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1f100 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1f110 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
1f120 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29      regRowid, 0)
1f160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1f170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1f180 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54  nt(v, OP_RowSetT
1f190 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a  est, regRowset,.
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1f1d0 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c  entAddr(v)+2, r,
1f1e0 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20   iSet);.        
1f1f0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f200 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
1f210 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1f220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f230 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74  OP_Gosub, regRet
1f240 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  urn, iLoopBody);
1f250 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
1f260 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
1f270 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
1f280 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
1f290 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
1f2a0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
1f2b0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
1f2c0 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
1f2d0 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
1f2e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
1f2f0 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
1f300 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
1f310 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
1f320 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
1f330 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
1f340 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
1f350 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1f360 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
1f370 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
1f380 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
1f390 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
1f3a0 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20     /* If all of 
1f3b0 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  the OR-connected
1f3c0 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d   terms are optim
1f3d0 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ized using the s
1f3e0 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
1f3f0 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20   index, and the 
1f400 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20  index is opened 
1f410 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
1f420 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
1f430 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63         ** by eac
1f440 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
1f450 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61  3WhereBegin() ma
1f460 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c  de by this loop,
1f470 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20   it may.        
1f480 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
1f490 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64   to use that ind
1f4a0 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  ex as a covering
1f4b0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
1f4c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
1f4d0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
1f4e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1f4f0 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c  in() above resul
1f500 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68  ted in a scan th
1f510 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
1f520 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61  uses an index, a
1f530 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65  nd this is eithe
1f540 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63  r the first OR-c
1f550 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20  onnected term.  
1f560 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1f570 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65  ssed or the inde
1f580 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  x is the same as
1f590 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c   that used by al
1f5a0 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  l previous.     
1f5b0 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73       ** terms, s
1f5c0 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63  et pCov to the c
1f5d0 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
1f5e0 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69  g index. Otherwi
1f5f0 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20  se, set .       
1f600 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55     ** pCov to NU
1f610 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  LL to indicate t
1f620 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65  hat no candidate
1f630 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1f640 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20  will .          
1f650 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  ** be available.
1f660 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1f670 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70          pSubLoop
1f680 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b   = pSubWInfo->a[
1f690 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  0].pWLoop;.     
1f6a0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53       assert( (pS
1f6b0 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  ubLoop->wsFlags 
1f6c0 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
1f6d0 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  EX)==0 );.      
1f6e0 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f      if( (pSubLoo
1f6f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1f700 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
1f710 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69            && (ii
1f720 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d  ==0 || pSubLoop-
1f730 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d  >u.btree.pIndex=
1f740 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20  =pCov).         
1f750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f760 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
1f770 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d  o->a[0].iIdxCur=
1f780 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20  =iCovCur );.    
1f790 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70          pCov = p
1f7a0 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
1f7b0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  .pIndex;.       
1f7c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f7d0 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a        pCov = 0;.
1f7e0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1f7f0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
1f800 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
1f810 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
1f820 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
1f830 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
1f840 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
1f850 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
1f860 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f870 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
1f880 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20  evel->u.pCovidx 
1f890 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20  = pCov;.    if( 
1f8a0 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69  pCov ) pLevel->i
1f8b0 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72  IdxCur = iCovCur
1f8c0 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78  ;.    if( pAndEx
1f8d0 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64  pr ){.      pAnd
1f8e0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
1f8f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f900 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41 6e  prDelete(db, pAn
1f910 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  dExpr);.    }.  
1f920 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1f930 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69  ngeP1(v, iRetIni
1f940 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
1f950 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
1f960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f970 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1f980 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
1f990 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Brk);.    sqlite
1f9a0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f9b0 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  l(v, iLoopBody);
1f9c0 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ..    if( pWInfo
1f9d0 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c  ->nLevel>1 ) sql
1f9e0 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62  ite3StackFree(db
1f9f0 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69  , pOrTab);.    i
1fa00 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d  f( !untestedTerm
1fa10 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28  s ) disableTerm(
1fa20 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
1fa30 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
1fa40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
1fa50 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
1fa60 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ..  {.    /* Cas
1fa70 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 6:  There is n
1fa80 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
1fa90 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
1faa0 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20  mplete.    **   
1fab0 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
1fac0 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
1fad0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
1fae0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65  ic const u8 aSte
1faf0 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c  p[] = { OP_Next,
1fb00 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20   OP_Prev };.    
1fb10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1fb20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f  aStart[] = { OP_
1fb30 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20  Rewind, OP_Last 
1fb40 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  };.    assert( b
1fb50 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d  Rev==0 || bRev==
1fb60 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  1 );.    if( pTa
1fb70 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69  bItem->isRecursi
1fb80 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ve ){.      /* T
1fb90 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73 52  ables marked isR
1fba0 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f 6e  ecursive have on
1fbb0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ly a single row 
1fbc0 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20 69  that is stored i
1fbd0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73 65  n.      ** a pse
1fbe0 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f 20  udo-cursor.  No 
1fbf0 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20 6f  need to Rewind o
1fc00 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72 73  r Next such curs
1fc10 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4c  ors. */.      pL
1fc20 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
1fc30 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  op;.    }else{. 
1fc40 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
1fc50 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20  = aStep[bRev];. 
1fc60 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
1fc70 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
1fc80 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
1fc90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fca0 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
1fcb0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
1fcc0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1fcd0 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
1fce0 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
1fcf0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
1fd00 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  !=0);.      pLev
1fd10 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
1fd20 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
1fd30 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 0a  CAN_STEP;.    }.
1fd40 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74    }..  /* Insert
1fd50 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
1fd60 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
1fd70 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
1fd80 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f  mpletely.  ** co
1fd90 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65  mputed using the
1fda0 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20   current set of 
1fdb0 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
1fdc0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
1fdd0 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
1fde0 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
1fdf0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b  ){.    Expr *pE;
1fe00 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1fe10 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1fe20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
1fe30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1fe40 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1fe50 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
1fe60 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
1fe70 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
1fe80 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
1fe90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1fea0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
1feb0 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e  eqAll & pLevel->
1fec0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
1fed0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fee0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
1fef0 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20  Terms==0.       
1ff00 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
1ff10 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1ff20 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
1ff30 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20  ONLY)!=0 );.    
1ff40 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74    pWInfo->untest
1ff50 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20  edTerms = 1;.   
1ff60 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1ff70 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72   }.    pE = pTer
1ff80 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
1ff90 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
1ffa0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
1ffb0 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70  LeftJoin && !Exp
1ffc0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
1ffd0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
1ffe0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1fff0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20000 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
20010 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f  arse, pE, addrCo
20020 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
20030 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72  FNULL);.    pTer
20040 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
20050 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20  RM_CODED;.  }.. 
20060 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
20070 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c  to test for impl
20080 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ied constraints 
20090 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74  based on transit
200a0 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68  ivity.  ** of th
200b0 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e  e "==" operator.
200c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
200d0 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52 45  le: If the WHERE
200e0 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
200f0 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64   "t1.a=t2.b" and
20100 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a   "t2.b=123".  **
20110 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69   and we are codi
20120 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  ng the t1 loop a
20130 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68  nd the t2 loop h
20140 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64  as not yet coded
20150 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63  ,.  ** then we c
20160 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74  annot use the "t
20170 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72  1.a=t2.b" constr
20180 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e  aint, but we can
20190 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69   code.  ** the i
201a0 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33  mplied "t1.a=123
201b0 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  " constraint..  
201c0 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  */.  for(pTerm=p
201d0 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
201e0 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
201f0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
20200 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20  r *pE, *pEAlt;. 
20210 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
20220 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  lt;.    if( pTer
20230 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
20240 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
20250 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
20260 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
20270 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f  ->eOperator!=(WO
20280 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20  _EQUIV|WO_EQ) ) 
20290 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
202a0 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
202b0 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  sor!=iCur ) cont
202c0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c  inue;.    if( pL
202d0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
202e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
202f0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
20300 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  r;.    assert( !
20310 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20320 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
20330 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20340 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
20350 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  ght & pLevel->no
20360 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20  tReady)!=0 );.  
20370 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72    pAlt = findTer
20380 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65  m(pWC, iCur, pTe
20390 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
203a0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
203b0 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20  Q|WO_IN, 0);.   
203c0 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63   if( pAlt==0 ) c
203d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
203e0 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26   pAlt->wtFlags &
203f0 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20   (TERM_CODED) ) 
20400 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 65  continue;.    te
20410 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f  stcase( pAlt->eO
20420 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
20430 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20440 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72   pAlt->eOperator
20450 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
20460 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
20470 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61  t((v, "begin tra
20480 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
20490 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c 74  nt"));.    pEAlt
204a0 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41   = sqlite3StackA
204b0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
204c0 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20 20  of(*pEAlt));.   
204d0 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20 20   if( pEAlt ){.  
204e0 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70 41      *pEAlt = *pA
204f0 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  lt->pExpr;.     
20500 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d 20   pEAlt->pLeft = 
20510 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pE->pLeft;.     
20520 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
20530 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 41 6c  lse(pParse, pEAl
20540 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  t, addrCont, SQL
20550 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
20560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
20570 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41 6c  ackFree(db, pEAl
20580 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
20590 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
205a0 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
205b0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
205c0 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
205d0 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20  ct that.  ** at 
205e0 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66  least one row of
205f0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
20600 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65   has matched the
20610 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20   left table.  . 
20620 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
20630 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
20640 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46     pLevel->addrF
20650 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
20660 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
20670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
20680 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
20690 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
206a0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
206b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
206c0 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  , "record LEFT J
206d0 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
206e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
206f0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
20700 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
20710 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d  ->a, j=0; j<pWC-
20720 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  >nTerm; j++, pTe
20730 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73  rm++){.      tes
20740 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
20750 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
20760 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  TUAL );.      te
20770 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
20780 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
20790 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28  DED );.      if(
207a0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
207b0 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
207c0 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
207d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
207e0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
207f0 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  All & pLevel->no
20800 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
20810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
20820 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
20830 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63  rms );.        c
20840 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
20850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20860 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
20870 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20880 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
20890 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64  pTerm->pExpr, ad
208a0 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
208b0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
208c0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
208d0 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
208e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
208f0 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  urn pLevel->notR
20900 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  eady;.}..#if def
20910 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
20920 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66 69  ENABLED) && defi
20930 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
20940 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
20950 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 22  /*.** Generate "
20960 45 78 70 6c 61 6e 61 74 69 6f 6e 22 20 74 65 78  Explanation" tex
20970 74 20 66 6f 72 20 61 20 57 68 65 72 65 54 65 72  t for a WhereTer
20980 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
20990 64 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65  d whereExplainTe
209a0 72 6d 28 56 64 62 65 20 2a 76 2c 20 57 68 65 72  rm(Vdbe *v, Wher
209b0 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20  eTerm *pTerm){. 
209c0 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a   char zType[4];.
209d0 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
209e0 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 69 66 28  "...", 4);.  if(
209f0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
20a00 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
20a10 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b   zType[0] = 'V';
20a20 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  .  if( pTerm->eO
20a30 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
20a40 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d  IV  ) zType[1] =
20a50 20 27 45 27 3b 0a 20 20 69 66 28 20 45 78 70 72   'E';.  if( Expr
20a60 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
20a70 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
20a80 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32  mJoin) ) zType[2
20a90 5d 20 3d 20 27 4c 27 3b 0a 20 20 73 71 6c 69 74  ] = 'L';.  sqlit
20aa0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
20ab0 76 2c 20 22 25 73 20 22 2c 20 7a 54 79 70 65 29  v, "%s ", zType)
20ac0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
20ad0 69 6e 45 78 70 72 28 76 2c 20 70 54 65 72 6d 2d  inExpr(v, pTerm-
20ae0 3e 70 45 78 70 72 29 3b 0a 7d 0a 23 65 6e 64 69  >pExpr);.}.#endi
20af0 66 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45 5f  f /* WHERETRACE_
20b00 45 4e 41 42 4c 45 44 20 26 26 20 53 51 4c 49 54  ENABLED && SQLIT
20b10 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
20b20 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64 65  PLAIN */...#ifde
20b30 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
20b40 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
20b50 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
20b60 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ect for debuggin
20b70 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
20b80 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
20b90 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f  oopPrint(WhereLo
20ba0 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75  op *p, WhereClau
20bb0 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72  se *pWC){.  Wher
20bc0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
20bd0 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  pWC->pWInfo;.  i
20be0 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66  nt nb = 1+(pWInf
20bf0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
20c00 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74  c+7)/8;.  struct
20c10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20c20 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
20c30 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e  TabList->a + p->
20c40 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iTab;.  Table *p
20c50 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
20c60 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  b;.  sqlite3Debu
20c70 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25  gPrintf("%c%2d.%
20c80 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70  0*llx.%0*llx", p
20c90 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ->cId,.         
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
20cb0 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b  Tab, nb, p->mask
20cc0 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65  Self, nb, p->pre
20cd0 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  req);.  sqlite3D
20ce0 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32  ebugPrintf(" %12
20cf0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
20d00 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
20d10 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e  zAlias ? pItem->
20d20 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a  zAlias : pTab->z
20d30 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  Name);.  if( (p-
20d40 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
20d50 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
20d60 30 20 29 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20  0 ){.     const 
20d70 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
20d80 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65    if( p->u.btree
20d90 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d  .pIndex && (zNam
20da0 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  e = p->u.btree.p
20db0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30  Index->zName)!=0
20dc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
20dd0 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  rncmp(zName, "sq
20de0 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
20df0 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 17)==0 ){.    
20e00 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69      int i = sqli
20e10 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
20e20 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  e) - 1;.        
20e30 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21  while( zName[i]!
20e40 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20  ='_' ) i--;.    
20e50 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a      zName += i;.
20e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
20e70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
20e80 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a  (".%-16s %2d", z
20e90 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65  Name, p->u.btree
20ea0 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65  .nEq);.    }else
20eb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
20ec0 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73  ebugPrintf("%20s
20ed0 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ","");.    }.  }
20ee0 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
20ef0 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  z;.    if( p->u.
20f00 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20  vtab.idxStr ){. 
20f10 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
20f20 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22  _mprintf("(%d,\"
20f30 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20  %s\",%x)",.     
20f40 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e             p->u.
20f50 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
20f60 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70  u.vtab.idxStr, p
20f70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
20f80 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
20f90 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
20fa0 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78  _mprintf("(%d,%x
20fb0 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  )", p->u.vtab.id
20fc0 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xNum, p->u.vtab.
20fd0 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
20fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
20ff0 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22  gPrintf(" %-19s"
21000 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
21010 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20  3_free(z);.  }. 
21020 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
21030 6e 74 66 28 22 20 66 20 25 30 34 78 20 4e 20 25  ntf(" f %04x N %
21040 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
21050 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71  p->nLTerm);.  sq
21060 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
21070 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64  (" cost %d,%d,%d
21080 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20  \n", p->rSetup, 
21090 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
210a0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
210b0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
210c0 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 65  LAIN.  /* If the
210d0 20 30 78 31 30 30 20 62 69 74 20 6f 66 20 77 68   0x100 bit of wh
210e0 65 72 65 74 72 61 63 69 6e 67 20 69 73 20 73 65  eretracing is se
210f0 74 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c 6c  t, then show all
21100 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69   of the constrai
21110 6e 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  nt.  ** expressi
21120 6f 6e 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  ons in the Where
21130 4c 6f 6f 70 2e 61 4c 54 65 72 6d 5b 5d 20 61 72  Loop.aLTerm[] ar
21140 72 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ray..  */.  if( 
21150 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71  p->nLTerm && (sq
21160 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
21170 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 20 20  & 0x100)!=0 ){  
21180 2f 2a 20 57 48 45 52 45 54 52 41 43 45 20 30 78  /* WHERETRACE 0x
21190 31 30 30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  100 */.    int i
211a0 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
211b0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
211c0 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69 74  pVdbe;.    sqlit
211d0 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28 76  e3ExplainBegin(v
211e0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
211f0 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b  i<p->nLTerm; i++
21200 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
21210 72 6d 20 2a 70 54 65 72 6d 20 3d 20 70 2d 3e 61  rm *pTerm = p->a
21220 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  LTerm[i];.      
21230 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
21240 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73  ontinue;.      s
21250 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
21260 6e 74 66 28 76 2c 20 22 20 20 28 25 64 29 20 23  ntf(v, "  (%d) #
21270 25 2d 32 64 20 22 2c 20 69 2b 31 2c 20 28 69 6e  %-2d ", i+1, (in
21280 74 29 28 70 54 65 72 6d 2d 70 57 43 2d 3e 61 29  t)(pTerm-pWC->a)
21290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
212a0 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b 0a  ExplainPush(v);.
212b0 20 20 20 20 20 20 77 68 65 72 65 45 78 70 6c 61        whereExpla
212c0 69 6e 54 65 72 6d 28 76 2c 20 70 54 65 72 6d 29  inTerm(v, pTerm)
212d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
212e0 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20  xplainPop(v);.  
212f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
21300 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  inNL(v);.    }. 
21310 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
21320 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20 20  nFinish(v);.    
21330 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21340 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
21350 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28  VdbeExplanation(
21360 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  v));.  }.#endif.
21370 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
21380 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d  Convert bulk mem
21390 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64  ory into a valid
213a0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
213b0 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a  can be passed.**
213c0 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65   to whereLoopCle
213d0 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a  ar harmlessly..*
213e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
213f0 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72  ereLoopInit(Wher
21400 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e  eLoop *p){.  p->
21410 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65  aLTerm = p->aLTe
21420 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c  rmSpace;.  p->nL
21430 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  Term = 0;.  p->n
21440 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  LSlot = ArraySiz
21450 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  e(p->aLTermSpace
21460 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20  );.  p->wsFlags 
21470 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
21480 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ear the WhereLoo
21490 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76  p.u union.  Leav
214a0 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65  e WhereLoop.pLTe
214b0 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74  rm intact..*/.st
214c0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
214d0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71  oopClearUnion(sq
214e0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
214f0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
21500 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
21510 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
21520 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
21530 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  X) ){.    if( (p
21540 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
21550 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
21560 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e  =0 && p->u.vtab.
21570 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
21580 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
21590 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
215a0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
215b0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
215c0 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
215d0 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  idxStr = 0;.    
215e0 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73  }else if( (p->ws
215f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
21600 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
21610 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
21620 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
21630 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21640 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
21650 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
21660 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
21670 6f 55 6e 72 65 66 28 70 2d 3e 75 2e 62 74 72 65  oUnref(p->u.btre
21680 65 2e 70 49 6e 64 65 78 2d 3e 70 4b 65 79 49 6e  e.pIndex->pKeyIn
21690 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
216a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
216b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b  u.btree.pIndex);
216c0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
216d0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
216e0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
216f0 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65   Deallocate inte
21700 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64  rnal memory used
21710 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20   by a WhereLoop 
21720 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
21730 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
21740 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62  lear(sqlite3 *db
21750 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
21760 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
21770 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
21780 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
21790 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
217a0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
217b0 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20  rUnion(db, p);. 
217c0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
217d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  );.}../*.** Incr
217e0 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ease the memory 
217f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
21800 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74  Loop->aLTerm[] t
21810 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e  o be at least n.
21820 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
21830 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73  hereLoopResize(s
21840 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
21850 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29  eLoop *p, int n)
21860 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a  {.  WhereTerm **
21870 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e  paNew;.  if( p->
21880 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75  nLSlot>=n ) retu
21890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
218a0 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20  n = (n+7)&~7;.  
218b0 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  paNew = sqlite3D
218c0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
218d0 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
218e0 30 5d 29 2a 28 69 36 34 29 6e 29 3b 0a 20 20 69  0])*(i64)n);.  i
218f0 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
21900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
21910 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  M;.  memcpy(paNe
21920 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
21930 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
21940 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
21950 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
21960 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
21970 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21980 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
21990 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e   p->aLTerm = paN
219a0 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20  ew;.  p->nLSlot 
219b0 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = n;.  return SQ
219c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
219d0 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65  * Transfer conte
219e0 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  nt from the seco
219f0 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68  nd pLoop into th
21a00 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  e first..*/.stat
21a10 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
21a20 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Xfer(sqlite3 *db
21a30 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f  , WhereLoop *pTo
21a40 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72  , WhereLoop *pFr
21a50 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  om){.  whereLoop
21a60 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70  ClearUnion(db, p
21a70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65  To);.  if( where
21a80 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
21a90 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72  To, pFrom->nLTer
21aa0 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  m) ){.    memset
21ab0 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a  (&pTo->u, 0, siz
21ac0 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20  eof(pTo->u));.  
21ad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21ae0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
21af0 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
21b00 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
21b10 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
21b20 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
21b30 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
21b40 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
21b50 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
21b60 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
21b70 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
21b80 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
21b90 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
21ba0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
21bb0 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
21bc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21bd0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
21be0 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
21bf0 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
21c00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
21c10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21c20 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
21c30 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
21c40 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
21c50 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
21c60 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
21c70 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
21c80 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
21c90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
21ca0 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
21cb0 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
21cc0 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
21cd0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
21ce0 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
21cf0 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
21d00 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
21d10 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
21d20 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
21d30 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
21d40 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
21d50 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
21d60 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
21d70 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
21d80 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
21d90 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
21da0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
21db0 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
21dc0 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
21dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
21de0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
21df0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
21e00 75 72 6e 20 54 52 55 45 20 69 66 20 62 6f 74 68  urn TRUE if both
21e10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
21e20 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
21e30 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
21e40 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
21e50 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
21e60 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72    (2)  X is a pr
21e70 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
21e80 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65  .**.** By "prope
21e90 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61  r subset" we mea
21ea0 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  n that X uses fe
21eb0 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
21ec0 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59   terms.** than Y
21ed0 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
21ee0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
21ef0 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
21f00 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59  lso used.** by Y
21f10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
21f20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
21f30 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
21f40 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
21f50 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
21f60 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
21f70 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
21f80 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
21f90 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
21fa0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
21fb0 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
21fc0 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
21fd0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21fe0 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
21ff0 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20  rProperSubset(. 
22000 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
22010 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46   *pX,       /* F
22020 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  irst WhereLoop t
22030 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63  o compare */.  c
22040 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
22050 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  pY        /* Com
22060 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69  pare against thi
22070 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29  s WhereLoop */.)
22080 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
22090 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 20 3e  if( pX->nLTerm >
220a0 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 20 29 20 72  = pY->nLTerm ) r
220b0 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73  eturn 0; /* X is
220c0 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66   not a subset of
220d0 20 59 20 2a 2f 0a 20 20 69 66 28 20 70 58 2d 3e   Y */.  if( pX->
220e0 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e  rRun >= pY->rRun
220f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   ){.    if( pX->
22100 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20  rRun > pY->rRun 
22110 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
22120 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
22130 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28  han Y */.    if(
22140 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e   pX->nOut > pY->
22150 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b  nOut ) return 0;
22160 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
22170 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
22180 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c  }.  for(i=pX->nL
22190 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
221a0 2d 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59  -){.    for(j=pY
221b0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
221c0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; j--){.      if
221d0 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  ( pY->aLTerm[j]=
221e0 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29  =pX->aLTerm[i] )
221f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22200 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75    if( j<0 ) retu
22210 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20  rn 0;  /* X not 
22220 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69  a subset of Y si
22230 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f  nce term X[i] no
22240 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20  t used by Y */. 
22250 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20   }.  return 1;  
22260 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e  /* All condition
22270 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  s meet */.}../*.
22280 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74  ** Try to adjust
22290 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65   the cost of Whe
222a0 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65  reLoop pTemplate
222b0 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e   upwards or down
222c0 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74  wards so.** that
222d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54  :.**.**   (1) pT
222e0 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65  emplate costs le
222f0 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65  ss than any othe
22300 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61  r WhereLoops tha
22310 74 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a  t are a proper.*
22320 2a 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f  *       subset o
22330 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a  f pTemplate.**.*
22340 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74  *   (2) pTemplat
22350 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61  e costs more tha
22360 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
22370 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68  eLoops for which
22380 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20   pTemplate.**   
22390 20 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20      is a proper 
223a0 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  subset..**.** To
223b0 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20   say "WhereLoop 
223c0 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
223d0 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73  bset of Y" means
223e0 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77   that X uses few
223f0 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  er.** WHERE clau
22400 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20  se terms than Y 
22410 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57  and that every W
22420 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
22430 20 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a   used by X is.**
22440 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e   also used by Y.
22450 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 64 6a 75  .**.** This adju
22460 73 74 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65  stment is omitte
22470 64 20 66 6f 72 20 53 4b 49 50 53 43 41 4e 20 6c  d for SKIPSCAN l
22480 6f 6f 70 73 2e 20 20 49 6e 20 61 20 53 4b 49 50  oops.  In a SKIP
22490 53 43 41 4e 20 6c 6f 6f 70 2c 20 74 68 65 0a 2a  SCAN loop, the.*
224a0 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4c 54 65  * WhereLoop.nLTe
224b0 72 6d 20 66 69 65 6c 64 20 69 73 20 6e 6f 74 20  rm field is not 
224c0 61 6e 20 61 63 63 75 72 61 74 65 20 6d 65 61 73  an accurate meas
224d0 75 72 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ure of the numbe
224e0 72 20 6f 66 20 57 48 45 52 45 0a 2a 2a 20 63 6c  r of WHERE.** cl
224f0 61 75 73 65 20 74 65 72 6d 73 20 63 6f 76 65 72  ause terms cover
22500 65 64 2c 20 73 69 6e 63 65 20 73 6f 6d 65 20 6f  ed, since some o
22510 66 20 74 68 65 20 66 69 72 73 74 20 6e 4c 54 65  f the first nLTe
22520 72 6d 20 65 6e 74 72 69 65 73 20 69 6e 20 61 4c  rm entries in aL
22530 54 65 72 6d 5b 5d 0a 2a 2a 20 77 69 6c 6c 20 62  Term[].** will b
22540 65 20 4e 55 4c 4c 20 28 62 65 63 61 75 73 65 20  e NULL (because 
22550 74 68 65 79 20 61 72 65 20 73 6b 69 70 70 65 64  they are skipped
22560 29 2e 20 20 54 68 61 74 20 6d 61 6b 65 73 20 69  ).  That makes i
22570 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74  t more difficult
22580 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  .** to compare t
22590 68 65 20 6c 6f 6f 70 73 2e 20 20 57 65 20 63 6f  he loops.  We co
225a0 75 6c 64 20 61 64 64 20 65 78 74 72 61 20 63 6f  uld add extra co
225b0 64 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  de to do the com
225c0 70 61 72 69 73 6f 6e 2c 20 61 6e 64 0a 2a 2a 20  parison, and.** 
225d0 70 65 72 68 61 70 73 20 77 65 20 77 69 6c 6c 20  perhaps we will 
225e0 73 6f 6d 65 64 61 79 2e 20 20 42 75 74 20 53 4b  someday.  But SK
225f0 49 50 53 43 41 4e 20 69 73 20 73 75 66 66 69 63  IPSCAN is suffic
22600 69 65 6e 74 6c 79 20 75 6e 63 6f 6d 6d 6f 6e 2c  iently uncommon,
22610 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 61 64 6a   and this.** adj
22620 75 73 74 6d 65 6e 74 20 69 73 20 73 75 66 66 69  ustment is suffi
22630 63 69 65 6e 74 20 6d 69 6e 6f 72 2c 20 74 68 61  cient minor, tha
22640 74 20 69 74 20 69 73 20 76 65 72 79 20 64 69 66  t it is very dif
22650 66 69 63 75 6c 74 20 74 6f 20 63 6f 6e 73 74 72  ficult to constr
22660 75 63 74 0a 2a 2a 20 61 20 74 65 73 74 20 63 61  uct.** a test ca
22670 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78 74  se where the ext
22680 72 61 20 63 6f 64 65 20 77 6f 75 6c 64 20 69 6d  ra code would im
22690 70 72 6f 76 65 20 74 68 65 20 71 75 65 72 79 20  prove the query 
226a0 70 6c 61 6e 2e 20 20 42 65 74 74 65 72 0a 2a 2a  plan.  Better.**
226b0 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 61 64   to avoid the ad
226c0 64 65 64 20 63 6f 6d 70 6c 65 78 69 74 79 20 61  ded complexity a
226d0 6e 64 20 6a 75 73 74 20 6f 6d 69 74 20 63 6f 73  nd just omit cos
226e0 74 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f  t adjustments to
226f0 20 53 4b 49 50 53 43 41 4e 0a 2a 2a 20 6c 6f 6f   SKIPSCAN.** loo
22700 70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ps..*/.static vo
22710 69 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75  id whereLoopAdju
22720 73 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65  stCost(const Whe
22730 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65  reLoop *p, Where
22740 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
22750 7b 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61  {.  if( (pTempla
22760 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
22770 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
22780 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
22790 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
227a0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
227b0 53 43 41 4e 29 21 3d 30 20 29 20 72 65 74 75 72  SCAN)!=0 ) retur
227c0 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d  n;.  for(; p; p=
227d0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
227e0 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
227f0 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
22800 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22810 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
22820 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
22830 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
22840 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
22850 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
22860 53 43 41 4e 29 21 3d 30 20 29 20 63 6f 6e 74 69  SCAN)!=0 ) conti
22870 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65  nue;.    if( whe
22880 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
22890 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54 65  perSubset(p, pTe
228a0 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20  mplate) ){.     
228b0 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70   /* Adjust pTemp
228c0 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61  late cost downwa
228d0 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
228e0 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69 74   cheaper than it
228f0 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73  s .      ** subs
22900 65 74 20 70 20 2a 2f 0a 20 20 20 20 20 20 70 54  et p */.      pT
22910 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
22920 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
22930 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
22940 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20   p->nOut - 1;.  
22950 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
22960 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
22970 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
22980 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  te, p) ){.      
22990 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
229a0 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20  ate cost upward 
229b0 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f  so that it is co
229c0 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69  stlier than p si
229d0 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65  nce.      ** pTe
229e0 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70  mplate is a prop
229f0 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a  er subset of p *
22a00 2f 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  /.      pTemplat
22a10 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75  e->rRun = p->rRu
22a20 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  n;.      pTempla
22a30 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f  te->nOut = p->nO
22a40 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ut + 1;.    }.  
22a50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  }.}../*.** Searc
22a60 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  h the list of Wh
22a70 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50  ereLoops in *ppP
22a80 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  rev looking for 
22a90 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a  one that can be.
22aa0 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79  ** supplanted by
22ab0 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a   pTemplate..**.*
22ac0 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
22ad0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c   the WhereLoop l
22ae0 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ist contains an 
22af0 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73  entry that can s
22b00 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70  upplant.** pTemp
22b10 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  late, in other w
22b20 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74  ords if pTemplat
22b30 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e  e does not belon
22b40 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  g on the list..*
22b50 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20  *.** If pX is a 
22b60 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70  WhereLoop that p
22b70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70  Template can sup
22b80 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75  plant, then retu
22b90 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74  rn the.** link t
22ba0 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58  hat points to pX
22bb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70  ..**.** If pTemp
22bc0 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70  late cannot supp
22bd0 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e  lant any existin
22be0 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  g element of the
22bf0 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a   list but needs.
22c00 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ** to be added t
22c10 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e  o the list, then
22c20 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
22c30 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66  r to the tail of
22c40 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
22c50 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a  atic WhereLoop *
22c60 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65  *whereLoopFindLe
22c70 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  sser(.  WhereLoo
22c80 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f  p **ppPrev,.  co
22c90 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
22ca0 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68  Template.){.  Wh
22cb0 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f  ereLoop *p;.  fo
22cc0 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70  r(p=(*ppPrev); p
22cd0 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65  ; ppPrev=&p->pNe
22ce0 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65  xtLoop, p=*ppPre
22cf0 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  v){.    if( p->i
22d00 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Tab!=pTemplate->
22d10 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74  iTab || p->iSort
22d20 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Idx!=pTemplate->
22d30 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20  iSortIdx ){.    
22d40 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74    /* If either t
22d50 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74  he iTab or iSort
22d60 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74  Idx values for t
22d70 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65  wo WhereLoop are
22d80 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20   different.     
22d90 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57   ** then those W
22da0 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74  hereLoops need t
22db0 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  o be considered 
22dc0 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69  separately.  Nei
22dd0 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ther is.      **
22de0 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
22df0 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65  replace the othe
22e00 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  r. */.      cont
22e10 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
22e20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  /* In the curren
22e30 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
22e40 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c  , the rSetup val
22e50 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ue is either zer
22e60 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20  o.    ** or the 
22e70 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67  cost of building
22e80 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
22e90 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20  dex (NlogN) and 
22ea0 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a  the NlogN.    **
22eb0 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72   is the same for
22ec0 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72   compatible Wher
22ed0 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61  eLoops. */.    a
22ee0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
22ef0 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65  ==0 || pTemplate
22f00 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20  ->rSetup==0 .   
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
22f20 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d   p->rSetup==pTem
22f30 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
22f40 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f  ..    /* whereLo
22f50 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77  opAddBtree() alw
22f60 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e  ays generates an
22f70 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75  d inserts the au
22f80 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20  tomatic index.  
22f90 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e    ** case first.
22fa0 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62    Hence compatib
22fb0 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65  le candidate Whe
22fc0 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61  reLoops never ha
22fd0 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20  ve a larger.    
22fe0 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20  ** rSetup. Call 
22ff0 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52  this SETUP-INVAR
23000 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65  IANT */.    asse
23010 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
23020 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
23030 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65   );..    /* If e
23040 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
23050 70 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68  p p is better th
23060 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54  an pTemplate, pT
23070 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20  emplate can be. 
23080 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e     ** discarded.
23090 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73    WhereLoop p is
230a0 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20   better if:.    
230b0 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20  **   (1)  p has 
230c0 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e  no more dependen
230d0 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c  cies than pTempl
230e0 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ate, and.    ** 
230f0 20 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20    (2)  p has an 
23100 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63  equal or lower c
23110 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ost than pTempla
23120 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  te.    */.    if
23130 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
23140 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
23150 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20  )==p->prereq    
23160 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20  /* (1)  */.     
23170 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54  && p->rSetup<=pT
23180 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
231b0 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65   && p->rRun<=pTe
231c0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231e0 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
231f0 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54    && p->nOut<=pT
23200 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20  emplate->nOut   
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20     /* (2c) */.  
23230 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
23240 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64  n 0;  /* Discard
23250 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
23260 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70    }..    /* If p
23270 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61  Template is alwa
23280 79 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  ys better than p
23290 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74  , then cause p t
232a0 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
232b0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65  .    ** with pTe
232c0 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61  mplate.  pTempla
232d0 74 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61  te is better tha
232e0 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20  n p if:.    **  
232f0 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (1)  pTemplate 
23300 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
23310 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20  ndences than p, 
23320 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
23330 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20    pTemplate has 
23340 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
23350 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20  r cost than p.. 
23360 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
23370 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
23380 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
23390 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
233a0 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
233b0 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70     && p->rRun>=p
233c0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
233f0 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  a) */.     && p-
23400 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65  >nOut>=pTemplate
23410 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  ->nOut          
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23430 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20     /* (2b) */.  
23440 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
23450 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
23460 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
23470 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41  ); /* SETUP-INVA
23480 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20  RIANT above */. 
23490 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a       break;   /*
234a0 20 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f   Cause p to be o
234b0 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54  verwritten by pT
234c0 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d  emplate */.    }
234d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70  .  }.  return pp
234e0 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Prev;.}../*.** I
234f0 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65  nsert or replace
23500 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74   a WhereLoop ent
23510 72 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d  ry using the tem
23520 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a  plate supplied..
23530 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
23540 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  g WhereLoop entr
23550 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77  y might be overw
23560 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65  ritten if the ne
23570 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73  w template.** is
23580 20 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20   better and has 
23590 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
235a0 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70  es.  Or the temp
235b0 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e  late will be ign
235c0 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69  ored.** and no i
235d0 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72  nsert will occur
235e0 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
235f0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73  WhereLoop is fas
23600 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66  ter and has.** f
23610 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
23620 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c  s than the templ
23630 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ate.  Otherwise 
23640 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
23650 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65  is.** added base
23660 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  d on the templat
23670 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69  e..**.** If pBui
23680 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
23690 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65  not NULL then we
236a0 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79   care about only
236b0 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69   the.** prerequi
236c0 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61  sites and rRun a
236d0 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66  nd nOut costs of
236e0 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70   the N best loop
236f0 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f  s.  That.** info
23700 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65  rmation is gathe
23710 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c  red in the pBuil
23720 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65  der->pOrSet obje
23730 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61  ct.  This specia
23740 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20  l.** processing 
23750 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  mode is used onl
23760 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  y for OR clause 
23770 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
23780 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74  * When accumulat
23790 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f  ing multiple loo
237a0 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65  ps (when pBuilde
237b0 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c  r->pOrSet is NUL
237c0 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d  L) we.** still m
237d0 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73  ight overwrite s
237e0 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74  imilar loops wit
237f0 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  h the new templa
23800 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77  te if the.** new
23810 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74   template is bet
23820 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20  ter.  Loops may 
23830 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
23840 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
23850 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
23860 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re met:.**.**   
23870 20 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20   (1)  They have 
23880 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a  the same iTab..*
23890 2a 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68  *    (2)  They h
238a0 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f  ave the same iSo
238b0 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29  rtIdx..**    (3)
238c0 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
238d0 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72  as same or fewer
238e0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
238f0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
23900 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54  oop.**    (4)  T
23910 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
23920 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65  the same or lowe
23930 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20  r cost than the 
23940 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a  current loop.*/.
23950 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
23960 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65  LoopInsert(Where
23970 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
23980 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70  ilder, WhereLoop
23990 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
239a0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
239b0 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49  ev, *p;.  WhereI
239c0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
239d0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
239e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
239f0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
23a00 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
23a10 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
23a20 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f   defined, then o
23a30 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  nly keep track o
23a40 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a  f the costs.  **
23a50 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20   and prereqs..  
23a60 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
23a70 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a  r->pOrSet!=0 ){.
23a80 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
23a90 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e  NABLED.    u16 n
23aa0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
23ab0 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20  Set->n;.    int 
23ac0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77  x =.#endif.    w
23ad0 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75  hereOrInsert(pBu
23ae0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70  ilder->pOrSet, p
23af0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
23b00 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  , pTemplate->rRu
23b10 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
23b40 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45  ->nOut);.#if WHE
23b50 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
23b60 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
23b70 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
23b80 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
23b90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23ba0 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25  rintf(x?"   or-%
23bb0 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20  d:  ":"   or-X: 
23bc0 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68   ", n);.      wh
23bd0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
23be0 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
23bf0 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
23c00 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
23c10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
23c30 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
23c40 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
23c50 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
23c60 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
23c70 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
23c80 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
23c90 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
23ca0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
23cb0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
23cc0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
23cd0 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
23ce0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
23cf0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
23d00 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
23d10 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
23d20 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
23d30 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
23d40 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
23d50 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
23d60 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
23d70 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
23d80 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
23d90 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
23da0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
23db0 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f  gPrintf("ins-noo
23dc0 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  p: ");.      whe
23dd0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
23de0 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
23df0 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  >pWC);.    }.#en
23e00 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
23e10 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65  QLITE_OK;  .  }e
23e20 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70  lse{.    p = *pp
23e30 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Prev;.  }..  /* 
23e40 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
23e50 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20   point it means 
23e60 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20  that either p[] 
23e70 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72  should be overwr
23e80 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20  itten.  ** with 
23e90 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70  pTemplate[] if p
23ea0 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66  [] exists, or if
23eb0 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   p==NULL then al
23ec0 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a  locate a new.  *
23ed0 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20  * WhereLoop and 
23ee0 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a  insert it..  */.
23ef0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
23f00 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
23f10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
23f20 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
23f30 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29  {.    if( p!=0 )
23f40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
23f50 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
23f60 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20  del:  ");.      
23f70 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
23f80 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
23f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23fa0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23fb0 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20  ins-new:  ");.  
23fc0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
23fd0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
23fe0 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
23ff0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
24000 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
24010 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
24020 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
24030 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
24040 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
24050 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
24060 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
24070 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
24080 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
24090 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
240a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65  NOMEM;.    where
240b0 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20  LoopInit(p);.   
240c0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20   p->pNextLoop = 
240d0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
240e0 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76  /* We will be ov
240f0 65 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c  erwriting WhereL
24100 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65  oop p[].  But be
24110 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73  fore we do, firs
24120 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f  t.    ** go thro
24130 75 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ugh the rest of 
24140 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c  the list and del
24150 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e  ete any other en
24160 74 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20  tries besides.  
24170 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72    ** p[] that ar
24180 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64  e also supplated
24190 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
241a0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
241b0 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e  *ppTail = &p->pN
241c0 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65  extLoop;.    Whe
241d0 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a  reLoop *pToDel;.
241e0 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61      while( *ppTa
241f0 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61  il ){.      ppTa
24200 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  il = whereLoopFi
24210 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c  ndLesser(ppTail,
24220 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20   pTemplate);.   
24230 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 70 54     if( NEVER(ppT
24240 61 69 6c 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  ail==0) ) break;
24250 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20  .      pToDel = 
24260 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69  *ppTail;.      i
24270 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62  f( pToDel==0 ) b
24280 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54  reak;.      *ppT
24290 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e  ail = pToDel->pN
242a0 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45  extLoop;.#if WHE
242b0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
242c0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
242d0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
242e0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
242f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
24300 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64  bugPrintf("ins-d
24310 65 6c 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  el: ");.        
24320 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
24330 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
24340 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
24350 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
24360 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
24370 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
24380 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66   }.  whereLoopXf
24390 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c  er(db, p, pTempl
243a0 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ate);.  if( (p->
243b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
243c0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
243d0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
243e0 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72  Index = p->u.btr
243f0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
24400 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e  f( pIndex && pIn
24410 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a  dex->tnum==0 ){.
24420 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
24430 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
24440 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
24460 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57  .** Adjust the W
24470 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61  hereLoop.nOut va
24480 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20  lue downward to 
24490 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d  account for term
244a0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52  s of the.** WHER
244b0 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65  E clause that re
244c0 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70  ference the loop
244d0 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
244e0 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a  ot used by an.**
244f0 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e   index..**.** In
24500 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
24510 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65  lementation, the
24520 20 66 69 72 73 74 20 65 78 74 72 61 20 57 48 45   first extra WHE
24530 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 72  RE clause term r
24540 65 64 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75  educes.** the nu
24550 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
24560 6f 77 73 20 62 79 20 61 20 66 61 63 74 6f 72 20  ows by a factor 
24570 6f 66 20 31 30 20 61 6e 64 20 65 61 63 68 20 61  of 10 and each a
24580 64 64 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a  dditional term.*
24590 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  * reduces the nu
245a0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
245b0 6f 77 73 20 62 79 20 73 71 72 74 28 32 29 2e 0a  ows by sqrt(2)..
245c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
245d0 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
245e0 6a 75 73 74 28 57 68 65 72 65 43 6c 61 75 73 65  just(WhereClause
245f0 20 2a 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70   *pWC, WhereLoop
24600 20 2a 70 4c 6f 6f 70 29 7b 0a 20 20 57 68 65 72   *pLoop){.  Wher
24610 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
24620 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  X;.  Bitmask not
24630 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f  Allowed = ~(pLoo
24640 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d  p->prereq|pLoop-
24650 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e  >maskSelf);.  in
24660 74 20 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21  t i, j;..  if( !
24670 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
24680 6c 65 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  led(pWC->pWInfo-
24690 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  >pParse->db, SQL
246a0 49 54 45 5f 41 64 6a 75 73 74 4f 75 74 45 73 74  ITE_AdjustOutEst
246b0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
246c0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43  .  }.  for(i=pWC
246d0 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70  ->nTerm, pTerm=p
246e0 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  WC->a; i>0; i--,
246f0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
24700 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  f( (pTerm->wtFla
24710 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
24720 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  L)!=0 ) break;. 
24730 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
24740 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
24750 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29  ->maskSelf)==0 )
24760 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
24770 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
24780 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65  qAll & notAllowe
24790 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  d)!=0 ) continue
247a0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f  ;.    for(j=pLoo
247b0 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d  p->nLTerm-1; j>=
247c0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; j--){.      p
247d0 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  X = pLoop->aLTer
247e0 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
247f0 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pX==0 ) continue
24800 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
24810 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
24820 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61       if( pX->iPa
24830 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43  rent>=0 && (&pWC
24840 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d  ->a[pX->iParent]
24850 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b  )==pTerm ) break
24860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24870 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  j<0 ){.      pLo
24880 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 54 65  op->nOut += (pTe
24890 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
248a0 20 3f 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50   ? pTerm->truthP
248b0 72 6f 62 20 3a 20 2d 31 29 3b 0a 20 20 20 20 7d  rob : -1);.    }
248c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65  .  }.}../*.** We
248d0 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
248e0 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
248f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
24900 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
24910 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
24920 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
24930 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
24940 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
24950 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
24960 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
24970 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
24980 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
24990 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
249a0 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
249b0 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
249c0 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
249d0 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
249e0 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
249f0 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
24a00 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
24a10 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
24a20 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
24a30 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
24a40 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
24a50 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
24a60 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
24a70 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
24a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
24a90 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
24aa0 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
24ab0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
24ac0 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
24ad0 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
24ae0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
24af0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
24b00 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
24b10 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
24b20 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
24b30 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b50 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
24b60 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
24b70 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
24b80 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
24b90 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
24ba0 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
24bb0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
24bc0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
24bd0 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
24be0 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
24bf0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
24c00 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
24c10 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
24c20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
24c30 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
24c40 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
24c50 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
24c60 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
24c70 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
24c80 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
24c90 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
24ca0 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
24cb0 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
24cc0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
24cd0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
24ce0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
24cf0 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
24d00 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
24d10 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
24d20 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
24d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
24d40 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
24d50 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
24d60 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
24d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24d80 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
24d90 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
24da0 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
24db0 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
24dc0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
24dd0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
24de0 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
24df0 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
24e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
24e10 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
24e20 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
24e30 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
24e60 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
24e70 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
24e80 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20   saved_nSkip;   
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ea0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
24eb0 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
24ec0 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73  nSkip */.  u32 s
24ed0 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
24ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
24ef0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
24f00 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
24f10 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f  .  LogEst saved_
24f20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
24f30 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
24f40 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
24f50 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ut */.  int iCol
24f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24f70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
24f80 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   of the column i
24f90 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
24fa0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24fb0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
24fc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
24fd0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
24fe0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
24ff0 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
25000 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
25010 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
25020 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
25030 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
25040 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
25050 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
25060 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
25070 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
25080 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
25090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
250a0 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
250b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
250c0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
250d0 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
250e0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
250f0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
25100 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
25110 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
25120 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
25130 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
25140 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
25150 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62   }else if( pProb
25160 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70  e->tnum<=0 || (p
25170 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
25180 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
25190 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
251a0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
251b0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
251c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
251d0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
251e0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  IN|WO_ISNULL|WO_
251f0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
25200 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_LE;.  }.  if( 
25210 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
25220 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
25230 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
25240 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
25250 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
25260 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d  ree.nEq<=pProbe-
25270 3e 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 69 66  >nKeyCol );.  if
25280 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
25290 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b  nEq < pProbe->nK
252a0 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 69 43 6f  eyCol ){.    iCo
252b0 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
252c0 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  lumn[pNew->u.btr
252d0 65 65 2e 6e 45 71 5d 3b 0a 20 20 7d 65 6c 73 65  ee.nEq];.  }else
252e0 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b  {.    iCol = -1;
252f0 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77  .  }.  pTerm = w
25300 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
25310 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  an, pBuilder->pW
25320 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  C, pSrc->iCursor
25330 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  , iCol,.        
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25350 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  opMask, pProbe);
25360 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70  .  saved_nEq = p
25370 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
25380 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20  ;.  saved_nSkip 
25390 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
253a0 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e  nSkip;.  saved_n
253b0 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c  LTerm = pNew->nL
253c0 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73  Term;.  saved_ws
253d0 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73  Flags = pNew->ws
253e0 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70  Flags;.  saved_p
253f0 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72  rereq = pNew->pr
25400 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f  ereq;.  saved_nO
25410 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ut = pNew->nOut;
25420 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
25430 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  = 0;.  rLogSize 
25440 3d 20 65 73 74 4c 6f 67 28 70 50 72 6f 62 65 2d  = estLog(pProbe-
25450 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29  >aiRowLogEst[0])
25460 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  ;..  /* Consider
25470 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63   using a skip-sc
25480 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  an if there are 
25490 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
254a0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
254b0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
254c0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
254d0 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ms of the index,
254e0 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72   and if the aver
254f0 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
25500 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68  of repeats in th
25510 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
25520 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38  s is at least 18
25530 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
25540 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38   magic number 18
25550 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20   is selected on 
25560 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73  the basis that s
25570 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a  canning 17 rows.
25580 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61    ** is almost a
25590 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68  lways quicker th
255a0 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b  an an index seek
255b0 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66   (even though if
255c0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
255d0 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
255e0 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65  han 2^17 rows we
255f0 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73   assume otherwis
25600 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73  e in other parts
25610 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64   of.  ** the cod
25620 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66  e). And, even if
25630 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73   it is not, it s
25640 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f  hould not be too
25650 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20   much slower. . 
25660 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
25670 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61   hand, the extra
25680 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64   seeks could end
25690 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66   up being signif
256a0 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72  icantly.  ** mor
256b0 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f  e expensive.  */
256c0 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73  .  assert( 42==s
256d0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29  qlite3LogEst(18)
256e0 20 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d   );.  if( pTerm=
256f0 3d 30 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  =0.   && saved_n
25700 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
25710 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
25720 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
25730 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
25740 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
25750 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
25760 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
25770 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
25780 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
25790 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
257a0 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
257b0 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
257c0 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
257d0 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
257e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
257f0 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ++;.    pNew->u.
25800 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20  btree.nSkip++;. 
25810 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
25820 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
25830 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
25840 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
25850 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
25860 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ter = pProbe->ai
25870 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
25880 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
25890 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
258a0 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65  _nEq+1];.    pNe
258b0 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72  w->nOut -= nIter
258c0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41  ;.    whereLoopA
258d0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
258e0 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
258f0 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e  obe, nIter + nIn
25900 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Mul);.    pNew->
25910 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
25920 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72  t;.  }.  for(; r
25930 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25940 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20  pTerm!=0; pTerm 
25950 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
25960 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36  &scan)){.    u16
25970 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f   eOp = pTerm->eO
25980 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68  perator;   /* Sh
25990 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72  orthand for pTer
259a0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  m->eOperator */.
259b0 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
259c0 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20  Idx;.    LogEst 
259d0 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20  nOutUnadjusted; 
259e0 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62         /* nOut b
259f0 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57  efore IN() and W
25a00 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73  HERE adjustments
25a10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20   */.    int nIn 
25a20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
25a30 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
25a40 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
25a50 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
25a60 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
25a70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
25a80 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   (eOp==WO_ISNULL
25a90 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   || (pTerm->wtFl
25aa0 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21  ags&TERM_VNULL)!
25ab0 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f  =0).     && (iCo
25ac0 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61  l<0 || pSrc->pTa
25ad0 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
25ae0 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20  tNull).    ){.  
25af0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
25b00 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
25b10 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
25b20 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
25b30 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
25b40 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
25b50 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
25b60 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
25b70 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77  tinue;..    pNew
25b80 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
25b90 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
25ba0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
25bb0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
25bc0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
25bd0 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
25be0 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
25bf0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
25c00 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
25c10 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
25c20 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
25c30 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
25c40 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
25c50 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
25c60 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
25c70 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
25c80 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
25c90 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73  skSelf;..    ass
25ca0 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  ert( nInMul==0. 
25cb0 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
25cc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25cd0 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30  _COLUMN_NULL)!=0
25ce0 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
25cf0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
25d00 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d  ERE_COLUMN_IN)!=
25d10 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  0 .        || (p
25d20 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
25d30 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d  HERE_SKIPSCAN)!=
25d40 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  0 .    );..    i
25d50 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  f( eOp & WO_IN )
25d60 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
25d70 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
25d80 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
25d90 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
25da0 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
25db0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
25dc0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
25dd0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
25de0 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
25df0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
25e00 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
25e10 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
25e20 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  s */.        nIn
25e30 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
25e40 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  46==sqlite3LogEs
25e50 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d  t(25) );.      }
25e60 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
25e70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
25e80 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
25e90 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
25ea0 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
25eb0 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
25ec0 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
25ed0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
25ee0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
25ef0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
25f00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
25f10 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
25f20 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
25f30 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
25f40 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20    ** changes "x 
25f70 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d  IN (?)" into "x=
25f80 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73  ?". */..    }els
25f90 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
25fa0 45 51 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  EQ) ){.      pNe
25fb0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
25fc0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
25fd0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
25fe0 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26  || (nInMul==0 &&
25ff0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
26000 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
26010 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Col-1) ){.      
26020 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
26030 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72   pProbe->onError
26040 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  ==OE_None ){.   
26050 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
26060 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
26070 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20  Q_WANTED;.      
26080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26090 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
260a0 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
260b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
260c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
260d0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
260e0 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  L ){.      pNew-
260f0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
26100 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
26110 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
26120 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
26130 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
26140 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20  se( eOp & WO_GT 
26150 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26160 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29  e( eOp & WO_GE )
26170 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
26180 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
26190 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
261a0 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
261b0 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
261c0 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
261d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
261e0 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
261f0 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
26200 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26210 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
26220 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26230 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
26240 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
26250 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
26260 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
26270 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
26280 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
26290 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
262a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
262b0 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
262c0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
262d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
262e0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
262f0 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a  -2] : 0;.    }..
26300 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
26310 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  oint pNew->nOut 
26320 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
26330 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
26340 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ected to.    ** 
26350 62 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68  be visited by th
26360 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66  e index scan bef
26370 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ore considering 
26380 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74  term pTerm, or t
26390 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
263a0 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d   of nIn and nInM
263b0 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ul. In other wor
263c0 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ds, assuming tha
263d0 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78  t all .    ** "x
263e0 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20   IN(...)" terms 
263f0 61 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74  are replaced wit
26400 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20  h "x = ?". This 
26410 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20  block updates.  
26420 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
26430 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20  f pNew->nOut to 
26440 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72  account for pTer
26450 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e  m (but not nIn/n
26460 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20  InMul).  */.    
26470 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
26480 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
26490 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
264a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
264b0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
264c0 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
264d0 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33  nOut using stat3
264e0 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c  /stat4 data. Or,
264f0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
26500 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20  stat3/stat4.    
26510 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67    ** data, using
26520 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69   some other esti
26530 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mate.  */.      
26540 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
26550 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
26560 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
26570 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pNew);.    }else
26580 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  {.      int nEq 
26590 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  = ++pNew->u.btre
265a0 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73  e.nEq;.      ass
265b0 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49  ert( eOp & (WO_I
265c0 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49  SNULL|WO_EQ|WO_I
265d0 4e 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  N) );..      ass
265e0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
265f0 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
26600 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
26610 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
26620 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
26630 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
26640 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
26650 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
26660 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
26670 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
26680 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
26690 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
266a0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
266b0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
266c0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
266d0 7c 3d 20 57 48 45 52 45 5f 4c 49 4b 45 4c 49 48  |= WHERE_LIKELIH
266e0 4f 4f 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OOD;.      }else
266f0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
26700 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
26710 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74 52  STAT4.        tR
26720 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a  owcnt nOut = 0;.
26730 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d          if( nInM
26740 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ul==0 .         
26750 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  && pProbe->nSamp
26760 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  le .         && 
26770 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
26780 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  q<=pProbe->nSamp
26790 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26  leCol.         &
267a0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
267b0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
267c0 5f 53 74 61 74 33 29 20 0a 20 20 20 20 20 20 20  _Stat3) .       
267d0 20 20 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f    && ((eOp & WO_
267e0 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48  IN)==0 || !ExprH
267f0 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
26800 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
26810 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20 20 20  elect)).        
26820 20 26 26 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   && (pNew->wsFla
26830 67 73 20 26 20 57 48 45 52 45 5f 4c 49 4b 45 4c  gs & WHERE_LIKEL
26840 49 48 4f 4f 44 29 3d 3d 30 0a 20 20 20 20 20 20  IHOOD)==0.      
26850 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
26860 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
26870 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
26880 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
26890 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
268a0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
268b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
268c0 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  Op & WO_EQ );.  
268d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
268e0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  se( eOp & WO_ISN
268f0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ULL );.         
26900 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
26910 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
26920 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
26930 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74  r->pRight, &nOut
26940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
26950 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
26960 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e  rc = whereInScan
26970 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
26980 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70  lder, pExpr->x.p
26990 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  List, &nOut);.  
269a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
269b0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
269c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 4f 75  SQLITE_OK || nOu
269d0 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  t>0 );.         
269e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
269f0 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
26a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
26a10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26a20 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20  ITE_OK ) break; 
26a30 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
26a40 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65 72   out of the pTer
26a50 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  m loop */.      
26a60 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a      if( nOut ){.
26a70 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
26a80 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
26a90 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20  LogEst(nOut);.  
26aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
26ab0 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e  ew->nOut>saved_n
26ac0 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out ) pNew->nOut
26ad0 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
26ae0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
26af0 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
26b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26b10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26b20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66  nOut==0 ).#endif
26b30 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
26b40 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
26b50 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  += (pProbe->aiRo
26b60 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70  wLogEst[nEq] - p
26b70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
26b80 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20  st[nEq-1]);.    
26b90 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20        if( eOp & 
26ba0 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
26bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
26bc0 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20  NG: If there is 
26bd0 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  no likelihood() 
26be0 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68  value, assume th
26bf0 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20 20  at a .          
26c00 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c    ** "col IS NUL
26c10 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  L" expression ma
26c20 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20 6d  tches twice as m
26c30 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20  any rows .      
26c40 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c        ** as (col
26c50 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  =?). */.        
26c60 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
26c70 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
26c80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26c90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
26ca0 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20 74  * Set rCostIdx t
26cb0 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69  o the cost of vi
26cc0 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20  siting selected 
26cd0 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41  rows in index. A
26ce0 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20  dd.    ** it to 
26cf0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63  pNew->rRun, whic
26d00 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  h is currently s
26d10 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  et to the cost o
26d20 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  f the index.    
26d30 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68  ** seek only. Th
26d40 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  en, if this is a
26d50 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
26d60 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73  dex, add the cos
26d70 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69  t of.    ** visi
26d80 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e  ting the rows in
26d90 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
26da0 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64    */.    rCostId
26db0 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  x = pNew->nOut +
26dc0 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d   1 + (15*pProbe-
26dd0 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d  >szIdxRow)/pSrc-
26de0 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  >pTab->szTabRow;
26df0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
26e00 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
26e10 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f  dd(rLogSize, rCo
26e20 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20  stIdx);.    if( 
26e30 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
26e40 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
26e50 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20  |WHERE_IPK))==0 
26e60 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  ){.      pNew->r
26e70 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
26e80 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
26e90 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20  n, pNew->nOut + 
26ea0 31 36 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  16);.    }..    
26eb0 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d  nOutUnadjusted =
26ec0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20   pNew->nOut;.   
26ed0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e   pNew->rRun += n
26ee0 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
26ef0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e   pNew->nOut += n
26f00 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
26f10 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
26f20 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d  Adjust(pBuilder-
26f30 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20  >pWC, pNew);.   
26f40 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
26f50 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
26f60 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
26f70 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
26f80 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
26f90 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
26fa0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
26fb0 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
26fc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
26fd0 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
26fe0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
26ff0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
27000 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
27010 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
27020 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27030 3c 28 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  <(pProbe->nKeyCo
27040 6c 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61  l + (pProbe->zNa
27050 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20  me!=0)).    ){. 
27060 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64       whereLoopAd
27070 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
27080 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
27090 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b  be, nInMul+nIn);
270a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
270b0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
270c0 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ut;.#ifdef SQLIT
270d0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
270e0 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69  R_STAT4.    pBui
270f0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
27100 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e  = nRecValid;.#en
27110 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  dif.  }.  pNew->
27120 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70  prereq = saved_p
27130 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  rereq;.  pNew->u
27140 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
27150 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e  ed_nEq;.  pNew->
27160 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20  u.btree.nSkip = 
27170 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70  saved_nSkip;.  p
27180 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
27190 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
271a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
271b0 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
271c0 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
271d0 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e  nLTerm;.  return
271e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
271f0 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
27200 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
27210 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
27220 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
27230 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
27240 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
27250 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
27260 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
27270 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
27280 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
27290 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
272a0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
272b0 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
272c0 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
272d0 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
272e0 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
272f0 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
27300 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
27310 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
27320 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
27330 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
27340 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
27350 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
27360 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
27370 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  B;.  int ii, jj;
27380 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
27390 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
273a0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
273b0 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
273c0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
273d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
273e0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
273f0 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
27400 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
27410 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
27420 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
27430 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
27440 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
27450 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
27460 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45  rn 0;.    if( pE
27470 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75  xpr->iTable==iCu
27480 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f  rsor ){.      fo
27490 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
274a0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
274b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
274c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
274d0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
274e0 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
274f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27500 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
27510 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
27520 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
27530 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
27540 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
27550 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
27560 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
27570 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
27580 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
27590 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
275a0 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
275b0 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
275c0 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
275d0 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
275e0 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
275f0 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
27600 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
27610 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
27620 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
27630 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  [j];.    if( x>=
27640 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
27650 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b  ase( x==BMS-1 );
27660 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27670 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20   x==BMS-2 );.   
27680 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
27690 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
276a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
276b0 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68  turn m;.}../* Ch
276c0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
276d0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69  partial index wi
276e0 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65  th pPartIndexWhe
276f0 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  re can be used.*
27700 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
27710 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20   query.  Return 
27720 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62  true if it can b
27730 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  e and false if n
27740 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
27750 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72  t whereUsablePar
27760 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54  tialIndex(int iT
27770 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  ab, WhereClause 
27780 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65  *pWC, Expr *pWhe
27790 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  re){.  int i;.  
277a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
277b0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65  ;.  for(i=0, pTe
277c0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
277d0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
277e0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
277f0 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
27800 65 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45  esExpr(pTerm->pE
27810 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61  xpr, pWhere, iTa
27820 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
27830 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
27840 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
27850 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
27860 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
27870 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
27880 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
27890 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20  .** is idenfied 
278a0 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
278b0 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
278c0 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
278d0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
278e0 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
278f0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
27900 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73  .**.** The costs
27910 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e   (WhereLoop.rRun
27920 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  ) of the b-tree 
27930 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74  loops added by t
27940 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
27950 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61  are calculated a
27960 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
27970 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e   For a full scan
27980 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74  , assuming the t
27990 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20  able (or index) 
279a0 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f  contains nRow ro
279b0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ws:.**.**     co
279c0 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20  st = nRow * 3.0 
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279e0 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65     // full-table
279f0 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73   scan.**     cos
27a00 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20  t = nRow * K    
27a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76    // scan of cov
27a30 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
27a40 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
27a50 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20   (K+3.0)        
27a60 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
27a70 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20  of non-covering 
27a80 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72  index.**.** wher
27a90 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62  e K is a value b
27aa0 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
27ab0 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  .0 set based on 
27ac0 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a  the relative .**
27ad0 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61   estimated avera
27ae0 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  ge size of the i
27af0 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
27b00 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ecords..**.** Fo
27b10 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c  r an index scan,
27b20 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73   where nVisit is
27b30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
27b40 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65  ndex rows visite
27b50 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e  d.** by the scan
27b60 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74  , and nSeek is t
27b70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65  he number of see
27b80 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  k operations req
27b90 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65  uired on .** the
27ba0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a   index b-tree:.*
27bb0 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
27bc0 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
27bd0 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29  w) + K * nVisit)
27be0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76            // cov
27bf0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
27c00 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
27c10 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28  * (log(nRow) + (
27c20 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29  K+3.0) * nVisit)
27c30 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72      // non-cover
27c40 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
27c50 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20  Normally, nSeek 
27c60 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75  is 1. nSeek valu
27c70 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
27c80 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20  1 come about if 
27c90 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c  the .** WHERE cl
27ca0 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78  ause includes "x
27cb0 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d   IN (....)" term
27cc0 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
27cd0 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65  of "x=?". Or whe
27ce0 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22  n .** implicit "
27cf0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
27d00 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20  ROM tbl)" terms 
27d10 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b  are added for sk
27d20 69 70 2d 73 63 61 6e 73 2e 0a 2a 2f 0a 73 74 61  ip-scans..*/.sta
27d30 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
27d40 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
27d50 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
27d60 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
27d70 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
27d80 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
27d90 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
27da0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
27db0 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
27dc0 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
27dd0 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
27de0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
27df0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
27e00 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
27e10 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
27e20 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
27e30 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
27e40 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
27e50 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e70 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
27e80 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
27e90 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
27ea0 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50  LogEst aiRowEstP
27eb0 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54  k[2];       /* T
27ec0 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d  he aiRowLogEst[]
27ed0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
27ee0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31  Pk index */.  i1
27ef0 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  6 aiColumnPk = -
27f00 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
27f10 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
27f20 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
27f30 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ex */.  SrcList 
27f40 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20  *pTabList;      
27f50 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
27f60 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
27f70 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27f80 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
27f90 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
27fa0 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
27fb0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
27fc0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
27fd0 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
27fe0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
27ff0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28000 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
28010 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
28020 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31  int iSortIdx = 1
28030 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
28040 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
28050 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
28060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28070 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
28080 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
28090 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
280a0 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
280b0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
280c0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
280d0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
280e0 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
280f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
28100 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
28110 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
28120 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
28130 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
28140 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
28150 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
28160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28170 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
28180 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ried */.  .  pNe
28190 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
281a0 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
281b0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
281c0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
281d0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
281e0 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
281f0 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
28200 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  b;.  pTab = pSrc
28210 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->pTab;.  pWC = 
28220 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
28230 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
28240 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
28250 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
28260 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
28270 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
28280 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
28290 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
282a0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
282b0 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
282c0 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  pIndex;.  }else 
282d0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
282e0 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
282f0 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
28300 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
28310 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
28320 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
28330 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
28340 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
28350 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
28360 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
28370 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
28380 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
28390 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
283a0 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
283b0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
283c0 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
283d0 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
283e0 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
283f0 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
28400 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
28410 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
28420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28430 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
28440 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
28450 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
28460 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
28470 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
28480 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
28490 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
284a0 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
284b0 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73    sPk.aiRowLogEs
284c0 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
284d0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
284e0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
284f0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
28500 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49  Tab;.    sPk.szI
28510 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a  dxRow = pTab->sz
28520 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f  TabRow;.    aiRo
28530 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62  wEstPk[0] = pTab
28540 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
28550 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
28560 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 0;.    pFirst 
28570 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
28580 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
28590 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  rc->notIndexed==
285a0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
285b0 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  e real indices o
285c0 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
285d0 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
285e0 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
285f0 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c  NOT INDEXED qual
28600 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64  ifier is omitted
28610 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63   from the FROM c
28620 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73  lause */.      s
28630 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  Pk.pNext = pFirs
28640 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72  t;.    }.    pPr
28650 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a  obe = &sPk;.  }.
28660 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e    rSize = pTab->
28670 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c  nRowLogEst;.  rL
28680 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
28690 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66  rSize);..#ifndef
286a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
286b0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f  OMATIC_INDEX.  /
286c0 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
286d0 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
286e0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20  uilder->pOrSet. 
286f0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50    && (pWInfo->pP
28700 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
28710 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  & SQLITE_AutoInd
28720 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72  ex)!=0.   && pSr
28730 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  c->pIndex==0.   
28740 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72  && !pSrc->viaCor
28750 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53  outine.   && !pS
28760 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20  rc->notIndexed. 
28770 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54    && HasRowid(pT
28780 61 62 29 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ab).   && !pSrc-
28790 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a 20 20  >isCorrelated.  
287a0 20 26 26 20 21 70 53 72 63 2d 3e 69 73 52 65 63   && !pSrc->isRec
287b0 75 72 73 69 76 65 0a 20 20 29 7b 0a 20 20 20 20  ursive.  ){.    
287c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
287d0 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
287e0 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
287f0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
28800 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
28810 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
28820 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
28830 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
28840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
28850 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
28860 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
28870 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
28880 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
28890 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
288a0 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
288b0 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
288c0 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
288d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
288e0 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
288f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
28900 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a  tree.nSkip = 0;.
28910 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
28920 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
28930 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
28940 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
28950 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
28960 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
28970 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
28980 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
28990 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
289a0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
289b0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70  is.        ** ap
289c0 70 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a  proximately 7*N*
289d0 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20  log2(N) where N 
289e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
289f0 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20   rows in.       
28a00 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
28a10 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a  ing indexed. */.
28a20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
28a30 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
28a40 2b 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20 61  + rSize + 28;  a
28a50 73 73 65 72 74 28 20 32 38 3d 3d 73 71 6c 69 74  ssert( 28==sqlit
28a60 65 33 4c 6f 67 45 73 74 28 37 29 20 29 3b 0a 20  e3LogEst(7) );. 
28a70 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
28a80 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f  : Each index loo
28a90 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f  kup yields 20 ro
28aa0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
28ab0 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a    This.        *
28ac0 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74  * is more than t
28ad0 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f  he usual guess o
28ae0 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65  f 10 rows, since
28af0 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a   we have no way.
28b00 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e          ** of kn
28b10 6f 77 6e 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  owning how selec
28b20 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
28b30 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
28b40 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
28b50 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
28b60 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
28b70 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
28b80 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
28b90 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
28ba0 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
28bb0 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
28bc0 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
28bd0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
28be0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
28bf0 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
28c00 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
28c10 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
28c20 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
28c30 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
28c40 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20  ereq = mExtra | 
28c50 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
28c60 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
28c70 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
28c80 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
28c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28ca0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
28cb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
28cc0 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20  TIC_INDEX */..  
28cd0 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
28ce0 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20   indices.  */.  
28cf0 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
28d00 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70  _OK && pProbe; p
28d10 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
28d20 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29  ext, iSortIdx++)
28d30 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  {.    if( pProbe
28d40 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
28d50 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72  =0.     && !wher
28d60 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
28d70 64 65 78 28 70 4e 65 77 2d 3e 69 54 61 62 2c 20  dex(pNew->iTab, 
28d80 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61  pWC, pProbe->pPa
28d90 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20  rtIdxWhere) ){. 
28da0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
28db0 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78  /* Partial index
28dc0 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66   inappropriate f
28dd0 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
28de0 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65  .    }.    rSize
28df0 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
28e00 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70  LogEst[0];.    p
28e10 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
28e20 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
28e30 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20  u.btree.nSkip = 
28e40 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  0;.    pNew->nLT
28e50 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  erm = 0;.    pNe
28e60 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
28e70 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  .    pNew->rSetu
28e80 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
28e90 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
28ea0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
28eb0 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e   = rSize;.    pN
28ec0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
28ed0 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  ex = pProbe;.   
28ee0 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48   b = indexMightH
28ef0 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70  elpWithOrderBy(p
28f00 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c  Builder, pProbe,
28f10 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b   pSrc->iCursor);
28f20 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50  .    /* The ONEP
28f30 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67  ASS_DESIRED flag
28f40 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74  s never occurs t
28f50 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44  ogether with ORD
28f60 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73  ER BY */.    ass
28f70 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63  ert( (pWInfo->wc
28f80 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28f90 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
28fa0 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a  )==0 || b==0 );.
28fb0 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
28fc0 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  tnum<=0 ){.     
28fd0 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d   /* Integer prim
28fe0 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f  ary key index */
28ff0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
29000 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b  lags = WHERE_IPK
29010 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
29020 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
29030 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
29040 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
29050 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a  dx : 0;.      /*
29060 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
29070 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
29080 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a   is (N*3.0). */.
29090 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
290a0 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20   = rSize + 16;. 
290b0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
290c0 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
290d0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 63 20  pNew);.      rc 
290e0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
290f0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
29100 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
29110 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
29120 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
29130 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
29140 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20      Bitmask m;. 
29150 20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d       if( pProbe-
29160 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20  >isCovering ){. 
29170 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
29180 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58  lags = WHERE_IDX
29190 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e  _ONLY | WHERE_IN
291a0 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d  DEXED;.        m
291b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
291c0 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70  e{.        m = p
291d0 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  Src->colUsed & ~
291e0 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
291f0 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20  Probe);.        
29200 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
29210 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f  (m==0) ? (WHERE_
29220 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
29230 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f  NDEXED) : WHERE_
29240 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d  INDEXED;.      }
29250 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
29260 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a  scan via index *
29270 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20  /.      if( b.  
29280 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69       || !HasRowi
29290 64 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c  d(pTab).       |
292a0 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20  | ( m==0.       
292b0 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e    && pProbe->bUn
292c0 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
292d0 20 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e      && (pProbe->
292e0 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
292f0 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20  zTabRow).       
29300 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
29310 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
29320 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
29330 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
29340 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
29350 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20  nfig.bUseCis.   
29360 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
29370 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49  ationEnabled(pWI
29380 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
29390 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
293a0 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20  Scan).          
293b0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
293c0 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
293d0 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
293e0 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f   : 0;..        /
293f0 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69  * The cost of vi
29400 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  siting the index
29410 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68   rows is N*K, wh
29420 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20  ere K is.       
29430 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20   ** between 1.1 
29440 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69  and 3.0, dependi
29450 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ng on the relati
29460 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a  ve sizes of the.
29470 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
29480 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e   and table rows.
29490 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f   If this is a no
294a0 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
294b0 20 73 63 61 6e 2c 0a 20 20 20 20 20 20 20 20 2a   scan,.        *
294c0 2a 20 61 6c 73 6f 20 61 64 64 20 74 68 65 20 63  * also add the c
294d0 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
294e0 74 61 62 6c 65 20 72 6f 77 73 20 28 4e 2a 33 2e  table rows (N*3.
294f0 30 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  0).  */.        
29500 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
29510 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ze + 1 + (15*pPr
29520 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
29530 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
29540 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20         if( m!=0 
29550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
29560 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
29570 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
29580 3e 72 52 75 6e 2c 20 72 53 69 7a 65 2b 31 36 29  >rRun, rSize+16)
29590 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
295a0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
295b0 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
295c0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 72  pNew);.        r
295d0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
295e0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
295f0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew);.        pNe
29600 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
29610 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
29620 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
29630 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
29640 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
29650 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
29660 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
29670 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
29680 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
29690 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69  R_STAT4.    sqli
296a0 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65  te3Stat4ProbeFre
296b0 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  e(pBuilder->pRec
296c0 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  );.    pBuilder-
296d0 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a  >nRecValid = 0;.
296e0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52      pBuilder->pR
296f0 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ec = 0;.#endif..
29700 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
29710 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
29720 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f  Y clause, then o
29730 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64  nly that one ind
29740 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ex is.    ** con
29750 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20  sidered. */.    
29760 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
29770 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
29780 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
29790 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
297a0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
297b0 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
297c0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
297d0 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  or a table of th
297e0 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65  e join identifie
297f0 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72  d by.** pBuilder
29800 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
29810 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
29820 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
29830 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
29840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
29850 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
29860 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
29870 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
29880 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
29890 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
298a0 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61    Bitmask mExtra
298b0 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
298c0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
298d0 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
298e0 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
298f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29910 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
29920 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
29930 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
29940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
29950 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
29960 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
29970 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a  item *pSrc;   /*
29980 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
29990 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
299a0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
299b0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
299c0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
299d0 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
299e0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
299f0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
29a00 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
29a10 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
29a20 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
29a30 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
29a40 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
29a50 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
29a60 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65   int iTerm, mxTe
29a70 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74  rm;.  int nConst
29a80 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65  raint;.  int see
29a90 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nIn = 0;        
29aa0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
29ab0 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
29ac0 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
29ad0 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20   seenVar = 0;   
29ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
29af0 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74  e if a non-const
29b00 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  ant constraint i
29b10 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
29b20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20  iPhase;         
29b30 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63           /* 0: c
29b40 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20  onst w/o IN, 1: 
29b50 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c  const, 2: no IN,
29b60 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65    2: IN */.  Whe
29b70 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
29b80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29b90 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20  OK;..  pWInfo = 
29ba0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
29bb0 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ;.  pParse = pWI
29bc0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
29bd0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
29be0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
29bf0 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20  ->pWC;.  pNew = 
29c00 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
29c10 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f    pSrc = &pWInfo
29c20 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e  ->pTabList->a[pN
29c30 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61  ew->iTab];.  pTa
29c40 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
29c50 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74    assert( IsVirt
29c60 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70  ual(pTab) );.  p
29c70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61  IdxInfo = alloca
29c80 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
29c90 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70  se, pWC, pSrc, p
29ca0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42  Builder->pOrderB
29cb0 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  y);.  if( pIdxIn
29cc0 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  fo==0 ) return S
29cd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
29ce0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b  New->prereq = 0;
29cf0 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
29d00 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  = 0;.  pNew->wsF
29d10 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
29d20 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65  TUALTABLE;.  pNe
29d30 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
29d40 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
29d50 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55  edFree = 0;.  pU
29d60 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
29d70 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
29d80 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  e;.  nConstraint
29d90 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   = pIdxInfo->nCo
29da0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20  nstraint;.  if( 
29db0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
29dc0 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
29dd0 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
29de0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
29df0 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72  pIdxInfo);.    r
29e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
29e10 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  EM;.  }..  for(i
29e20 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c  Phase=0; iPhase<
29e30 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20  =3; iPhase++){. 
29e40 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26     if( !seenIn &
29e50 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30 20  & (iPhase&1)!=0 
29e60 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b  ){.      iPhase+
29e70 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 68  +;.      if( iPh
29e80 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20  ase>3 ) break;. 
29e90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
29ea0 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65 3e  enVar && iPhase>
29eb0 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  1 ) break;.    p
29ec0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
29ed0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
29ee0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
29ef0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
29f00 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  aint;.    for(i=
29f10 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
29f20 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
29f30 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
29f40 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
29f50 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
29f60 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
29f70 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  C->a[j];.      s
29f80 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29 7b  witch( iPhase ){
29f90 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a  .        case 0:
29fa0 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
29fb0 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72   without IN oper
29fc0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
29fd0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
29fe0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
29ff0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2a000 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2a010 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2a020 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20     seenIn = 1;. 
2a030 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a040 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
2a050 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29  prereqRight!=0 )
2a060 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
2a070 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20  enVar = 1;.     
2a080 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2a090 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2a0a0 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a   & WO_IN)==0 ){.
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
2a0c0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
2a0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a0e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a0f0 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
2a100 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
2a110 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ith IN operators
2a120 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2a130 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a  sert( seenIn );.
2a140 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2a150 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
2a160 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2a170 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==0);.          
2a180 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
2a190 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72  ase 2:    /* Var
2a1a0 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49  iables without I
2a1b0 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
2a1c0 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29  ssert( seenVar )
2a1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2a1e0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
2a1f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2a200 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20   & WO_IN)==0;.  
2a210 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a220 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
2a230 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
2a240 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  ith IN */.      
2a250 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
2a260 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b  Var && seenIn );
2a270 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
2a280 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
2a290 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2a2a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a2b0 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67      memset(pUsag
2a2c0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
2a2d0 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
2a2e0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
2a2f0 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f      if( pIdxInfo
2a300 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2a310 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
2a320 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
2a330 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  tr);.    pIdxInf
2a340 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
2a350 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
2a360 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Num = 0;.    pId
2a370 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2a380 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2a390 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
2a3a0 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
2a3b0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
2a3c0 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
2a3d0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
2a3e0 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70 49  double)2;.    pI
2a3f0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
2a400 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20 20  dRows = 25;.    
2a410 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64  rc = vtabBestInd
2a420 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ex(pParse, pTab,
2a430 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
2a440 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
2a450 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
2a460 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  xit;.    pIdxCon
2a470 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
2a480 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2a490 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
2a4a0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
2a4b0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2a4c0 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 6d   = mExtra;.    m
2a4d0 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20  xTerm = -1;.    
2a4e0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
2a4f0 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Slot>=nConstrain
2a500 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t );.    for(i=0
2a510 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
2a520 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65   i++) pNew->aLTe
2a530 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm[i] = 0;.    p
2a540 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
2a550 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Mask = 0;.    fo
2a560 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
2a570 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
2a580 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ons++){.      if
2a590 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67  ( (iTerm = pUsag
2a5a0 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d  e[i].argvIndex -
2a5b0 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)>=0 ){.      
2a5c0 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
2a5d0 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
2a5e0 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d       if( iTerm>=
2a5f0 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20  nConstraint.    
2a600 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20       || j<0.    
2a610 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e       || j>=pWC->
2a620 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c  nTerm.         |
2a630 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  | pNew->aLTerm[i
2a640 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20  Term]!=0.       
2a650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2a660 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2a670 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2a680 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2a690 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65  e, "%s.xBestInde
2a6a0 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  x() malfunction"
2a6b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
2a6c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77            goto w
2a6d0 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2a6e0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
2a6f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2a700 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72  ( iTerm==nConstr
2a710 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20  aint-1 );.      
2a720 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30    testcase( j==0
2a730 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
2a740 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54  case( j==pWC->nT
2a750 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  erm-1 );.       
2a760 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
2a770 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  [j];.        pNe
2a780 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65  w->prereq |= pTe
2a790 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
2a7a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a7b0 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53   iTerm<pNew->nLS
2a7c0 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  lot );.        p
2a7d0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
2a7e0 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
2a7f0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78      if( iTerm>mx
2a800 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20  Term ) mxTerm = 
2a810 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74  iTerm;.        t
2a820 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2a830 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  15 );.        te
2a840 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
2a850 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
2a860 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73   iTerm<16 && pUs
2a870 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e  age[i].omit ) pN
2a880 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  ew->u.vtab.omitM
2a890 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b  ask |= 1<<iTerm;
2a8a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
2a8b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2a8c0 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
2a8d0 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73 61          if( pUsa
2a8e0 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b  ge[i].omit==0 ){
2a8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2a900 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
2a910 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73  o use an IN cons
2a920 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76 69  traint if the vi
2a930 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
2a940 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20          ** says 
2a950 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61 6c  that the equival
2a960 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e  ent EQ constrain
2a970 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65  t cannot be safe
2a980 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20  ly omitted..    
2a990 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65          ** If we
2a9a0 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75   do attempt to u
2a9b0 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72  se such a constr
2a9c0 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20  aint, some rows 
2a9d0 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 20  might be.       
2a9e0 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64       ** repeated
2a9f0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20   in the output. 
2aa00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
2aa10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2aa20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
2aa30 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
2aa40 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
2aa50 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
2aa60 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
2aa70 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20       ** consume 
2aa80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2aa90 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20  use because (1) 
2aaa0 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
2aab0 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20  terms.          
2aac0 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ** is not necess
2aad0 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
2aae0 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75   the order of ou
2aaf0 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20  tput terms and. 
2ab00 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20           ** (2) 
2ab10 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73  Multiple outputs
2ab20 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49   from a single I
2ab30 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74  N value will not
2ab40 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20   merge.         
2ab50 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a   ** together.  *
2ab60 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
2ab70 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2ab80 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  sumed = 0;.     
2ab90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2aba0 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43   }.    if( i>=nC
2abb0 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
2abc0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2abd0 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20  = mxTerm+1;.    
2abe0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2abf0 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c  nLTerm<=pNew->nL
2ac00 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Slot );.      pN
2ac10 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  ew->u.vtab.idxNu
2ac20 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  m = pIdxInfo->id
2ac30 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNum;.      pNew
2ac40 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2ac50 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  e = pIdxInfo->ne
2ac60 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a  edToFreeIdxStr;.
2ac70 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
2ac80 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2ac90 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
2aca0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
2acb0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  = pIdxInfo->idxS
2acc0 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  tr;.      pNew->
2acd0 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
2ace0 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66 6f   = (i8)(pIdxInfo
2acf0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2ad00 64 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  d ?.            
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e            pIdxIn
2ad30 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30  fo->nOrderBy : 0
2ad40 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  );.      pNew->r
2ad50 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
2ad60 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
2ad70 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
2ad80 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
2ad90 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
2ada0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2adb0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2adc0 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
2add0 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20 20 20  atedRows);.     
2ade0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
2adf0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
2ae00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2ae10 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2ae20 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2ae30 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
2ae40 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
2ae50 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
2ae60 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2ae70 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2ae80 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f  .  }  ..whereLoo
2ae90 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20  pAddVtab_exit:. 
2aea0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
2aeb0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2aec0 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
2aed0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
2aee0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2aef0 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
2af00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2af10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2af20 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2af30 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  LE */../*.** Add
2af40 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69   WhereLoop entri
2af50 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20  es to handle OR 
2af60 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72  terms.  This wor
2af70 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a  ks for either.**
2af80 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75   btrees or virtu
2af90 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  al tables..*/.st
2afa0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2afb0 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f  opAddOr(WhereLoo
2afc0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
2afd0 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  er, Bitmask mExt
2afe0 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  ra){.  WhereInfo
2aff0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
2b000 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57  der->pWInfo;.  W
2b010 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
2b020 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
2b030 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ew;.  WhereTerm 
2b040 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b  *pTerm, *pWCEnd;
2b050 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b060 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75  TE_OK;.  int iCu
2b070 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  r;.  WhereClause
2b080 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65   tempWC;.  Where
2b090 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62  LoopBuilder sSub
2b0a0 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72  Build;.  WhereOr
2b0b0 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a  Set sSum, sCur;.
2b0c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2b0d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2b0e0 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
2b0f0 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70 57  r->pWC;.  if( pW
2b100 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2b110 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   & WHERE_AND_ONL
2b120 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Y ) return SQLIT
2b130 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d  E_OK;.  pWCEnd =
2b140 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
2b150 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70  Term;.  pNew = p
2b160 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
2b170 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30   memset(&sSum, 0
2b180 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b  , sizeof(sSum));
2b190 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
2b1a0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
2b1b0 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69   pNew->iTab;.  i
2b1c0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74  f( !HasRowid(pIt
2b1d0 65 6d 2d 3e 70 54 61 62 29 20 29 20 72 65 74 75  em->pTab) ) retu
2b1e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b1f0 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
2b200 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54  ursor;..  for(pT
2b210 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
2b220 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d  m<pWCEnd && rc==
2b230 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d  SQLITE_OK; pTerm
2b240 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
2b250 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2b260 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
2b270 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
2b280 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
2b290 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
2b2a0 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
2b2b0 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
2b2c0 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
2b2d0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2b2e0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
2b2f0 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
2b300 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
2b310 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
2b320 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2b330 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
2b340 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a    int once = 1;.
2b350 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
2b360 20 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42      .      sSubB
2b370 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72  uild = *pBuilder
2b380 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2b390 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  d.pOrderBy = 0;.
2b3a0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2b3b0 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a  pOrSet = &sCur;.
2b3c0 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65  .      for(pOrTe
2b3d0 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72  rm=pOrWC->a; pOr
2b3e0 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70  Term<pOrWCEnd; p
2b3f0 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
2b400 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
2b410 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2b420 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
2b430 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2b440 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
2b450 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
2b460 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2b470 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
2b480 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
2b490 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
2b4a0 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
2b4b0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74  nfo;.          t
2b4c0 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
2b4d0 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  WC;.          te
2b4e0 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
2b4f0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2b500 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20  WC.nTerm = 1;.  
2b510 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
2b520 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
2b530 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2b540 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20  pWC = &tempWC;. 
2b550 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b560 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2b570 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b580 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a      sCur.n = 0;.
2b590 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b5a0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2b5b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
2b5c0 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
2b5d0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
2b5e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2b5f0 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42  ddVirtual(&sSubB
2b600 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
2b610 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
2b620 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
2b630 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2b640 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
2b650 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
2b660 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
2b670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2b680 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
2b690 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
2b6a0 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
2b6b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
2b6c0 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
2b6d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b6e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
2b6f0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
2b700 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
2b710 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
2b720 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
2b730 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b740 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53          WhereOrS
2b750 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20  et sPrev;.      
2b760 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
2b770 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
2b780 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
2b790 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2b7a0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
2b7b0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
2b7c0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2b7d0 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
2b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2b7f0 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
2b800 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
2b810 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
2b820 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
2b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b840 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
2b850 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
2b860 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
2b870 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  rRun),.         
2b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b890 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
2b8a0 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e  Add(sPrev.a[i].n
2b8b0 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e  Out, sCur.a[j].n
2b8c0 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Out));.         
2b8d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2b8e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b8f0 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
2b900 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
2b910 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
2b920 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2b930 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2b940 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
2b950 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
2b960 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
2b970 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
2b980 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
2b990 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  pNew->u, 0, size
2b9a0 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20  of(pNew->u));.  
2b9b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
2b9c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
2b9d0 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  sSum.n; i++){.  
2b9e0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2b9f0 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e   Currently sSum.
2ba00 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74  a[i].rRun is set
2ba10 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74   to the sum of t
2ba20 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20  he costs.       
2ba30 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73   ** of all sub-s
2ba40 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79  cans required by
2ba50 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f   the OR-scan. Ho
2ba60 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f  wever, due to ro
2ba70 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  unding.        *
2ba80 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79  * errors, it may
2ba90 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73   be that the cos
2baa0 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e  t of the OR-scan
2bab0 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73   is equal to its
2bac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74  .        ** most
2bad0 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73   expensive sub-s
2bae0 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61  can. Add the sma
2baf0 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70  llest possible p
2bb00 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20  enalty .        
2bb10 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74  ** (equivalent t
2bb20 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68  o multiplying th
2bb30 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20  e cost by 1.07) 
2bb40 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a  to ensure that .
2bb50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2bb60 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e  does not happen.
2bb70 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
2bb80 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75  WHERE clauses su
2bb90 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ch as the.      
2bba0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
2bbb0 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
2bbc0 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20   index on "y":. 
2bbd0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2bbe0 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c    **     WHERE l
2bbf0 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30  ikelihood(x=?, 0
2bc00 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20  .99) OR y=?.    
2bc10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2bc20 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61  * the planner ma
2bc30 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20  y elect to "OR" 
2bc40 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d  together a full-
2bc50 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61  table scan and a
2bc60 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  n.        ** ind
2bc70 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f  ex lookup. And o
2bc80 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f  ther similarly o
2bc90 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a  dd results.  */.
2bca0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2bcb0 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
2bcc0 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  Run + 1;.       
2bcd0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
2bce0 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
2bcf0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
2bd00 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
2bd10 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
2bd20 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2bd30 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2bd40 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2bd50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2bd60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
2bd70 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2bd80 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74  bjects for all t
2bd90 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63  ables .*/.static
2bda0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2bdb0 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75  dAll(WhereLoopBu
2bdc0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
2bdd0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2bde0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2bdf0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d  ->pWInfo;.  Bitm
2be00 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a  ask mExtra = 0;.
2be10 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
2be20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
2be30 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2be40 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2be50 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
2be60 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2be70 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
2be80 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2be90 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
2bea0 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49  t nTabList = pWI
2beb0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69  nfo->nLevel;.  i
2bec0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2bed0 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  K;.  u8 priorJoi
2bee0 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65  nType = 0;.  Whe
2bef0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20  reLoop *pNew;.. 
2bf00 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
2bf10 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2bf20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
2bf30 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
2bf40 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2bf50 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
2bf60 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
2bf70 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
2bf80 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61  pTabList->a; iTa
2bf90 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62  b<nTabList; iTab
2bfa0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2bfb0 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
2bfc0 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
2bfd0 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
2bfe0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
2bff0 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
2c000 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
2c010 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c  pItem->jointype|
2c020 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26  priorJoinType) &
2c030 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
2c040 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
2c050 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
2c060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
2c070 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65  rJoinType = pIte
2c080 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
2c090 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2c0a0 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2c0b0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2c0c0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
2c0d0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2c0e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c0f0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2c100 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65  AddBtree(pBuilde
2c110 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
2c120 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2c130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c140 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2c150 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d  ddOr(pBuilder, m
2c160 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
2c170 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77    mPrior |= pNew
2c180 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2c190 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61  if( rc || db->ma
2c1a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
2c1b0 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c  ak;.  }.  whereL
2c1c0 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
2c1d0 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
2c1e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
2c1f0 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
2c200 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
2c210 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
2c220 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
2c230 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
2c240 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
2c250 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
2c260 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
2c270 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
2c280 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
2c290 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
2c2a0 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
2c2b0 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
2c2c0 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
2c2d0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
2c2e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
2c2f0 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
2c300 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
2c310 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
2c320 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
2c330 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
2c340 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
2c350 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
2c360 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
2c370 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
2c380 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2c390 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
2c3a0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
2c3b0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2c3c0 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
2c3d0 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
2c3e0 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
2c3f0 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
2c400 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
2c410 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
2c420 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
2c430 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
2c440 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
2c450 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
2c460 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
2c470 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
2c480 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
2c490 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
2c4a0 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
2c4b0 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivelent rows are
2c4c0 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2c4d0 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
2c4e0 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
2c4f0 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
2c500 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
2c510 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
2c520 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
2c530 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
2c540 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
2c550 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
2c560 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
2c570 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
2c580 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
2c590 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
2c5a0 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
2c5b0 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
2c5c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c5d0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2c5e0 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
2c5f0 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
2c600 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
2c610 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
2c620 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
2c630 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
2c640 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
2c650 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
2c660 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
2c670 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
2c680 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
2c690 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2c6a0 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
2c6b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2c6c0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
2c6d0 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
2c6e0 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
2c6f0 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
2c700 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
2c710 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
2c720 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
2c730 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
2c740 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
2c750 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
2c760 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
2c770 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
2c780 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
2c790 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2c7a0 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
2c7b0 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
2c7c0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2c7d0 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
2c7e0 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
2c7f0 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
2c800 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
2c810 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
2c820 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
2c830 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
2c840 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
2c850 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
2c860 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
2c870 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
2c880 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
2c890 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
2c8a0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
2c8b0 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
2c8c0 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
2c8d0 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
2c8e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2c8f0 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  ause */.  u16 nK
2c900 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
2c910 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
2c920 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
2c930 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
2c940 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
2c950 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2c960 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
2c970 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
2c980 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
2c990 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c9a0 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
2c9b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2c9c0 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
2c9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2c9e0 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
2c9f0 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
2ca00 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
2ca10 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2ca20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2ca30 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
2ca40 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
2ca50 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2ca60 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
2ca70 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
2ca80 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
2ca90 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
2caa0 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
2cab0 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
2cac0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
2cad0 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
2cae0 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
2caf0 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
2cb00 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
2cb10 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
2cb20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
2cb30 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2cb40 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
2cb50 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
2cb60 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
2cb70 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2cb80 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
2cb90 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
2cba0 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
2cbb0 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
2cbc0 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
2cbd0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
2cbe0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2cbf0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
2cc00 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
2cc10 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
2cc20 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
2cc30 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2cc40 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
2cc50 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
2cc60 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
2cc70 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
2cc80 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
2cc90 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
2cca0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
2ccb0 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
2ccc0 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
2ccd0 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
2cce0 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
2ccf0 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
2cd00 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
2cd10 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
2cd20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
2cd30 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
2cd40 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
2cd50 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
2cd60 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
2cd70 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
2cd80 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
2cd90 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
2cda0 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
2cdb0 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
2cdc0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
2cdd0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
2cde0 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
2cdf0 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
2ce00 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
2ce10 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
2ce20 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
2ce30 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
2ce40 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
2ce50 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2ce60 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
2ce70 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
2ce80 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
2ce90 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
2cea0 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
2ceb0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
2cec0 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
2ced0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
2cee0 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
2cef0 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
2cf00 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
2cf10 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
2cf20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
2cf30 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
2cf40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2cf50 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
2cf60 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
2cf70 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
2cf80 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
2cf90 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
2cfa0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
2cfb0 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
2cfc0 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
2cfd0 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
2cfe0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
2cff0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
2d000 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
2d010 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
2d020 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
2d030 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
2d040 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
2d050 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
2d060 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
2d070 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
2d080 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
2d090 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
2d0a0 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
2d0b0 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
2d0c0 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
2d0d0 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
2d0e0 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
2d0f0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
2d100 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
2d110 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
2d120 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
2d130 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
2d140 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
2d150 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
2d160 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
2d170 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
2d180 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
2d190 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2d1a0 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
2d1b0 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
2d1c0 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
2d1d0 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
2d1e0 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
2d1f0 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
2d200 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
2d210 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
2d220 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
2d230 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
2d240 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
2d250 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
2d260 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
2d270 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
2d280 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
2d290 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
2d2a0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
2d2b0 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
2d2c0 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
2d2d0 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
2d2e0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2d2f0 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
2d300 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
2d310 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
2d320 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
2d330 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
2d340 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
2d350 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
2d360 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
2d370 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
2d380 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
2d390 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
2d3a0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2d3b0 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
2d3c0 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
2d3d0 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
2d3e0 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  Last;.    if( pL
2d3f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2d400 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2d410 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
2d420 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
2d430 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
2d440 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
2d450 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2d460 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
2d470 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
2d480 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
2d490 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
2d4a0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
2d4b0 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
2d4c0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
2d4d0 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
2d4e0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
2d4f0 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
2d500 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
2d510 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
2d520 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
2d530 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
2d540 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
2d550 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
2d560 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
2d570 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
2d580 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2d590 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
2d5a0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2d5b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
2d5c0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2d5d0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
2d5e0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2d5f0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
2d600 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
2d610 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
2d620 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
2d630 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2d640 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d650 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
2d660 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
2d670 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
2d680 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
2d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6a0 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57   ~ready, WO_EQ|W
2d6b0 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  O_ISNULL, 0);.  
2d6c0 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
2d6d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d6e0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2d6f0 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21  Operator&WO_EQ)!
2d700 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69  =0 && pOBExpr->i
2d710 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
2d720 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2d730 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20  *z1, *z2;.      
2d740 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2d750 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2d760 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
2d770 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2d780 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2d790 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2d7a0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2d7b0 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f          z1 = pCo
2d7c0 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
2d7d0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2d7e0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2d7f0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54  Info->pParse, pT
2d800 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
2d810 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2d820 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
2d830 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
2d840 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   z2 = pColl->zNa
2d850 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
2d860 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2d870 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74  1, z2)!=0 ) cont
2d880 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2d890 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2d8a0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
2d8b0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2d8c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2d8d0 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
2d8e0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
2d8f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2d900 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
2d910 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
2d920 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
2d930 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
2d940 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
2d950 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
2d960 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2d970 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
2d980 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
2d990 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d9a0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2d9b0 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
2d9c0 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
2d9d0 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
2d9e0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
2d9f0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
2da00 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
2da10 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
2da20 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
2da30 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
2da40 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
2da50 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
2da60 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48  n-1]==(-1) || !H
2da70 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
2da80 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  pTable));.      
2da90 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2daa0 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  t = pIndex->onEr
2dab0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20  ror!=OE_None;.  
2dac0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2dad0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
2dae0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
2daf0 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77  index and deal w
2db00 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20  ith the ones.   
2db10 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e     ** that are n
2db20 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  ot constrained b
2db30 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20  y == or IN..    
2db40 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d    */.      rev =
2db50 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20   revSet = 0;.   
2db60 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
2db70 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ns = 0;.      fo
2db80 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e  r(j=0; j<nColumn
2db90 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2dba0 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54  u8 bOnce;   /* T
2dbb0 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f  rue to run the O
2dbc0 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c  RDER BY search l
2dbd0 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  oop */..        
2dbe0 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20  /* Skip over == 
2dbf0 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d  and IS NULL term
2dc00 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
2dc10 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
2dc20 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
2dc30 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  & pLoop->u.btree
2dc40 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20  .nSkip==0.      
2dc50 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f     && ((i = pLoo
2dc60 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
2dc70 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45  perator) & (WO_E
2dc80 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
2dc90 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2dca0 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
2dcb0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
2dcc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2dcd0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2dce0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2dcf0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2dd00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
2dd10 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2dd20 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
2dd30 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
2dd40 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
2dd50 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
2dd60 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
2dd70 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
2dd80 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
2dd90 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
2dda0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
2ddb0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ddc0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
2ddd0 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
2dde0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
2ddf0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
2de00 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
2de10 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
2de20 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
2de30 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
2de40 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
2de50 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ) iColumn = -1;.
2de60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2de70 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
2de80 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2de90 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20   revIdx = 0;.   
2dea0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2deb0 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69  /* An unconstrai
2dec0 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ned column that 
2ded0 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65  might be NULL me
2dee0 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20  ans that this.  
2def0 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f        ** WhereLo
2df00 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f  op is not well-o
2df10 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
2df20 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
2df30 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20  OrderDistinct.  
2df40 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d         && iColum
2df50 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  n>=0.         &&
2df60 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   j>=pLoop->u.btr
2df70 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2df80 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  && pIndex->pTabl
2df90 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
2dfa0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20  .notNull==0.    
2dfb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2dfc0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2dfd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2dfe0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  .        /* Find
2dff0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
2e000 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  rm that correspo
2e010 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20  nds to the j-th 
2e020 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a  column.        *
2e030 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  * of the index a
2e040 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44  nd mark that ORD
2e050 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a  ER BY term off .
2e060 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e070 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20     bOnce = 1;.  
2e080 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
2e090 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
2e0a0 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e  =0; bOnce && i<n
2e0b0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2e0c0 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53           if( MAS
2e0d0 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
2e0e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2e0f0 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
2e100 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2e110 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
2e120 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2e130 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2e140 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2e150 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
2e160 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2e170 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
2e180 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2e190 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Y );.          i
2e1a0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
2e1b0 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c   (WHERE_GROUPBY|
2e1c0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2e1d0 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20  ))==0 ) bOnce = 
2e1e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
2e1f0 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
2e200 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
2e210 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2e220 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
2e230 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
2e240 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2e250 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
2e260 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
2e270 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2e280 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30    if( iColumn>=0
2e290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e2a0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2e2b0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
2e2c0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
2e2d0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2e2e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2e2f0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
2e300 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
2e310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2e320 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2e330 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
2e340 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  Index->azColl[j]
2e350 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2e360 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e370 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
2e380 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
2e390 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2e3a0 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
2e3b0 63 68 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77  ch && (pWInfo->w
2e3c0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2e3d0 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
2e3e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
2e3f0 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
2e400 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
2e410 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
2e420 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
2e430 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
2e440 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
2e450 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
2e460 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
2e470 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
2e480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e490 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
2e4a0 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
2e4b0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69  i].sortOrder ) i
2e4c0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
2e4d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e4e0 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
2e4f0 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
2e500 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2e510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2e520 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
2e530 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
2e540 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
2e550 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
2e560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e570 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
2e580 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
2e590 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
2e5a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2e5b0 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
2e5c0 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
2e5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
2e5e0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
2e5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e600 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
2e610 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2e620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e630 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
2e640 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
2e650 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
2e660 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
2e670 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2e680 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
2e690 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
2e6a0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2e6b0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
2e6c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e6d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e6e0 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
2e6f0 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
2e700 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
2e710 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
2e720 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
2e730 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2e740 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
2e750 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
2e760 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
2e770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
2e780 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
2e790 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
2e7a0 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
2e7b0 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
2e7c0 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
2e7d0 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
2e7e0 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
2e7f0 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
2e800 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
2e810 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2e820 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2e830 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
2e840 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
2e850 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  *p;.        Bitm
2e860 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20  ask mTerm;.     
2e870 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
2e880 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2e890 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
2e8a0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
2e8b0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
2e8c0 6d 54 65 72 6d 20 3d 20 65 78 70 72 54 61 62 6c  mTerm = exprTabl
2e8d0 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  eUsage(&pWInfo->
2e8e0 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20  sMaskSet,p);.   
2e8f0 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d       if( mTerm==
2e900 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
2e910 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29  rIsConstant(p) )
2e920 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2e930 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f     if( (mTerm&~o
2e940 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2e950 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2e960 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
2e970 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
2e980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e990 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f   } /* End the lo
2e9a0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72  op over all Wher
2e9b0 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65  eLoops from oute
2e9c0 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69  r-most down to i
2e9d0 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69  nner-most */.  i
2e9e0 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65  f( obSat==obDone
2e9f0 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f   ) return (i8)nO
2ea00 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69  rderBy;.  if( !i
2ea10 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
2ea20 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64  {.    for(i=nOrd
2ea30 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  erBy-1; i>0; i--
2ea40 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
2ea50 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20   m = MASKBIT(i) 
2ea60 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28  - 1;.      if( (
2ea70 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65  obSat&m)==m ) re
2ea80 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
2ea90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2eaa0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
2eab0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  ./*.** If the WH
2eac0 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
2ead0 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d   is set in the m
2eae0 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71  ask passed to sq
2eaf0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2eb00 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65  ),.** the planne
2eb10 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  r assumes that t
2eb20 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72  he specified pOr
2eb30 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63  derBy list is ac
2eb40 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a  tually a GROUP.*
2eb50 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e  * BY clause - an
2eb60 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74  d so any order t
2eb70 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20  hat groups rows 
2eb80 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69  as required sati
2eb90 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71  sfies the.** req
2eba0 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  uest..**.** Norm
2ebb0 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61  ally, in this ca
2ebc0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
2ebd0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61  sible for the ca
2ebe0 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e  ller to determin
2ebf0 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  e.** whether or 
2ec00 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65  not the rows are
2ec10 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65   really being de
2ec20 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65  livered in sorte
2ec30 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a  d order, or.** j
2ec40 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ust in some othe
2ec50 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f  r order that pro
2ec60 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72  vides the requir
2ec70 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77  ed grouping. How
2ec80 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  ever,.** if the 
2ec90 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
2eca0 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70  P flag is also p
2ecb0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
2ecc0 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68  WhereBegin(), th
2ecd0 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
2ece0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
2ecf0 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d on the returne
2ed00 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65  d WhereInfo obje
2ed10 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a  ct. It returns.*
2ed20 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f  * true if the ro
2ed30 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62  ws really will b
2ed40 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20  e sorted in the 
2ed50 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c  specified order,
2ed60 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68   or false.** oth
2ed70 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erwise..**.** Fo
2ed80 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
2ed90 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
2eda0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
2edb0 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20  t1(x, Y);.**.** 
2edc0 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  then.**.**   SEL
2edd0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
2ede0 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52  OUP BY x,y ORDER
2edf0 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73   BY x,y;   -- Is
2ee00 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20  Sorted()==1.**  
2ee10 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2ee20 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f  1 GROUP BY y,x O
2ee30 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d  RDER BY y,x;   -
2ee40 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a  - IsSorted()==0.
2ee50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
2ee60 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72  ereIsSorted(Wher
2ee70 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
2ee80 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
2ee90 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2eea0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
2eeb0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
2eec0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2eed0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
2eee0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
2eef0 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a  nfo->sorted;.}..
2ef00 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
2ef10 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72  E_ENABLED./* For
2ef20 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
2ef30 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  nly: */.static c
2ef40 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65  onst char *where
2ef50 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61  PathName(WherePa
2ef60 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e  th *pPath, int n
2ef70 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  Loop, WhereLoop 
2ef80 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69  *pLast){.  stati
2ef90 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d  c char zName[65]
2efa0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
2efb0 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69  (i=0; i<nLoop; i
2efc0 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  ++){ zName[i] = 
2efd0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d  pPath->aLoop[i]-
2efe0 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c  >cId; }.  if( pL
2eff0 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d  ast ) zName[i++]
2f000 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20   = pLast->cId;. 
2f010 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20   zName[i] = 0;. 
2f020 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
2f030 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
2f040 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  iven the list of
2f050 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2f060 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c  ts at pWInfo->pL
2f070 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69  oops, this routi
2f080 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ne.** attempts t
2f090 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  o find the lowes
2f0a0 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74  t cost path that
2f0b0 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65   visits each Whe
2f0c0 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20  reLoop.** once. 
2f0d0 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68   This path is th
2f0e0 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74  en loaded into t
2f0f0 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70  he pWInfo->a[].p
2f100 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a  WLoop fields..**
2f110 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20  .** Assume that 
2f120 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2f130 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
2f140 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74  that will need t
2f150 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77  o be sorted.** w
2f160 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28  ill be nRowEst (
2f170 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72  in the 10*log2 r
2f180 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20  epresentation). 
2f190 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74   Or, ignore sort
2f1a0 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20  ing.** costs if 
2f1b0 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a  nRowEst==0..**.*
2f1c0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
2f1d0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
2f1e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66   SQLITE_NOMEM of
2f1f0 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
2f200 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  tion.** error oc
2f210 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
2f220 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c  int wherePathSol
2f230 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ver(WhereInfo *p
2f240 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52  WInfo, LogEst nR
2f250 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78  owEst){.  int mx
2f260 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20  Choice;         
2f270 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
2f280 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61  umber of simulta
2f290 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63  neous paths trac
2f2a0 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ked */.  int nLo
2f2b0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
2f2c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f2d0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69  terms in the joi
2f2e0 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  n */.  Parse *pP
2f2f0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
2f300 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
2f310 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
2f320 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2f330 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
2f340 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
2f350 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
2f360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f370 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65  Loop counter ove
2f380 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
2f390 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74  he join */.  int
2f3a0 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20   ii, jj;        
2f3b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2f3c0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2f3d0 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20   mxI = 0;       
2f3e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2f3f0 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f  of next entry to
2f400 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e   replace */.  in
2f410 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
2f420 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2f430 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c  r of ORDER BY cl
2f440 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20  ause terms */.  
2f450 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20  LogEst rCost;   
2f460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
2f470 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20  t of a path */. 
2f480 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
2f490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2f4a0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20  mber of outputs 
2f4b0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f  */.  LogEst mxCo
2f4c0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  st = 0;        /
2f4d0 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
2f4e0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
2f4f0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 4f   */.  LogEst mxO
2f500 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
2f510 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20  /* Maximum nOut 
2f520 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 73 65 74  value on the set
2f530 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 69   of paths */.  i
2f540 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
2f550 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f560 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
2f570 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
2f580 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
2f590 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
2f5a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
2f5b0 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
2f5c0 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
2f5d0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2f5e0 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
2f5f0 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
2f600 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
2f610 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
2f620 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
2f630 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
2f640 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
2f650 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
2f660 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
2f670 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
2f680 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
2f690 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
2f6a0 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
2f6b0 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
2f6c0 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
2f6d0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2f6e0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
2f6f0 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
2f700 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
2f710 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
2f720 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
2f730 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63  ce memory */.  c
2f740 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20  har *pSpace;    
2f750 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
2f760 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65  orary memory use
2f770 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
2f780 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  e */..  pParse =
2f790 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
2f7a0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2f7b0 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57  db;.  nLoop = pW
2f7c0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
2f7d0 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73  /* TUNING: For s
2f7e0 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f  imple queries, o
2f7f0 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74  nly the best pat
2f800 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20  h is tracked..  
2f810 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69  ** For 2-way joi
2f820 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70  ns, the 5 best p
2f830 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aths are followe
2f840 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e  d..  ** For join
2f850 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74  s of 3 or more t
2f860 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65  ables, track the
2f870 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a   10 best paths *
2f880 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28  /.  mxChoice = (
2f890 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20  nLoop==1) ? 1 : 
2f8a0 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20  (nLoop==2 ? 5 : 
2f8b0 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  10);.  assert( n
2f8c0 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54  Loop<=pWInfo->pT
2f8d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
2f8e0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
2f8f0 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e  02, ("---- begin
2f900 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20   solver\n"));.. 
2f910 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
2f920 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
2f930 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46  e for aTo and aF
2f940 72 6f 6d 20 2a 2f 0a 20 20 70 53 70 61 63 65 20  rom */.  pSpace 
2f950 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2f960 63 52 61 77 28 64 62 2c 20 0a 20 20 20 20 20 20  cRaw(db, .      
2f970 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
2f980 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65  (WherePath)+size
2f990 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 28  of(WhereLoop*)*(
2f9a0 69 36 34 29 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  i64)nLoop)*mxCho
2f9b0 69 63 65 2a 32 29 3b 0a 20 20 69 66 28 20 70 53  ice*2);.  if( pS
2f9c0 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
2f9d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2f9e0 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
2f9f0 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
2fa00 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
2fa10 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
2fa20 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
2fa30 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
2fa40 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
2fa50 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
2fa60 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
2fa70 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
2fa80 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
2fa90 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
2faa0 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
2fab0 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20  op = pX;.  }..  
2fac0 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72  /* Seed the sear
2fad0 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ch with a single
2fae0 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61   WherePath conta
2faf0 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65  ining zero Where
2fb00 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Loops..  **.  **
2fb10 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20   TUNING: Do not 
2fb20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  let the number o
2fb30 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20  f iterations go 
2fb40 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68  above 25.  If th
2fb50 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63  e cost.  ** of c
2fb60 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f  omputing an auto
2fb70 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e  matic index is n
2fb80 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74  ot paid back wit
2fb90 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 35  hin the first 25
2fba0 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e  .  ** rows, then
2fbb0 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
2fbc0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
2fbd0 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
2fbe0 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65  Row = MIN(pParse
2fbf0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36  ->nQueryLoop, 46
2fc00 29 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  );  assert( 46==
2fc10 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
2fc20 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
2fc30 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75  ;..  /* Precompu
2fc40 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  te the cost of s
2fc50 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  orting the final
2fc60 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20   result set, if 
2fc70 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
2fc80 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2fc90 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65  egin() was conce
2fca0 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69  rned about sorti
2fcb0 6e 67 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  ng */.  if( pWIn
2fcc0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
2fcd0 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b  || nRowEst==0 ){
2fce0 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  .    aFrom[0].is
2fcf0 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20  Ordered = 0;.   
2fd00 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
2fd10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 46 72 6f   }else{.    aFro
2fd20 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d  m[0].isOrdered =
2fd30 20 2d 31 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42   -1;.    nOrderB
2fd40 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  y = pWInfo->pOrd
2fd50 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  erBy->nExpr;.  }
2fd60 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
2fd70 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
2fd80 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
2fd90 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
2fda0 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
2fdb0 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
2fdc0 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
2fdd0 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
2fde0 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
2fdf0 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
2fe00 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
2fe10 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
2fe20 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
2fe30 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
2fe40 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
2fe50 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
2fe60 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
2fe70 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
2fe80 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
2fe90 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
2fea0 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
2feb0 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
2fec0 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
2fed0 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b  Bitmask maskNew;
2fee0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
2fef0 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20   revMask = 0;.  
2ff00 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72        i8 isOrder
2ff10 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
2ff20 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 69  dered;.        i
2ff30 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72  f( (pWLoop->prer
2ff40 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73  eq & ~pFrom->mas
2ff50 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
2ff60 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2ff70 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  ( (pWLoop->maskS
2ff80 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73  elf & pFrom->mas
2ff90 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
2ffa0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  inue;.        /*
2ffb0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2ffc0 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64  pWLoop is a cand
2ffd0 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20  idate to be the 
2ffe0 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20  next loop. .    
2fff0 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69      ** Compute i
30000 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20  ts cost */.     
30010 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74     rCost = sqlit
30020 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f  e3LogEstAdd(pWLo
30030 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f  op->rSetup,pWLoo
30040 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d  p->rRun + pFrom-
30050 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  >nRow);.        
30060 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
30070 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c 20  ogEstAdd(rCost, 
30080 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20  pFrom->rCost);. 
30090 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46         nOut = pF
300a0 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f  rom->nRow + pWLo
300b0 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  op->nOut;.      
300c0 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f    maskNew = pFro
300d0 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
300e0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
300f0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
30100 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20  dered<0 ){.     
30110 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d       isOrdered =
30120 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
30130 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
30140 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
30150 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
30160 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f  ->pOrderBy, pFro
30170 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  m, pWInfo->wctrl
30180 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
30190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c                iL
301a0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65  oop, pWLoop, &re
301b0 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20  vMask);.        
301c0 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e    if( isOrdered>
301d0 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c  =0 && isOrdered<
301e0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
301f0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
30200 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73  G: Estimated cos
30210 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65  t of a full exte
30220 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65  rnal sort, where
30230 20 4e 20 69 73 20 0a 20 20 20 20 20 20 20 20 20   N is .         
30240 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72     ** the number
30250 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74   of rows to sort
30260 20 69 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20   is:.           
30270 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
30280 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
30290 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a   * N * log(N))..
302a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a              ** .
302b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f              ** O
302c0 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d  r, if the order-
302d0 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20  by clause has X 
302e0 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74  terms but only t
302f0 68 65 20 6c 61 73 74 20 59 20 0a 20 20 20 20 20  he last Y .     
30300 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20         ** terms 
30310 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72  are out of order
30320 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72  , then block-sor
30330 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65  ting will reduce
30340 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
30350 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73    ** sorting cos
30360 74 20 74 6f 3a 0a 20 20 20 20 20 20 20 20 20 20  t to:.          
30370 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
30380 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
30390 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20  0 * N * log(N)) 
303a0 2a 20 28 59 2f 58 29 0a 20 20 20 20 20 20 20 20  * (Y/X).        
303b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
303c0 20 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20     ** The (Y/X) 
303d0 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e  term is implemen
303e0 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20  ted using stack 
303f0 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a  variable rScale.
30400 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
30410 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
30420 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 53 63        LogEst rSc
30430 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a  ale, rSortCost;.
30440 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
30450 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26  rt( nOrderBy>0 &
30460 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  & 66==sqlite3Log
30470 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20  Est(100) );.    
30480 20 20 20 20 20 20 20 20 72 53 63 61 6c 65 20 3d          rScale =
30490 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
304a0 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72  nOrderBy-isOrder
304b0 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79  ed)*100/nOrderBy
304c0 29 20 2d 20 36 36 3b 0a 20 20 20 20 20 20 20 20  ) - 66;.        
304d0 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20      rSortCost = 
304e0 6e 52 6f 77 45 73 74 20 2b 20 65 73 74 4c 6f 67  nRowEst + estLog
304f0 28 6e 52 6f 77 45 73 74 29 20 2b 20 72 53 63 61  (nRowEst) + rSca
30500 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 20 20 20 20  le + 16;..      
30510 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
30520 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69 6d 70   The cost of imp
30530 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54 49 4e  lementing DISTIN
30540 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54 52 45  CT using a B-TRE
30550 45 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  E is.           
30560 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62 75 74 20   ** similar but 
30570 77 69 74 68 20 61 20 6c 61 72 67 65 72 20 63 6f  with a larger co
30580 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72  nstant of propor
30590 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20 20 20 20  tionality. .    
305a0 20 20 20 20 20 20 20 20 2a 2a 20 4d 75 6c 74 69          ** Multi
305b0 70 6c 79 20 62 79 20 61 6e 20 61 64 64 69 74 69  ply by an additi
305c0 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f 66 20 33  onal factor of 3
305d0 2e 30 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  .0.  */.        
305e0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
305f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
30600 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
30610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30620 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31    rSortCost += 1
30630 36 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  6;.            }
30640 0a 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45  .            WHE
30650 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20  RETRACE(0x002,. 
30660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22                ("
30670 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25  ---- sort cost=%
30680 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72  -3d (%d/%d) incr
30690 65 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74  eases cost %3d t
306a0 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20  o %-3d\n",.     
306b0 20 20 20 20 20 20 20 20 20 20 20 72 53 6f 72 74             rSort
306c0 43 6f 73 74 2c 20 28 6e 4f 72 64 65 72 42 79 2d  Cost, (nOrderBy-
306d0 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64  isOrdered), nOrd
306e0 65 72 42 79 2c 20 72 43 6f 73 74 2c 0a 20 20 20  erBy, rCost,.   
306f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30700 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43  ite3LogEstAdd(rC
30710 6f 73 74 2c 72 53 6f 72 74 43 6f 73 74 29 29 29  ost,rSortCost)))
30720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 43  ;.            rC
30730 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ost = sqlite3Log
30740 45 73 74 41 64 64 28 72 43 6f 73 74 2c 20 72 53  EstAdd(rCost, rS
30750 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ortCost);.      
30760 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
30770 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
30780 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
30790 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  revLoop;.       
307a0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   }.        /* Ch
307b0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
307c0 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
307d0 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68  dded to the mxCh
307e0 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66 61 72  oice best so far
307f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
30800 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
30810 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
30820 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
30830 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
30840 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20  ==maskNew.      
30850 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69       && ((pTo->i
30860 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72  sOrdered^isOrder
30870 65 64 29 26 38 30 29 3d 3d 30 0a 20 20 20 20 20  ed)&80)==0.     
30880 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e        && ((pTo->
30890 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20  rCost<=rCost && 
308a0 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29  pTo->nRow<=nOut)
308b0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
308c0 20 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3e      (pTo->rCost>
308d0 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e  =rCost && pTo->n
308e0 52 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20 20 20 20  Row>=nOut)).    
308f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
30910 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20  j==nTo-1 );.    
30920 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30930 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
30950 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20   jj>=nTo ){.    
30960 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
30970 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74  xChoice && rCost
30980 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66 64  >=mxCost ){.#ifd
30990 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
309a0 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
309b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
309c0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
309d0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
309e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
309f0 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20  bugPrintf("Skip 
30a00 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
30a10 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
30a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a30 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
30a40 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
30a50 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
30a60 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
30a70 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
30a80 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
30a90 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
30aa0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
30ab0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
30ac0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
30ad0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
30ae0 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74 6f  dd a new Path to
30af0 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a   the aTo[] set *
30b00 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
30b10 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
30b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
30b30 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
30b40 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
30b50 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
30b60 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
30b70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
30b80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
30b90 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
30ba0 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
30bb0 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
30bc0 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
30bd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
30be0 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20  jj = mxI;.      
30bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30c00 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a  pTo = &aTo[jj];.
30c10 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
30c20 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
30c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
30c40 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
30c50 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
30c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
30c70 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20  bugPrintf("New  
30c80 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
30c90 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
30ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cb0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
30cc0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
30cd0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
30ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30cf0 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
30d00 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
30d10 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
30d20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
30d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30d40 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
30d50 74 3c 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d  t<=rCost && pTo-
30d60 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 20 29 7b 0a 23  >nRow<=nOut ){.#
30d70 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
30d80 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
30d90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
30da0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
30db0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
30dc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30dd0 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
30de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30df0 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
30e00 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
30e10 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
30e20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
30e30 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
30e40 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
30e50 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
30e60 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
30e70 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
30e80 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
30e90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30ea0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
30eb0 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25  "   vs %s cost=%
30ec0 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c  -3d,%d order=%c\
30ed0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
30ee0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
30ef0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
30f00 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
30f10 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
30f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
30f30 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
30f40 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
30f50 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
30f60 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
30f70 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  if.            t
30f80 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
30f90 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
30fa0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
30fb0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
30fc0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
30fd0 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
30fe0 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
30ff0 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e       /* A new an
31000 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20 66  d better score f
31010 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20  or a previously 
31020 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c 65  created equivale
31030 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65  nt path */.#ifde
31040 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
31050 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
31060 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
31070 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
31080 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
31090 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
310a0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
310b0 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73        "Update %s
310c0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
310d0 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
310e0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
310f0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
31100 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
31110 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
31120 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31130 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
31140 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
31150 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
31160 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
31170 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25  "  was %s cost=%
31180 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
31190 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
311a0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
311b0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
311c0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
311d0 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
311e0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d              pTo-
311f0 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20  >isOrdered>=0 ? 
31200 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27  pTo->isOrdered+'
31210 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
31220 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
31230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31240 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77  /* pWLoop is a w
31250 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74  inner.  Add it t
31260 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73  o the set of bes
31270 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  t so far */.    
31280 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f      pTo->maskLoo
31290 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  p = pFrom->maskL
312a0 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
312b0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
312c0 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72  pTo->revLoop = r
312d0 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  evMask;.        
312e0 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74  pTo->nRow = nOut
312f0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
31300 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20  Cost = rCost;.  
31310 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
31320 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64  ered = isOrdered
31330 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
31340 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72  (pTo->aLoop, pFr
31350 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f  om->aLoop, sizeo
31360 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c  f(WhereLoop*)*iL
31370 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54  oop);.        pT
31380 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  o->aLoop[iLoop] 
31390 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  = pWLoop;.      
313a0 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
313b0 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
313c0 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20   mxI = 0;.      
313d0 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f      mxCost = aTo
313e0 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  [0].rCost;.     
313f0 20 20 20 20 20 6d 78 4f 75 74 20 3d 20 61 54 6f       mxOut = aTo
31400 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  [0].nRow;.      
31410 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54      for(jj=1, pT
31420 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78  o=&aTo[1]; jj<mx
31430 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54  Choice; jj++, pT
31440 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o++){.          
31450 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
31460 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d  >mxCost || (pTo-
31470 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  >rCost==mxCost &
31480 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 6d 78 4f 75  & pTo->nRow>mxOu
31490 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
314a0 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f      mxCost = pTo
314b0 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ->rCost;.       
314c0 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d 20 70         mxOut = p
314d0 54 6f 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  To->nRow;.      
314e0 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a          mxI = jj
314f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
31500 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31510 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31520 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
31530 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20  ETRACE_ENABLED  
31540 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66  /* >=2 */.    if
31550 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
31560 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  ace>=2 ){.      
31570 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
31580 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72  tf("---- after r
31590 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c  ound %d ----\n",
315a0 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66   iLoop);.      f
315b0 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f  or(ii=0, pTo=aTo
315c0 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20  ; ii<nTo; ii++, 
315d0 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
315e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
315f0 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33  tf(" %s cost=%-3
31600 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65  d nrow=%-3d orde
31610 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
31620 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
31630 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
31640 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
31650 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
31660 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
31670 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73  ed>=0 ? (pTo->is
31680 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27  Ordered+'0') : '
31690 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ?');.        if(
316a0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
316b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
316c0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
316d0 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e  f(" rev=0x%llx\n
316e0 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29  ", pTo->revLoop)
316f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
31700 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
31710 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
31720 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
31730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
31740 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70  dif..    /* Swap
31750 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46   the roles of aF
31760 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20  rom and aTo for 
31770 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74  the next generat
31780 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d  ion */.    pFrom
31790 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20   = aTo;.    aTo 
317a0 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72  = aFrom;.    aFr
317b0 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20  om = pFrom;.    
317c0 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d  nFrom = nTo;.  }
317d0 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30  ..  if( nFrom==0
317e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
317f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
31800 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69  "no query soluti
31810 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  on");.    sqlite
31820 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61  3DbFree(db, pSpa
31830 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ce);.    return 
31840 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
31850 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74  }.  .  /* Find t
31860 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
31870 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c  ath.  pFrom will
31880 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   be left pointin
31890 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a  g to that path *
318a0 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f  /.  pFrom = aFro
318b0 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  m;.  for(ii=1; i
318c0 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a  i<nFrom; ii++){.
318d0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72      if( pFrom->r
318e0 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72  Cost>aFrom[ii].r
318f0 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26  Cost ) pFrom = &
31900 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20  aFrom[ii];.  }. 
31910 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
31920 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29  >nLevel==nLoop )
31930 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ;.  /* Load the 
31940 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
31950 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a   into pWInfo */.
31960 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
31970 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
31980 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c  p++){.    WhereL
31990 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70  evel *pLevel = p
319a0 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70  WInfo->a + iLoop
319b0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57  ;.    pLevel->pW
319c0 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20  Loop = pWLoop = 
319d0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pFrom->aLoop[iLo
319e0 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  op];.    pLevel-
319f0 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d  >iFrom = pWLoop-
31a00 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65  >iTab;.    pLeve
31a10 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49  l->iTabCur = pWI
31a20 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
31a30 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
31a40 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69  iCursor;.  }.  i
31a50 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
31a60 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
31a70 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30  ANT_DISTINCT)!=0
31a80 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
31a90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
31aa0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d  RE_DISTINCTBY)==
31ab0 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e  0.   && pWInfo->
31ac0 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
31ad0 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20  _DISTINCT_NOOP. 
31ae0 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29    && nRowEst.  )
31af0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f  {.    Bitmask no
31b00 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72  tUsed;.    int r
31b10 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  c = wherePathSat
31b20 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
31b30 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52  Info, pWInfo->pR
31b40 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c  esultSet, pFrom,
31b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31b60 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54    WHERE_DISTINCT
31b70 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72  BY, nLoop-1, pFr
31b80 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
31b90 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  1], &notUsed);. 
31ba0 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66     if( rc==pWInf
31bb0 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e  o->pResultSet->n
31bc0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 57  Expr ){.      pW
31bd0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
31be0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
31bf0 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a  _ORDERED;.    }.
31c00 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
31c10 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
31c20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
31c30 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
31c40 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20  _DISTINCTBY ){. 
31c50 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
31c60 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e 66  isOrdered==pWInf
31c70 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
31c80 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  pr ){.        pW
31c90 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
31ca0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
31cb0 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20  _ORDERED;.      
31cc0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
31cd0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61     pWInfo->nOBSa
31ce0 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  t = pFrom->isOrd
31cf0 65 72 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20  ered;.      if( 
31d00 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30  pWInfo->nOBSat<0
31d10 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
31d20 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 49  t = 0;.      pWI
31d30 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70  nfo->revMask = p
31d40 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20  From->revLoop;. 
31d50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57     }.    if( (pW
31d60 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
31d70 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   & WHERE_SORTBYG
31d80 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26 26  ROUP).        &&
31d90 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d   pWInfo->nOBSat=
31da0 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
31db0 79 2d 3e 6e 45 78 70 72 0a 20 20 20 20 29 7b 0a  y->nExpr.    ){.
31dc0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f        Bitmask no
31dd0 74 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  tUsed = 0;.     
31de0 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68   int nOrder = wh
31df0 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
31e00 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
31e10 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
31e20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
31e30 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  om, 0, nLoop-1, 
31e40 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
31e50 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 0a  op-1], &notUsed.
31e60 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
31e70 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73  ssert( pWInfo->s
31e80 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  orted==0 );.    
31e90 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64    pWInfo->sorted
31ea0 20 3d 20 28 6e 4f 72 64 65 72 3d 3d 70 57 49 6e   = (nOrder==pWIn
31eb0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
31ec0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
31ed0 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  ..  pWInfo->nRow
31ee0 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
31ef0 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65  w;..  /* Free te
31f00 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61  mporary memory a
31f10 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  nd return succes
31f20 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62  s */.  sqlite3Db
31f30 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
31f40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
31f50 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
31f60 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20  ost queries use 
31f70 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
31f80 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f  ble (they are no
31f90 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76  t joins) and hav
31fa0 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63  e.** simple == c
31fb0 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e  onstraints again
31fc0 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64  st indexed field
31fd0 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
31fe0 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
31ff0 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c  plan those simpl
32000 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75  e cases using mu
32010 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79  ch less ceremony
32020 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e   than the.** gen
32030 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
32040 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20  ry planner, and 
32050 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61  thereby yield fa
32060 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65  ster sqlite3_pre
32070 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20  pare().** times 
32080 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
32090 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ase..**.** Retur
320a0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75  n non-zero on su
320b0 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71  ccess, if this q
320c0 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64  uery can be hand
320d0 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e  led by this.** n
320e0 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70  o-frills query p
320f0 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20  lanner.  Return 
32100 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65  zero if this que
32110 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a  ry needs the .**
32120 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
32130 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a   query planner..
32140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
32150 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72  ereShortCut(Wher
32160 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
32170 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
32180 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
32190 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
321a0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68  tem *pItem;.  Wh
321b0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
321c0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
321d0 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  rm;.  WhereLoop 
321e0 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43  *pLoop;.  int iC
321f0 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54  ur;.  int j;.  T
32200 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
32210 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20  dex *pIdx;.  .  
32220 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
32230 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28  r->pWInfo;.  if(
32240 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
32250 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
32260 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e  E_TABLE ) return
32270 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
32280 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
32290 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
322a0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
322b0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
322c0 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
322d0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
322e0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
322f0 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
32300 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20 30  Index ) return 0
32310 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
32320 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43  ->iCursor;.  pWC
32330 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
32340 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c  .  pLoop = pBuil
32350 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f  der->pNew;.  pLo
32360 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b  op->wsFlags = 0;
32370 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
32380 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70  e.nSkip = 0;.  p
32390 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
323a0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
323b0 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69  , WO_EQ, 0);.  i
323c0 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
323d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
323e0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
323f0 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  |WHERE_IPK|WHERE
32400 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f  _ONEROW;.    pLo
32410 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  op->aLTerm[0] = 
32420 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70  pTerm;.    pLoop
32430 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
32440 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
32450 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a  .nEq = 1;.    /*
32460 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
32470 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20   a rowid lookup 
32480 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f  is 10 */.    pLo
32490 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20  op->rRun = 33;  
324a0 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 33==sqlite3Lo
324b0 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65  gEst(10) */.  }e
324c0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
324d0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
324e0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
324f0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
32500 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
32510 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
32520 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
32530 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
32540 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ize(pLoop->aLTer
32550 6d 53 70 61 63 65 29 3d 3d 34 20 29 3b 0a 20 20  mSpace)==4 );.  
32560 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
32570 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 0a  Error==OE_None .
32580 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
32590 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
325a0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78   .       || pIdx
325b0 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53  ->nKeyCol>ArrayS
325c0 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ize(pLoop->aLTer
325d0 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29  mSpace) .      )
325e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
325f0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
32600 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
32610 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
32620 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
32630 43 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c  Cur, pIdx->aiCol
32640 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51  umn[j], 0, WO_EQ
32650 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
32660 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
32670 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70  break;.        p
32680 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
32690 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
326a0 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
326b0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  dx->nKeyCol ) co
326c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
326d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
326e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
326f0 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
32700 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
32710 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76   if( pIdx->isCov
32720 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d  ering || (pItem-
32730 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
32740 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29  mnsInIndex(pIdx)
32750 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
32760 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
32770 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
32780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32790 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
327a0 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
327b0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b  u.btree.nEq = j;
327c0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
327d0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
327e0 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  Idx;.      /* TU
327f0 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
32800 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f  unique index loo
32810 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20  kup is 15 */.   
32820 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
32830 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c   39;  /* 39==sql
32840 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a  ite3LogEst(15) *
32850 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
32860 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
32870 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
32880 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
32890 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20   = (LogEst)1;.  
328a0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
328b0 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
328c0 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
328d0 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  lf = getMask(&pW
328e0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
328f0 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66  iCur);.    pWInf
32900 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20  o->a[0].iTabCur 
32910 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e  = iCur;.    pWIn
32920 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b  fo->nRowOut = 1;
32930 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
32940 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e  >pOrderBy ) pWIn
32950 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57  fo->nOBSat =  pW
32960 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
32970 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  nExpr;.    if( p
32980 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
32990 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
329a0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
329b0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
329c0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
329d0 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
329e0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
329f0 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d  DEBUG.    pLoop-
32a00 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64  >cId = '0';.#end
32a10 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  if.    return 1;
32a20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
32a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
32a40 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
32a50 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
32a60 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
32a70 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
32a80 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
32a90 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
32aa0 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
32ab0 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
32ac0 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
32ad0 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
32ae0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
32af0 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
32b00 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
32b10 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
32b20 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
32b30 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
32b40 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
32b50 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
32b60 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
32b70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
32b80 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
32b90 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
32ba0 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
32bb0 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
32bc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
32bd0 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
32be0 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
32bf0 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
32c00 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
32c10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
32c20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
32c30 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
32c40 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
32c50 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
32c60 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
32c70 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
32c80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
32c90 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
32ca0 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
32cb0 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
32cc0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
32cd0 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
32ce0 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
32cf0 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
32d00 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
32d10 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
32d20 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
32d30 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
32d40 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
32d50 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
32d60 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
32d70 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
32d80 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
32d90 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
32da0 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
32db0 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
32dc0 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
32dd0 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
32de0 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
32df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e00 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
32e10 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
32e20 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
32e30 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
32e40 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
32e50 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
32e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e70 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
32e80 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
32e90 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
32ea0 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
32eb0 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
32ec0 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
32ed0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
32ee0 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
32ef0 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
32f00 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
32f10 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
32f20 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
32f30 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
32f40 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
32f50 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
32f60 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
32f70 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
32f80 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
32f90 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
32fa0 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
32fb0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
32fc0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
32fd0 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
32fe0 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
32ff0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33000 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
33010 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
33020 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
33030 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
33040 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
33050 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
33060 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
33070 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
33080 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
33090 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
330a0 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
330b0 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
330c0 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
330d0 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
330e0 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
330f0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
33100 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
33110 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
33120 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
33130 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
33140 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
33150 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
33160 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
33170 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
33180 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
33190 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
331a0 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
331b0 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
331c0 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
331d0 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
331e0 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
331f0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
33200 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
33210 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
33220 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
33230 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
33240 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
33250 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
33260 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
33270 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
33280 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
33290 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
332a0 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
332b0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
332c0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
332d0 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
332e0 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
332f0 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
33300 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
33310 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
33320 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
33330 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
33340 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
33350 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
33360 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
33370 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
33380 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
33390 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
333a0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
333b0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
333c0 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
333d0 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
333e0 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
333f0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
33400 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
33410 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
33420 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
33430 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
33440 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
33450 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
33460 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
33470 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
33480 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
33490 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
334a0 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
334b0 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
334c0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
334d0 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
334e0 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
334f0 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
33500 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
33510 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
33520 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
33530 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
33540 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
33550 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
33560 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
33570 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
33580 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
33590 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
335a0 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
335b0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
335c0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
335d0 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
335e0 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
335f0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
33600 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
33610 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
33620 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
33630 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
33640 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
33650 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
33660 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
33670 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
33680 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
33690 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
336a0 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  .**.** pOrderBy 
336b0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
336c0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
336d0 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55  use (or the GROU
336e0 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69  P BY clause.** i
336f0 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55  f the WHERE_GROU
33700 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20  PBY flag is set 
33710 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f  in wctrlFlags) o
33720 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
33730 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65  ment.** if there
33740 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
33750 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
33760 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
33770 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
33780 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
33790 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
337a0 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
337b0 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55  n pOrderBy is NU
337c0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49  LL..**.** The iI
337d0 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 20  dxCur parameter 
337e0 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
337f0 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
33800 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f  .  If .** WHERE_
33810 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73  ONETABLE_ONLY is
33820 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73   set, iIdxCur is
33830 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
33840 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  er of an index.*
33850 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20  * to use for OR 
33860 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
33870 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c  g.  The WHERE cl
33880 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20  ause should use 
33890 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63  this.** specific
338a0 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45   cursor.  If WHE
338b0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
338c0 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ED is set, then 
338d0 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68  iIdxCur is.** th
338e0 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69  e first cursor i
338f0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75  n an array of cu
33900 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e  rsors for all in
33910 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20  dices.  iIdxCur 
33920 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65  should.** be use
33930 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
33940 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72   appropriate cur
33950 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  sor depending on
33960 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a   which index is.
33970 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72  ** used..*/.Wher
33980 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68  eInfo *sqlite3Wh
33990 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73  ereBegin(.  Pars
339a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
339b0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
339c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
339d0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
339e0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
339f0 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  e: A list of all
33a00 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63   tables to be sc
33a10 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anned */.  Expr 
33a20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
33a30 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
33a40 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
33a50 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
33a60 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28  /* An ORDER BY (
33a70 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61  or GROUP BY) cla
33a80 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
33a90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73    ExprList *pRes
33aa0 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c  ultSet, /* Resul
33ab0 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75 65  t set of the que
33ac0 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ry */.  u16 wctr
33ad0 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
33ae0 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   One of the WHER
33af0 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
33b00 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
33b10 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
33b20 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r           /* I
33b30 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  f WHERE_ONETABLE
33b40 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e  _ONLY is set, in
33b50 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  dex cursor numbe
33b60 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  r */.){.  int nB
33b70 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
33b80 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
33b90 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
33ba0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
33bb0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
33bc0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
33bd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
33be0 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
33bf0 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
33c00 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
33c10 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
33c20 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
33c30 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
33c40 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
33c50 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
33c60 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
33c70 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
33c80 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
33c90 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
33ca0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
33cb0 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
33cc0 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
33cd0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
33ce0 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68   sWLB;     /* Th
33cf0 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c  e WhereLoop buil
33d00 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  der */.  WhereMa
33d10 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
33d20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
33d30 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
33d40 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
33d50 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  pLevel;        /
33d60 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
33d70 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   in pWInfo->a[] 
33d80 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
33d90 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
33da0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
33db0 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70  single WhereLoop
33dc0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
33dd0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
33de0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
33df0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
33e00 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
33e10 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
33e20 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
33e30 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
33e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33e50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
33e60 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ...  /* Variable
33e70 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
33e80 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
33e90 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ->db;.  memset(&
33ea0 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sWLB, 0, sizeof(
33eb0 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e  sWLB));..  /* An
33ec0 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20   ORDER/GROUP BY 
33ed0 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74  clause of more t
33ee0 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e  han 63 terms can
33ef0 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
33f00 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
33f10 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64  pOrderBy && pOrd
33f20 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53  erBy->nExpr==BMS
33f30 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  -1 );.  if( pOrd
33f40 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79  erBy && pOrderBy
33f50 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70  ->nExpr>=BMS ) p
33f60 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73  OrderBy = 0;.  s
33f70 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  WLB.pOrderBy = p
33f80 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44  OrderBy;..  /* D
33f90 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49  isable the DISTI
33fa0 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  NCT optimization
33fb0 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69   if SQLITE_Disti
33fc0 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69  nctOpt is set vi
33fd0 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74  a.  ** sqlite3_t
33fe0 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f  est_ctrl(SQLITE_
33ff0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
34000 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20  ATIONS,...) */. 
34010 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
34020 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
34030 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
34040 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c  ) ){.    wctrlFl
34050 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41  ags &= ~WHERE_WA
34060 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d  NT_DISTINCT;.  }
34070 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
34080 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
34090 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
340a0 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
340b0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
340c0 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
340d0 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  k .  */.  testca
340e0 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  se( pTabList->nS
340f0 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28  rc==BMS );.  if(
34100 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
34110 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
34120 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
34130 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
34140 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
34150 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
34160 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
34170 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  This function no
34180 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73  rmally generates
34190 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66   a nested loop f
341a0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  or all tables in
341b0 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e   .  ** pTabList.
341c0 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45    But if the WHE
341d0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
341e0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
341f0 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
34200 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
34210 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
34220 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
34230 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
34240 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
34250 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
34260 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
34270 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
34280 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
34290 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
342a0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
342b0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
342c0 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
342d0 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
342e0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
342f0 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
34300 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
34310 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
34320 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
34330 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
34340 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
34350 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
34360 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
34370 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
34380 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
34390 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
343a0 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
343b0 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
343c0 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
343d0 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
343e0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
343f0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
34400 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
34410 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
34420 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
34430 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
34440 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
34450 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
34460 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
34470 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66    */.  nByteWInf
34480 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  o = ROUND8(sizeo
34490 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54  f(WhereInfo)+(nT
344a0 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66  abList-1)*sizeof
344b0 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
344c0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
344d0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
344e0 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73  , nByteWInfo + s
344f0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
34500 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
34510 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
34520 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
34530 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  b, pWInfo);.    
34540 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pWInfo = 0;.    
34550 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
34560 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  rror;.  }.  pWIn
34570 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
34580 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69  [0] = pWInfo->ai
34590 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20  CurOnePass[1] = 
345a0 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c  -1;.  pWInfo->nL
345b0 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b  evel = nTabList;
345c0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
345d0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
345e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d  Info->pTabList =
345f0 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   pTabList;.  pWI
34600 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
34610 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e  pOrderBy;.  pWIn
34620 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d  fo->pResultSet =
34630 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70   pResultSet;.  p
34640 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
34650 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
34660 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
34670 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
34680 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
34690 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
346a0 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e    pWInfo->savedN
346b0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
346c0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
346d0 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
346e0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
346f0 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20    sWLB.pWInfo = 
34700 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70  pWInfo;.  sWLB.p
34710 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
34720 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d  C;.  sWLB.pNew =
34730 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28   (WhereLoop*)(((
34740 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42  char*)pWInfo)+nB
34750 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73  yteWInfo);.  ass
34760 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
34770 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70  ALIGNMENT(sWLB.p
34780 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c  New) );.  whereL
34790 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65  oopInit(sWLB.pNe
347a0 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w);.#ifdef SQLIT
347b0 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70  E_DEBUG.  sWLB.p
347c0 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a  New->cId = '*';.
347d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c  #endif..  /* Spl
347e0 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
347f0 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
34800 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
34810 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
34820 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
34830 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
34840 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
34850 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
34860 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  et(pMaskSet);.  
34870 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
34880 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
34890 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70  Info);.  whereSp
348a0 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
348b0 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
348c0 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
348d0 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
348e0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
348f0 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
34900 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
34910 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
34920 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
34930 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
34940 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
34950 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
34960 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d  <sWLB.pWC->nTerm
34970 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
34980 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20   nTabList==0 || 
34990 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
349a0 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c  stantNotJoin(sWL
349b0 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
349c0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
349d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
349e0 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43  pParse, sWLB.pWC
349f0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70  ->a[ii].pExpr, p
34a00 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20  WInfo->iBreak,. 
34a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
34a30 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
34a40 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69    sWLB.pWC->a[ii
34a50 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ].wtFlags |= TER
34a60 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
34a70 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
34a80 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
34a90 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
34aa0 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
34ab0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
34ac0 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
34ad0 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  t = pOrderBy->nE
34ae0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74  xpr;.    if( wct
34af0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
34b00 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
34b10 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
34b20 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
34b30 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
34b40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
34b50 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
34b60 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
34b70 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
34b80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
34b90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
34ba0 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61   assigning bitma
34bb0 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f  sk values to FRO
34bc0 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73  M clause cursors
34bd0 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a  , it must be.  *
34be0 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  * the case that 
34bf0 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
34c00 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  ask for the N-th
34c10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
34c20 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  m then.  ** the 
34c30 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
34c40 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
34c50 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
34c60 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20   the N-th term. 
34c70 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20   ** is (X-1).   
34c80 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
34c90 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
34ca0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
34cb0 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73  can use.  ** its
34cc0 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
34cd0 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66  Table value to f
34ce0 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ind the bitmask 
34cf0 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
34d00 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a  le.  ** of the j
34d10 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e  oin.  Subtractin
34d20 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72  g one from the r
34d30 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61  ight table bitma
34d40 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20  sk gives a.  ** 
34d50 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
34d60 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
34d70 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ft of the join. 
34d80 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
34d90 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c  mask.  ** for al
34da0 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
34db0 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
34dc0 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  oin is important
34dd0 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
34de0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
34df0 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
34e00 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
34e10 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
34e20 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20   tables in.  ** 
34e30 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
34e40 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
34e50 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
34e60 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
34e70 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74  lly.  ** equal t
34e80 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
34e90 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
34ea0 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
34eb0 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f  the.  ** WHERE_O
34ec0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61  NETABLE_ONLY fla
34ed0 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
34ee0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
34ef0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
34f00 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
34f10 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
34f20 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
34f30 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e  ursor);.  }.#ifn
34f40 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20  def NDEBUG.  {. 
34f50 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65     Bitmask toThe
34f60 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Left = 0;.    fo
34f70 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
34f80 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
34f90 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
34fa0 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  m = getMask(pMas
34fb0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
34fc0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
34fd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d        assert( (m
34fe0 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29  -1)==toTheLeft )
34ff0 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66  ;.      toTheLef
35000 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20  t |= m;.    }.  
35010 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
35020 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68  nalyze all of th
35030 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
35040 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70  .  Note that exp
35050 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74  rAnalyze() might
35060 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69  .  ** add new vi
35070 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f  rtual terms onto
35080 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
35090 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57  WHERE clause.  W
350a0 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61  e do not.  ** wa
350b0 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  nt to analyze th
350c0 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ese virtual term
350d0 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c  s, so start anal
350e0 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  yzing at the end
350f0 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66  .  ** and work f
35100 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74  orward so that t
35110 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c  he added virtual
35120 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72   terms are never
35130 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f   processed..  */
35140 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
35150 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  l(pTabList, &pWI
35160 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28  nfo->sWC);.  if(
35170 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
35180 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  d ){.    goto wh
35190 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
351a0 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46   }..  if( wctrlF
351b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
351c0 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
351d0 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
351e0 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65  Redundant(pParse
351f0 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  , pTabList, &pWI
35200 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c  nfo->sWC, pResul
35210 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  tSet) ){.      /
35220 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d  * The DISTINCT m
35230 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c  arking is pointl
35240 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e  ess.  Ignore it.
35250 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   */.      pWInfo
35260 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
35270 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
35280 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  QUE;.    }else i
35290 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
352a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74  {.      /* Try t
352b0 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72  o ORDER BY the r
352c0 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b  esult set to mak
352d0 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65  e distinct proce
352e0 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a  ssing easier */.
352f0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63        pWInfo->wc
35300 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  trlFlags |= WHER
35310 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20  E_DISTINCTBY;.  
35320 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
35330 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65  erBy = pResultSe
35340 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
35350 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
35360 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
35370 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41  ts */.  WHERETRA
35380 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
35390 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
353a0 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20 44  ***\n"));.  /* D
353b0 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73  isplay all terms
353c0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
353d0 61 75 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  ause */.#if defi
353e0 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
353f0 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66 69 6e  NABLED) && defin
35400 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
35410 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20  _TREE_EXPLAIN). 
35420 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
35430 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  eTrace & 0x100 )
35440 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
35450 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
35460 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71  e->pVdbe;.    sq
35470 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69  lite3ExplainBegi
35480 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n(v);.    for(i=
35490 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e  0; i<sWLB.pWC->n
354a0 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
354b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
354c0 50 72 69 6e 74 66 28 76 2c 20 22 23 25 2d 32 64  Printf(v, "#%-2d
354d0 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71   ", i);.      sq
354e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
354f0 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  (v);.      where
35500 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 26  ExplainTerm(v, &
35510 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 29 3b  sWLB.pWC->a[i]);
35520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
35530 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20  plainPop(v);.   
35540 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
35550 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  nNL(v);.    }.  
35560 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
35570 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20 20 73  Finish(v);.    s
35580 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
35590 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 56  f("%s", sqlite3V
355a0 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76  dbeExplanation(v
355b0 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
355c0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31   if( nTabList!=1
355d0 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75   || whereShortCu
355e0 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20  t(&sWLB)==0 ){. 
355f0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
35600 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a  pAddAll(&sWLB);.
35610 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
35620 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
35630 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73  r;.  .    /* Dis
35640 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20  play all of the 
35650 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
35660 73 20 69 66 20 77 68 65 72 65 74 72 61 63 65 20  s if wheretrace 
35670 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69  is enabled */.#i
35680 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
35690 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a  ENABLED /* !=0 *
356a0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
356b0 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20  3WhereTrace ){. 
356c0 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
356d0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  p;.      int i;.
356e0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 68 61        static cha
356f0 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31  r zLabel[] = "01
35700 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68  23456789abcdefgh
35710 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
35720 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xz".            
35730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35740 20 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44             "ABCD
35750 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
35760 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66  UVWYXZ";.      f
35770 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  or(p=pWInfo->pLo
35780 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70  ops, i=0; p; p=p
35790 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b  ->pNextLoop, i++
357a0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49  ){.        p->cI
357b0 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a  d = zLabel[i%siz
357c0 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20  eof(zLabel)];.  
357d0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
357e0 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43  rint(p, sWLB.pWC
357f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35800 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77  .#endif.  .    w
35810 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70  herePathSolver(p
35820 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69  WInfo, 0);.    i
35830 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
35840 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
35850 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
35860 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
35870 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77  erBy ){.       w
35880 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70  herePathSolver(p
35890 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e  WInfo, pWInfo->n
358a0 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20  RowOut+1);.     
358b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
358c0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
358d0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
358e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
358f0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d  WInfo->pOrderBy=
35900 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  =0 && (db->flags
35910 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   & SQLITE_Revers
35920 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20  eOrder)!=0 ){.  
35930 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
35940 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d  sk = (Bitmask)(-
35950 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  1);.  }.  if( pP
35960 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45  arse->nErr || NE
35970 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  VER(db->mallocFa
35980 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  iled) ){.    got
35990 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
359a0 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48  r;.  }.#ifdef WH
359b0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
359c0 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 69 66 28   /* !=0 */.  if(
359d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
359e0 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  ce ){.    int ii
359f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
35a00 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53  ugPrintf("---- S
35a10 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22  olution nRow=%d"
35a20 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
35a30 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  t);.    if( pWIn
35a40 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  fo->nOBSat>0 ){.
35a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
35a60 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52  ugPrintf(" ORDER
35a70 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70  BY=%d,0x%llx", p
35a80 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70  WInfo->nOBSat, p
35a90 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b  WInfo->revMask);
35aa0 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
35ab0 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  h( pWInfo->eDist
35ac0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61  inct ){.      ca
35ad0 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
35ae0 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20  T_UNIQUE: {.    
35af0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
35b00 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
35b10 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20  CT=unique");.   
35b20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35b30 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
35b40 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
35b50 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
35b60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
35b70 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
35b80 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
35b90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
35ba0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
35bb0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
35bc0 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
35bd0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
35be0 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
35bf0 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  unordered");.   
35c00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35c10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
35c20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
35c30 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ("\n");.    for(
35c40 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d  ii=0; ii<pWInfo-
35c50 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a  >nLevel; ii++){.
35c60 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
35c70 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69  rint(pWInfo->a[i
35c80 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e  i].pWLoop, sWLB.
35c90 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pWC);.    }.  }.
35ca0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65  #endif.  /* Atte
35cb0 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c  mpt to omit tabl
35cc0 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e  es from the join
35cd0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66   that do not eff
35ce0 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a  ect the result *
35cf0 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
35d00 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20  nLevel>=2.   && 
35d10 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20  pResultSet!=0.  
35d20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
35d30 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
35d40 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29  TE_OmitNoopJoin)
35d50 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
35d60 6b 20 74 61 62 55 73 65 64 20 3d 20 65 78 70 72  k tabUsed = expr
35d70 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
35d80 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74  MaskSet, pResult
35d90 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57  Set);.    if( sW
35da0 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 20 74 61  LB.pOrderBy ) ta
35db0 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c 69 73  bUsed |= exprLis
35dc0 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
35dd0 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65  kSet, sWLB.pOrde
35de0 72 42 79 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  rBy);.    while(
35df0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
35e00 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =2 ){.      Wher
35e10 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
35e20 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  End;.      pLoop
35e30 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49   = pWInfo->a[pWI
35e40 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70  nfo->nLevel-1].p
35e50 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28  WLoop;.      if(
35e60 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   (pWInfo->pTabLi
35e70 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
35e80 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  b].jointype & JT
35e90 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65 61  _LEFT)==0 ) brea
35ea0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 63  k;.      if( (wc
35eb0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
35ec0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d  _WANT_DISTINCT)=
35ed0 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c  =0.       && (pL
35ee0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
35ef0 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a  HERE_ONEROW)==0.
35f00 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
35f10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
35f20 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55 73        if( (tabUs
35f30 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ed & pLoop->mask
35f40 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61 6b  Self)!=0 ) break
35f50 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73  ;.      pEnd = s
35f60 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c  WLB.pWC->a + sWL
35f70 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  B.pWC->nTerm;.  
35f80 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57      for(pTerm=sW
35f90 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  LB.pWC->a; pTerm
35fa0 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  <pEnd; pTerm++){
35fb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
35fc0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
35fd0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
35fe0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )!=0.         &&
35ff0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
36000 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
36010 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
36020 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
36030 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
36040 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
36050 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20   if( pTerm<pEnd 
36060 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 57  ) break;.      W
36070 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
36080 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70  , ("-> drop loop
36090 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c   %c not used\n",
360a0 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20   pLoop->cId));. 
360b0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65       pWInfo->nLe
360c0 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61  vel--;.      nTa
360d0 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  bList--;.    }. 
360e0 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
360f0 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
36100 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
36110 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e  ***\n"));.  pWIn
36120 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65  fo->pParse->nQue
36130 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f  ryLoop += pWInfo
36140 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a  ->nRowOut;..  /*
36150 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
36160 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
36170 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
36180 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69  that is requesti
36190 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  ng.  ** to use a
361a0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
361b0 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  thm, determine i
361c0 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70  f this is approp
361d0 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20  riate..  ** The 
361e0 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
361f0 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  hm only works if
36200 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
36210 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20 2a  e constrains.  *
36220 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
36230 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
36240 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
36250 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
36260 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
36270 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
36280 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
36290 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
362a0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
362b0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
362c0 29 21 3d 30 20 0a 20 20 20 26 26 20 28 70 57 49  )!=0 .   && (pWI
362d0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
362e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
362f0 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a  E_ONEROW)!=0 ){.
36300 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e      pWInfo->okOn
36310 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 69  ePass = 1;.    i
36320 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
36330 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  List->a[0].pTab)
36340 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
36350 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
36360 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
36370 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _IDX_ONLY;.    }
36380 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
36390 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
363a0 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
363b0 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
363c0 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
363d0 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
363e0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  les..  */.  notR
363f0 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
36400 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20  )0;.  for(ii=0, 
36410 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
36420 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
36430 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
36440 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
36450 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
36460 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
36470 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
36480 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
36490 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
364a0 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
364b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
364c0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  item *pTabItem;.
364d0 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
364e0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
364f0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
36500 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
36510 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20  ->pTab;.    iDb 
36520 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
36530 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
36540 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70  >pSchema);.    p
36550 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
36560 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28  WLoop;.    if( (
36570 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
36580 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
36590 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
365a0 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  ct ){.      /* D
365b0 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
365c0 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
365d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
365e0 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
365f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
36600 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
36610 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
36620 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56    const char *pV
36630 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Tab = (const cha
36640 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
36650 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
36660 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
36670 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
36680 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
36690 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
366a0 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30  P_VOpen, iCur, 0
366b0 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56  , 0, pVTab, P4_V
366c0 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TAB);.    }else 
366d0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
366e0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ab) ){.      /* 
366f0 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  noop */.    }els
36700 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
36710 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
36720 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
36730 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  Y)==0.         &
36740 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
36750 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
36760 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  CLOSE)==0 ){.   
36770 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f     int op = OP_O
36780 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 69  penRead;.      i
36790 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  f( pWInfo->okOne
367a0 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  Pass ){.        
367b0 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
367c0 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
367d0 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
367e0 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  0] = pTabItem->i
367f0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b  Cursor;.      };
36800 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
36810 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
36820 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
36830 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70  r, iDb, pTab, op
36840 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
36850 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
36860 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  or==pLevel->iTab
36870 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Cur );.      tes
36880 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e  tcase( !pWInfo->
36890 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
368a0 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  b->nCol==BMS-1 )
368b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
368c0 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
368d0 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43  Pass && pTab->nC
368e0 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
368f0 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
36900 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
36910 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73  >nCol<BMS && Has
36920 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
36930 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
36940 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
36950 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
36960 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
36970 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
36980 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
36990 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
369a0 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56  geP4(v, sqlite3V
369b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
369c0 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  )-1, .          
369d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369e0 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
369f0 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
36a00 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
36a10 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
36a20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
36a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
36a40 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
36a50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
36a60 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
36a70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
36a80 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
36a90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
36aa0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e  EXED ){.      In
36ab0 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70  dex *pIx = pLoop
36ac0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
36ad0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64  ;.      int iInd
36ae0 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74  exCur;.      int
36af0 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
36b00 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 49 64 78  d;.      /* iIdx
36b10 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 73 65  Cur is always se
36b20 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69 74 69  t if to a positi
36b30 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50  ve value if ONEP
36b40 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ASS is possible 
36b50 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
36b60 20 69 49 64 78 43 75 72 21 3d 30 20 7c 7c 20 28   iIdxCur!=0 || (
36b70 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
36b80 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
36b90 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29  SS_DESIRED)==0 )
36ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
36bb0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29 7b  fo->okOnePass ){
36bc0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
36bd0 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  pJ = pTabItem->p
36be0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
36bf0 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
36c00 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
36c10 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46    assert( wctrlF
36c20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
36c30 50 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a  PASS_DESIRED );.
36c40 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 41          while( A
36c50 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21  LWAYS(pJ) && pJ!
36c60 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20  =pIx ){.        
36c70 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20    iIndexCur++;. 
36c80 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a           pJ = pJ
36c90 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
36ca0 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20   }.        op = 
36cb0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20  OP_OpenWrite;.  
36cc0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69        pWInfo->ai
36cd0 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20  CurOnePass[1] = 
36ce0 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
36cf0 20 7d 65 6c 73 65 20 69 66 28 20 69 49 64 78 43   }else if( iIdxC
36d00 75 72 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  ur && (wctrlFlag
36d10 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
36d20 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  LE_ONLY)!=0 ){. 
36d30 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
36d40 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
36d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36d60 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61   iIndexCur = pPa
36d70 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
36d80 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65     }.      pLeve
36d90 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e  l->iIdxCur = iIn
36da0 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73  dexCur;.      as
36db0 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65  sert( pIx->pSche
36dc0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
36dd0 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  a );.      asser
36de0 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20  t( iIndexCur>=0 
36df0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36e00 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
36e10 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78  , iIndexCur, pIx
36e20 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
36e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
36e40 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
36e50 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
36e60 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
36e70 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
36e80 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
36e90 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74  ( iDb>=0 ) sqlit
36ea0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
36eb0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
36ec0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
36ed0 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66   ~getMask(&pWInf
36ee0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61  o->sMaskSet, pTa
36ef0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
36f00 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
36f10 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
36f20 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
36f30 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
36f40 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
36f50 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
36f60 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
36f70 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
36f80 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
36f90 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
36fa0 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
36fb0 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
36fc0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
36fd0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
36fe0 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
36ff0 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ram..  */.  notR
37000 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
37010 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  )0;.  for(ii=0; 
37020 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
37030 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  +){.    pLevel =
37040 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b   &pWInfo->a[ii];
37050 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37060 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
37070 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c  NDEX.    if( (pL
37080 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
37090 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
370a0 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a  TO_INDEX)!=0 ){.
370b0 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41        constructA
370c0 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50  utomaticIndex(pP
370d0 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  arse, &pWInfo->s
370e0 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  WC,.            
370f0 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e 61      &pTabList->a
37100 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c  [pLevel->iFrom],
37110 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
37120 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  l);.      if( db
37130 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
37140 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
37150 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e  Error;.    }.#en
37160 64 69 66 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f  dif.    explainO
37170 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70  neScan(pParse, p
37180 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
37190 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72   ii, pLevel->iFr
371a0 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b  om, wctrlFlags);
371b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
371c0 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  rBody = sqlite3V
371d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
371e0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
371f0 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
37200 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
37210 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
37220 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
37230 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
37240 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  nt;.  }..  /* Do
37250 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ne. */.  VdbeMod
37260 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
37270 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65  Begin WHERE-core
37280 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  "));.  return pW
37290 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
372a0 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
372b0 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
372c0 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20  ginError:.  if( 
372d0 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50  pWInfo ){.    pP
372e0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
372f0 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
37300 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  NQueryLoop;.    
37310 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
37320 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20  , pWInfo);.  }. 
37330 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
37340 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
37350 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
37360 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d  E loop.  See com
37370 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c  ments on .** sql
37380 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
37390 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
373a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
373b0 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72  void sqlite3Wher
373c0 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a  eEnd(WhereInfo *
373d0 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65  pWInfo){.  Parse
373e0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
373f0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62  o->pParse;.  Vdb
37400 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
37410 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
37420 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
37430 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  vel;.  WhereLoop
37440 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69   *pLoop;.  SrcLi
37450 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
37460 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
37470 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
37480 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
37490 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70  /* Generate loop
374a0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
374b0 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f  e..  */.  VdbeMo
374c0 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
374d0 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22  "End WHERE-core"
374e0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ));.  sqlite3Exp
374f0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
37500 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49  se);.  for(i=pWI
37510 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69  nfo->nLevel-1; i
37520 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
37530 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65  nt addr;.    pLe
37540 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
37550 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  [i];.    pLoop =
37560 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
37570 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
37580 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
37590 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
375a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
375b0 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
375c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
375d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65  dbeAddOp3(v, pLe
375e0 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
375f0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c  >p1, pLevel->p2,
37600 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20   pLevel->p3);.  
37610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
37620 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
37630 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64  l->p5);.      Vd
37640 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
37650 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
37660 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
37670 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20  p==OP_Next);.   
37680 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
37690 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
376a0 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20  =OP_Prev);.     
376b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
376c0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
376d0 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a  P_VNext);.    }.
376e0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
376f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
37700 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
37710 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
37720 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
37730 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
37740 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
37750 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
37760 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
37770 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
37780 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
37790 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
377a0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
377b0 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
377c0 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
377d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
377e0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
377f0 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
37800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37810 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45  ddOp2(v, pIn->eE
37820 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69  ndLoopOp, pIn->i
37830 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  Cur, pIn->addrIn
37840 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Top);.        Vd
37850 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
37860 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
37870 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45  ageIf(v, pIn->eE
37880 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65  ndLoopOp==OP_Pre
37890 76 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  vIfOpen);.      
378a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
378b0 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
378c0 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70  pOp==OP_NextIfOp
378d0 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  en);.        sql
378e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
378f0 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
37900 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  op-1);.      }. 
37910 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
37920 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
37930 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
37940 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
37950 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
37960 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
37970 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
37980 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b  vel->addrSkip ){
37990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
379a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
379b0 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
379c0 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20  addrSkip);.     
379d0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
379e0 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e   "next skip-scan
379f0 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e   on %s", pLoop->
37a00 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
37a10 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
37a20 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
37a30 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  re(v, pLevel->ad
37a40 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73  drSkip);.      s
37a50 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
37a60 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  re(v, pLevel->ad
37a70 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d  drSkip-2);.    }
37a80 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
37a90 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
37aa0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
37ab0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
37ac0 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c  OP_IfPos, pLevel
37ad0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64  ->iLeftJoin); Vd
37ae0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
37af0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
37b00 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
37b10 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
37b20 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
37b30 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
37b40 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
37b50 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
37b60 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
37b70 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
37b80 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
37b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37ba0 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
37bb0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
37bc0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
37bd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f   }.      if( pLo
37be0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37bf0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
37c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37c10 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
37c20 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
37c30 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
37c40 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
37c50 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72  el->op==OP_Retur
37c60 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
37c70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37c80 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76  , OP_Gosub, pLev
37c90 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
37ca0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
37cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37cd0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
37ce0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
37cf0 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
37d00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
37d10 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
37d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65  ;.    }.    Vdbe
37d30 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
37d40 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f  , "End WHERE-loo
37d50 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20  p%d: %s", i,.   
37d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d70 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
37d80 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
37d90 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  rom].pTab->zName
37da0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ));.  }..  /* Th
37db0 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
37dc0 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
37dd0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
37de0 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
37df0 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
37e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
37e10 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
37e20 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
37e30 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
37e40 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73  >nLevel<=pTabLis
37e50 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72  t->nSrc );.  for
37e60 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
37e70 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f  nfo->a; i<pWInfo
37e80 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70  ->nLevel; i++, p
37e90 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
37ea0 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56  t k, last;.    V
37eb0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
37ec0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
37ed0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
37ee0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
37ef0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
37f00 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
37f10 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
37f20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
37f30 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
37f40 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pTab!=0 );.    p
37f50 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
37f60 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46  WLoop;..    /* F
37f70 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c  or a co-routine,
37f80 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43   change all OP_C
37f90 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
37fa0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66   to the table of
37fb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72  .    ** the co-r
37fc0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 53  outine into OP_S
37fd0 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63  Copy of result c
37fe0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65  ontained in a re
37ff0 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f  gister..    ** O
38000 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20  P_Rowid becomes 
38010 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a  OP_Null..    */.
38020 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d      if( pTabItem
38030 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 26  ->viaCoroutine &
38040 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
38050 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 6c 61 73  led ){.      las
38060 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
38070 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
38080 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d       k = pLevel-
38090 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20  >addrBody;.     
380a0 20 70 4f 70 20 3d 20 73 71 6c 69