/ Hex Artifact Content
Login

Artifact 182f16d91060418dfcc7401d24e43d8ec24e026c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72  = -1;.  }.  pTer
1c70: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
1c80: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1c90: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
1ca0: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
1cb0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
1cc0: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
1cd0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
1ce0: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
1cf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d00: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
1d10: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
1d20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
1d30: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
1d40: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
1d50: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
1d60: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
1d70: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
1d80: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
1d90: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
1da0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
1db0: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
1dc0: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
1dd0: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
1de0: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
1df0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
1e00: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
1e10: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
1e20: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
1e30: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
1e40: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
1e50: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
1e60: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1e70: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
1e80: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
1e90: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
1ea0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
1eb0: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
1ec0: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
1ed0: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
1ee0: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
1ef0: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
1f00: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
1f10: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
1f20: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
1f30: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
1f40: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
1f50: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
1f60: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
1f70: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
1f80: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
1f90: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
1fa0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
1fb0: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
1fc0: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
1fd0: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
1fe0: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
1ff0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2000: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
2010: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
2020: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2030: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
2040: 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  u8 op){.  pWC->o
2050: 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45  p = op;.  if( pE
2060: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
2070: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2080: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
2090: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
20a0: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
20b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
20c0: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
20d0: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
20e0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
20f0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2100: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
2110: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
2120: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
2130: 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ect.*/.#define i
2140: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28  nitMaskSet(P)  (
2150: 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52  P)->n=0../*.** R
2160: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
2170: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
2180: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
2190: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
21a0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
21b0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
21c0: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
21d0: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
21e0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
21f0: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
2200: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
2210: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
2220: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
2230: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2240: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
2250: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
2260: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
2270: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
2280: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
2290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22b0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
22c0: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
22d0: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
22e0: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
22f0: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
2300: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
2310: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2320: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2330: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
2340: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
2350: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
2360: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2370: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
2380: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
2390: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
23a0: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
23b0: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
23c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
23d0: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
23e0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
23f0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2400: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
2410: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
2420: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
2430: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
2440: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
2450: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
2460: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
2470: 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76  s walk (recursiv
2480: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
2490: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
24a0: 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73  rate.** a bitmas
24b0: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
24c0: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
24d0: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
24e0: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
24f0: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
2500: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2510: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2520: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
2530: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2540: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
2550: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2560: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
2570: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
2580: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
2590: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
25a0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
25b0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
25c0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
25d0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
25e0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
25f0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
2600: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
2610: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
2620: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
2630: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
2640: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2650: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
2660: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2670: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2680: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
2690: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
26a0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
26b0: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
26c0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
26d0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
26e0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
26f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
2700: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2710: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2720: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
2730: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2740: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2750: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
2760: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
2770: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
2780: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
2790: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
27a0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
27b0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
27c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
27d0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
27e0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
27f0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2800: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
2810: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
2820: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2830: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2840: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
2850: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
2860: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2870: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
2880: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
2890: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
28a0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
28b0: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
28c0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
28d0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
28e0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
28f0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
2900: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2910: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2920: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
2930: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
2940: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2950: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
2960: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
2970: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
2980: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
2990: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
29a0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
29b0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
29c0: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
29d0: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
29e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
29f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2a00: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
2a10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
2a20: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
2a30: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2a40: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
2a50: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
2a60: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2a70: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2a80: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
2a90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2aa0: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
2ab0: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
2ac0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
2ad0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2ae0: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
2af0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
2b00: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
2b10: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
2b20: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
2b30: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2b40: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
2b50: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
2b60: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
2b70: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c  <=", ">=", "IN",
2b80: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
2b90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2ba0: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
2bb0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
2bc0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<T
2bd0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2be0: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
2bf0: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
2c00: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
2c10: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
2c20: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2c30: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
2c40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
2c50: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
2c60: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
2c70: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
2c80: 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77  ULL;.}../*.** Sw
2c90: 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f  ap two objects o
2ca0: 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a  f type TYPE..*/.
2cb0: 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50  #define SWAP(TYP
2cc0: 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41  E,A,B) {TYPE t=A
2cd0: 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a  ; A=B; B=t;}../*
2ce0: 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f  .** Commute a co
2cf0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2d00: 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20  r.  Expressions 
2d10: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f  of the form "X o
2d20: 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76  p Y".** are conv
2d30: 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70  erted into "Y op
2d40: 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65   X"..**.** If le
2d50: 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65  ft/right precede
2d60: 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69  nce rules come i
2d70: 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65  nto play when de
2d80: 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  termining the.**
2d90: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2da0: 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54  nce, then COLLAT
2db0: 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  E operators are 
2dc0: 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75  adjusted to ensu
2dd0: 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  re.** that the c
2de0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2df0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  e does not chang
2e00: 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
2e10: 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e  .** "Y collate N
2e20: 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f  OCASE op X" beco
2e30: 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63  mes "X op Y" bec
2e40: 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ause any collati
2e50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a  on sequence on.*
2e60: 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  * the left hand 
2e70: 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72  side of a compar
2e80: 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  ison overrides a
2e90: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
2ea0: 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68  uence .** attach
2eb0: 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e  ed to the right.
2ec0: 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65   For the same re
2ed0: 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c  ason the EP_Coll
2ee0: 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e  ate flag.** is n
2ef0: 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a  ot commuted..*/.
2f00: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
2f10: 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70  Commute(Parse *p
2f20: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
2f30: 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69  pr){.  u16 expRi
2f40: 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52  ght = (pExpr->pR
2f50: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
2f60: 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36  _Collate);.  u16
2f70: 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70   expLeft = (pExp
2f80: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
2f90: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20  & EP_Collate);. 
2fa0: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
2fb0: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
2fc0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
2fd0: 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69  N );.  if( expRi
2fe0: 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a  ght==expLeft ){.
2ff0: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20      /* Either X 
3000: 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20  and Y both have 
3010: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3020: 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a   or neither do *
3030: 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67  /.    if( expRig
3040: 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  ht ){.      /* B
3050: 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65  oth X and Y have
3060: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
3070: 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58  rs.  Make sure X
3080: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20   is always.     
3090: 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61   ** used by clea
30a0: 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c  ring the EP_Coll
30b0: 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e  ate flag from Y.
30c0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
30d0: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
30e0: 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20  = ~EP_Collate;. 
30f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
3100: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
3110: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
3120: 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
3130: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e    /* Neither X n
3140: 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  or Y have COLLAT
3150: 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74  E operators, but
3160: 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66   X has a non-def
3170: 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ault.      ** co
3180: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
3190: 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50  .  So add the EP
31a0: 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20  _Collate marker 
31b0: 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20  on X to cause.  
31c0: 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20      ** it to be 
31d0: 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20  searched first. 
31e0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
31f0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pLeft->flags |= 
3200: 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  EP_Collate;.    
3210: 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70  }.  }.  SWAP(Exp
3220: 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r*,pExpr->pRight
3230: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  ,pExpr->pLeft);.
3240: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e    if( pExpr->op>
3250: 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73  =TK_GT ){.    as
3260: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
3270: 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  GT+2 );.    asse
3280: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45  rt( TK_GE==TK_LE
3290: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
32a0: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b  ( TK_GT>TK_EQ );
32b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
32c0: 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  GT<TK_LE );.    
32d0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
32e0: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70  p>=TK_GT && pExp
32f0: 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a  r->op<=TK_GE );.
3300: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
3310: 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47  ((pExpr->op-TK_G
3320: 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d  T)^2)+TK_GT;.  }
3330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
3340: 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f  ate from TK_xx o
3350: 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78  perator to WO_xx
3360: 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61   bitmask..*/.sta
3370: 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72  tic u16 operator
3380: 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20  Mask(int op){.  
3390: 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28  u16 c;.  assert(
33a0: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29   allowedOp(op) )
33b0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
33c0: 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  N ){.    c = WO_
33d0: 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
33e0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
33f0: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55  .    c = WO_ISNU
3400: 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
3410: 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c   assert( (WO_EQ<
3420: 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30  <(op-TK_EQ)) < 0
3430: 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d  x7fff );.    c =
3440: 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f   (u16)(WO_EQ<<(o
3450: 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20  p-TK_EQ));.  }. 
3460: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3470: 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f  ISNULL || c==WO_
3480: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ISNULL );.  asse
3490: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
34a0: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
34b0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
34c0: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
34d0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
34e0: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
34f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3500: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
3510: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
3520: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
3530: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
3540: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
3550: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
3560: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
3570: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
3580: 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74  next WhereTerm t
3590: 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f  hat matches acco
35a0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69  rding to the cri
35b0: 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69  teria.** establi
35c0: 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53  shed when the pS
35d0: 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69  can object was i
35e0: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68  nitialized by wh
35f0: 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a  ereScanInit()..*
3600: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
3610: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
3620: 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72  re matching Wher
3630: 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69  eTerms..*/.stati
3640: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  c WhereTerm *whe
3650: 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65  reScanNext(Where
3660: 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20  Scan *pScan){.  
3670: 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
3680: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
3690: 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  or on the LHS of
36a0: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69   the term */.  i
36b0: 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
36c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
36d0: 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  n on the LHS of 
36e0: 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f  the term.  -1 fo
36f0: 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20  r IPK */.  Expr 
3700: 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
3710: 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
3720: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
3730: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3740: 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74  pWC;    /* Short
3750: 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e  hand for pScan->
3760: 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  pWC */.  WhereTe
3770: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a  rm *pTerm;    /*
3780: 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20   The term being 
3790: 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
37a0: 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20  k = pScan->k;   
37b0: 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61   /* Where to sta
37c0: 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a  rt scanning */..
37d0: 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e    while( pScan->
37e0: 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e  iEquiv<=pScan->n
37f0: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75  Equiv ){.    iCu
3800: 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  r = pScan->aEqui
3810: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
3820: 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20  2];.    iColumn 
3830: 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  = pScan->aEquiv[
3840: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
3850: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57  ;.    while( (pW
3860: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21  C = pScan->pWC)!
3870: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
3880: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20  pTerm=pWC->a+k; 
3890: 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b  k<pWC->nTerm; k+
38a0: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
38b0: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
38c0: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
38d0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65  .         && pTe
38e0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
38f0: 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ==iColumn.      
3900: 20 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45     && (pScan->iE
3910: 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72  quiv<=2 || !Expr
3920: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
3930: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
3940: 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20  mJoin)).        
3950: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
3960: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3970: 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d  or & WO_EQUIV)!=
3980: 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
3990: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72  pScan->nEquiv<Ar
39a0: 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61  raySize(pScan->a
39b0: 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20  Equiv).         
39c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
39d0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  int j;.         
39e0: 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45     pX = sqlite3E
39f0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
3a00: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
3a10: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
3a20: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
3a30: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
3a40: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
3a50: 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71  =0; j<pScan->nEq
3a60: 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20  uiv; j+=2){.    
3a70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
3a80: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d  can->aEquiv[j]==
3a90: 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pX->iTable.     
3aa0: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63            && pSc
3ab0: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d  an->aEquiv[j+1]=
3ac0: 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  =pX->iColumn ){.
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3af0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3b10: 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d     if( j==pScan-
3b20: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20  >nEquiv ){.     
3b30: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
3b40: 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e  aEquiv[j] = pX->
3b50: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
3b60: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71        pScan->aEq
3b70: 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69  uiv[j+1] = pX->i
3b80: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
3b90: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71        pScan->nEq
3ba0: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  uiv += 2;.      
3bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3bc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
3bd0: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
3be0: 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d  tor & pScan->opM
3bf0: 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
3c00: 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
3c10: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e   the affinity an
3c20: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
3c30: 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20  ence match */.  
3c40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
3c50: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26  can->zCollName &
3c60: 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
3c70: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29  tor & WO_ISNULL)
3c80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
3c90: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
3ca0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
3cb0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
3cc0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e   = pWC->pWInfo->
3cd0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
3ce0: 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
3cf0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
3d00: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
3d10: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
3d20: 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64  Ok(pX, pScan->id
3d30: 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20  xaff) ){.       
3d40: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
3d50: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
3d60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
3d70: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
3d80: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
3d90: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
3da0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
3db0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20  llSeq(pParse,.  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
3e00: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
3e10: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
3e20: 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61  =0 ) pColl = pPa
3e30: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
3e40: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3e50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
3e60: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
3e70: 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e  e, pScan->zCollN
3e80: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
3e90: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3ea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3eb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3ed0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3ee0: 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20  r & WO_EQ)!=0.  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
3f00: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
3f10: 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54  ->pRight)->op==T
3f20: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
3f30: 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61        && pX->iTa
3f40: 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75  ble==pScan->aEqu
3f50: 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20  iv[0].          
3f60: 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d     && pX->iColum
3f70: 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  n==pScan->aEquiv
3f80: 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [1].            
3f90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3fa0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
3fb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3fc0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20       pScan->k = 
3fd0: 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  k+1;.           
3fe0: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
3ff0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4000: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4010: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
4020: 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74  pScan->pWC->pOut
4030: 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b  er;.      k = 0;
4040: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e  .    }.    pScan
4050: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
4060: 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20  OrigWC;.    k = 
4070: 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45  0;.    pScan->iE
4080: 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20  quiv += 2;.  }. 
4090: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
40a0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
40b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63   WHERE clause sc
40c0: 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52  anner object.  R
40d0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
40e0: 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  to the.** first 
40f0: 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e  match.  Return N
4100: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65  ULL if there are
4110: 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a   no matches..**.
4120: 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77  ** The scanner w
4130: 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67  ill be searching
4140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4150: 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20  e pWC.  It will 
4160: 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d  look.** for term
4170: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
4180: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68   <op> <expr>" wh
4190: 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  ere X is column 
41a0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
41b0: 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c  .** iCur.  The <
41c0: 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op> must be one 
41d0: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
41e0: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70   described by op
41f0: 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Mask..**.** If t
4200: 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72  he search is for
4210: 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45   X and the WHERE
4220: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
4230: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
4240: 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74   form X=Y then t
4250: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
4260: 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65  t also return te
4270: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  rms of the form.
4280: 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72  ** "Y <op> <expr
4290: 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  >".  The number 
42a0: 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61  of levels of tra
42b0: 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d  nsitivity is lim
42c0: 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20  ited,.** but is 
42d0: 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65  enough to handle
42e0: 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f   most commonly o
42f0: 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61  ccurring SQL sta
4300: 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  tements..**.** I
4310: 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49  f X is not the I
4320: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
4330: 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62  EY then X must b
4340: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
4350: 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e  h.** index pIdx.
4360: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
4370: 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49  Term *whereScanI
4380: 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e  nit(.  WhereScan
4390: 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f   *pScan,       /
43a0: 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20  * The WhereScan 
43b0: 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69  object being ini
43c0: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68  tialized */.  Wh
43d0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
43e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
43f0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
4400: 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74  scanned */.  int
4410: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
4420: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
4430: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
4440: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
4450: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
4460: 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  n to scan for */
4470: 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20  .  u32 opMask,  
4480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
4490: 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61  erator(s) to sca
44a0: 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  n for */.  Index
44b0: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
44c0: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
44d0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
44e0: 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  is index */.){. 
44f0: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65   int j;..  /* me
4500: 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73  mset(pScan, 0, s
4510: 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20  izeof(*pScan)); 
4520: 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69  */.  pScan->pOri
4530: 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63  gWC = pWC;.  pSc
4540: 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20  an->pWC = pWC;. 
4550: 20 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f   if( pIdx && iCo
4560: 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70  lumn>=0 ){.    p
4570: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70  Scan->idxaff = p
4580: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
4590: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
45a0: 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  ity;.    for(j=0
45b0: 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ; pIdx->aiColumn
45c0: 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b  [j]!=iColumn; j+
45d0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45  +){.      if( NE
45e0: 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b 65  VER(j>=pIdx->nKe
45f0: 79 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 30  yCol) ) return 0
4600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61  ;.    }.    pSca
4610: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70  n->zCollName = p
4620: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a  Idx->azColl[j];.
4630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63    }else{.    pSc
4640: 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a  an->idxaff = 0;.
4650: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
4660: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
4670: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20  pScan->opMask = 
4680: 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d  opMask;.  pScan-
4690: 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d  >k = 0;.  pScan-
46a0: 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75  >aEquiv[0] = iCu
46b0: 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75  r;.  pScan->aEqu
46c0: 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b  iv[1] = iColumn;
46d0: 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  .  pScan->nEquiv
46e0: 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69   = 2;.  pScan->i
46f0: 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74  Equiv = 2;.  ret
4700: 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78  urn whereScanNex
4710: 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  t(pScan);.}../*.
4720: 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  ** Search for a 
4730: 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
4740: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
4750: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4760: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
4770: 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66  where X is a ref
4780: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43  erence to the iC
4790: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69  olumn of table i
47a0: 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20  Cur and <op> is 
47b0: 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f  one of.** the WO
47c0: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64  _xx operator cod
47d0: 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  es specified by 
47e0: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
47f0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ..** Return a po
4800: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72  inter to the ter
4810: 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  m.  Return 0 if 
4820: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
4830: 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e   The term return
4840: 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65  ed might by Y=<e
4850: 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69 73  xpr> if there is
4860: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61   another constra
4870: 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  int in.** the WH
4880: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
4890: 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20 58  specifies that X
48a0: 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f  =Y.  Any such co
48b0: 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62  nstraints will b
48c0: 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20  e.** identified 
48d0: 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20  by the WO_EQUIV 
48e0: 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d  bit in the pTerm
48f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c  ->eOperator fiel
4900: 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69  d.  The.** aEqui
4910: 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20  v[] array holds 
4920: 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71  X and all its eq
4930: 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20  uivalents, with 
4940: 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c  each SQL variabl
4950: 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74  e.** taking up t
4960: 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75  wo slots in aEqu
4970: 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74  iv[].  The first
4980: 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65   slot is for the
4990: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a   cursor number.*
49a0: 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  * and the second
49b0: 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75   is for the colu
49c0: 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72  mn number.  Ther
49d0: 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69  e are 22 slots i
49e0: 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f  n aEquiv[].** so
49f0: 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63   that means we c
4a00: 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c  an look for X pl
4a10: 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65  us up to 10 othe
4a20: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c  r equivalent val
4a30: 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20  ues..** Hence a 
4a40: 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c  search for X wil
4a50: 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20  l return <expr> 
4a60: 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41  if X=A1 and A1=A
4a70: 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61  2 and A2=A3.** a
4a80: 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31  nd ... and A9=A1
4a90: 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e  0 and A10=<expr>
4aa0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
4ab0: 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65   are multiple te
4ac0: 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
4ad0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
4ae0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
4af0: 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20  r>".** then try 
4b00: 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68  for the one with
4b10: 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73   no dependencies
4b20: 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20   on <expr> - in 
4b30: 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72  other words wher
4b40: 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61  e.** <expr> is a
4b50: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
4b60: 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  sion of some kin
4b70: 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20  d.  Only return 
4b80: 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68  entries of.** th
4b90: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
4ba0: 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63  " where Y is a c
4bb0: 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72  olumn in another
4bc0: 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72   table if no ter
4bd0: 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  ms of.** the for
4be0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74  m "X <op> <const
4bf0: 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20  -expr>" exist.  
4c00: 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74   If no terms wit
4c10: 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53  h a constant RHS
4c20: 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74  .** exist, try t
4c30: 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20  o return a term 
4c40: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
4c50: 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73  e WO_EQUIV..*/.s
4c60: 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20  tatic WhereTerm 
4c70: 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65  *findTerm(.  Whe
4c80: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
4c90: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
4ca0: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61  clause to be sea
4cb0: 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  rched */.  int i
4cc0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
4cd0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
4ce0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e  r of LHS */.  in
4cf0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
4d00: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
4d10: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
4d20: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
4d30: 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75  y,     /* RHS mu
4d40: 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77  st not overlap w
4d50: 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f  ith this mask */
4d60: 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20  .  u32 op,      
4d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
4d80: 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73   of WO_xx values
4d90: 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72   describing oper
4da0: 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ator */.  Index 
4db0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
4dc0: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
4dd0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
4de0: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
4df0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  LL */.){.  Where
4e00: 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20  Term *pResult = 
4e10: 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  0;.  WhereTerm *
4e20: 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  p;.  WhereScan s
4e30: 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72  can;..  p = wher
4e40: 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
4e50: 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c   pWC, iCur, iCol
4e60: 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a  umn, op, pIdx);.
4e70: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
4e80: 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
4e90: 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
4ea0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
4eb0: 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74  ( p->prereqRight
4ec0: 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72  ==0 && (p->eOper
4ed0: 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29  ator&WO_EQ)!=0 )
4ee0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4ef0: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
4f00: 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30    if( pResult==0
4f10: 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a   ) pResult = p;.
4f20: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68      }.    p = wh
4f30: 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
4f40: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
4f50: 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20   pResult;.}../* 
4f60: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
4f70: 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e */.static void
4f80: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63   exprAnalyze(Src
4f90: 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75  List*, WhereClau
4fa0: 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  se*, int);../*.*
4fb0: 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79  * Call exprAnaly
4fc0: 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ze on all terms 
4fd0: 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  in a WHERE claus
4fe0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e.  .*/.static v
4ff0: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  oid exprAnalyzeA
5000: 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ll(.  SrcList *p
5010: 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  TabList,       /
5020: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
5030: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
5040: 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20  se *pWC         
5050: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
5060: 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  use to be analyz
5070: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ed */.){.  int i
5080: 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
5090: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
50a0: 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  -){.    exprAnal
50b0: 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57  yze(pTabList, pW
50c0: 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  C, i);.  }.}..#i
50d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
50e0: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
50f0: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  ION./*.** Check 
5100: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
5110: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
5120: 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  s a LIKE or GLOB
5130: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a   operator that.*
5140: 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a  * can be optimiz
5150: 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c  ed using inequal
5160: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
5170: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
5180: 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64   it is.** so and
5190: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
51a0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
51b0: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74  r the operator t
51c0: 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65  o be optimizible
51d0: 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62  , the RHS must b
51e0: 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69  e a string.** li
51f0: 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20  teral that does 
5200: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
5210: 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a   wildcard.  .*/.
5220: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b  static int isLik
5230: 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65  eOrGlob(.  Parse
5240: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
5250: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
5260: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
5270: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
5280: 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65  Expr,      /* Te
5290: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
52a0: 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  on */.  Expr **p
52b0: 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69  pPrefix,  /* Poi
52c0: 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e  nter to TK_STRIN
52d0: 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  G expression wit
52e0: 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78  h pattern prefix
52f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f   */.  int *pisCo
5300: 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20  mplete, /* True 
5310: 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64  if the only wild
5320: 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65  card is % in the
5330: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
5340: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73  */.  int *pnoCas
5350: 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  e      /* True i
5360: 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65  f uppercase is e
5370: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77  quivalent to low
5380: 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63  ercase */.){.  c
5390: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
53a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  ;         /* Str
53b0: 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49  ing on RHS of LI
53c0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
53d0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
53e0: 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52  pLeft;      /* R
53f0: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
5400: 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  ze of LIKE opera
5410: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  tor */.  ExprLis
5420: 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  t *pList;       
5430: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f      /* List of o
5440: 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c  perands to the L
5450: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5460: 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20    int c;        
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5480: 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e  One character in
5490: 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e   z[] */.  int cn
54a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
54b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
54c0: 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70  f non-wildcard p
54d0: 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73  refix characters
54e0: 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d   */.  char wc[3]
54f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5500: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61   /* Wildcard cha
5510: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c  racters */.  sql
5520: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5530: 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
5540: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
5550: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
5560: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69  e *pVal = 0;.  i
5570: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
5580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
5590: 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f  ode of pRight */
55a0: 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ..  if( !sqlite3
55b0: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64  IsLikeFunction(d
55c0: 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73  b, pExpr, pnoCas
55d0: 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65  e, wc) ){.    re
55e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64  turn 0;.  }.#ifd
55f0: 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43  ef SQLITE_EBCDIC
5600: 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20  .  if( *pnoCase 
5610: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
5620: 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78  if.  pList = pEx
5630: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70  pr->x.pList;.  p
5640: 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Left = pList->a[
5650: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  1].pExpr;.  if( 
5660: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pLeft->op!=TK_CO
5670: 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69  LUMN .   || sqli
5680: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
5690: 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41  pLeft)!=SQLITE_A
56a0: 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49  FF_TEXT .   || I
56b0: 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e  sVirtual(pLeft->
56c0: 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f  pTab).  ){.    /
56d0: 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34  * IMP: R-02065-4
56e0: 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61  9465 The left-ha
56f0: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c  nd side of the L
5700: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
5710: 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a  ator must.    **
5720: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
5730: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
5740: 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69  n with TEXT affi
5750: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74  nity. */.    ret
5760: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
5770: 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  ert( pLeft->iCol
5780: 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  umn!=(-1) ); /* 
5790: 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65  Because IPK neve
57a0: 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a  r has AFF_TEXT *
57b0: 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71  /..  pRight = sq
57c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
57d0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  late(pList->a[0]
57e0: 2e 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20  .pExpr);.  op = 
57f0: 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66  pRight->op;.  if
5800: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
5810: 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70  E ){.    Vdbe *p
5820: 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72  Reprepare = pPar
5830: 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a  se->pReprepare;.
5840: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5850: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  Right->iColumn;.
5860: 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
5870: 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
5880: 6c 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20  lue(pReprepare, 
5890: 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46  iCol, SQLITE_AFF
58a0: 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20  _NONE);.    if( 
58b0: 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f  pVal && sqlite3_
58c0: 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
58d0: 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
58e0: 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72  .      z = (char
58f0: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
5900: 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20  _text(pVal);.   
5910: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
5920: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61  beSetVarmask(pPa
5930: 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c  rse->pVdbe, iCol
5940: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5950: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  Right->op==TK_VA
5960: 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74  RIABLE || pRight
5970: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
5980: 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  R );.  }else if(
5990: 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29   op==TK_STRING )
59a0: 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74  {.    z = pRight
59b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a  ->u.zToken;.  }.
59c0: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63    if( z ){.    c
59d0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
59e0: 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30  e( (c=z[cnt])!=0
59f0: 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20   && c!=wc[0] && 
5a00: 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77  c!=wc[1] && c!=w
5a10: 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e  c[2] ){.      cn
5a20: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t++;.    }.    i
5a30: 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35  f( cnt!=0 && 255
5a40: 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29  !=(u8)z[cnt-1] )
5a50: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50  {.      Expr *pP
5a60: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69  refix;.      *pi
5a70: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77  sComplete = c==w
5a80: 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d  c[0] && z[cnt+1]
5a90: 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66  ==0;.      pPref
5aa0: 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ix = sqlite3Expr
5ab0: 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20  (db, TK_STRING, 
5ac0: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  z);.      if( pP
5ad0: 72 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d  refix ) pPrefix-
5ae0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d  >u.zToken[cnt] =
5af0: 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65   0;.      *ppPre
5b00: 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20  fix = pPrefix;. 
5b10: 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
5b20: 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20  VARIABLE ){.    
5b30: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
5b40: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
5b50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5b60: 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52  SetVarmask(v, pR
5b70: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  ight->iColumn);.
5b80: 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73          if( *pis
5b90: 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67  Complete && pRig
5ba0: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20  ht->u.zToken[1] 
5bb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
5bc0: 49 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68  If the rhs of th
5bd0: 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f  e LIKE expressio
5be0: 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c  n is a variable,
5bf0: 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
5c00: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61  .          ** va
5c10: 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61  lue of the varia
5c20: 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ble means there 
5c30: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e  is no need to in
5c40: 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20  voke the LIKE.  
5c50: 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
5c60: 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f  ion, then no OP_
5c70: 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65  Variable will be
5c80: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72   added to the pr
5c90: 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20  ogram..         
5ca0: 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20   ** This causes 
5cb0: 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65  problems for the
5cc0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
5cd0: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20  rameter_name(). 
5ce0: 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e           ** API.
5cf0: 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74   To workaround t
5d00: 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79  hem, add a dummy
5d10: 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72   OP_Variable her
5d20: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20  e..          */ 
5d30: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
5d40: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
5d50: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5d60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5d70: 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
5d80: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
5d90: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
5da0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5db0: 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  3(v, sqlite3Vdbe
5dc0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
5dd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
5de0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
5df0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
5e00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5e10: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
5e20: 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20        z = 0;.   
5e30: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
5e40: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
5e50: 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30  ;.  return (z!=0
5e60: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
5e70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
5e80: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
5e90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5ea0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
5eb0: 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  LE./*.** Check t
5ec0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
5ed0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
5ee0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
5ef0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
5f00: 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a  n MATCH expr.**.
5f10: 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e  ** If it is then
5f20: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49   return TRUE.  I
5f30: 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41  f not, return FA
5f40: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
5f50: 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  nt isMatchOfColu
5f60: 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70  mn(.  Expr *pExp
5f70: 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74  r      /* Test t
5f80: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
5f90: 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
5fa0: 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  *pList;..  if( p
5fb0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e  Expr->op!=TK_FUN
5fc0: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74  CTION ){.    ret
5fd0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
5fe0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5ff0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
6000: 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20  "match")!=0 ){. 
6010: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6020: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
6030: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28  ->x.pList;.  if(
6040: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32   pList->nExpr!=2
6050: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6060: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
6070: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[1].pExpr->o
6080: 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29  p != TK_COLUMN )
6090: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
60a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
60b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
60c0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
60d0: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ABLE */../*.** I
60e0: 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72  f the pBase expr
60f0: 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
6100: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
6110: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a  SING clause of.*
6120: 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  * a join, then t
6130: 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72  ransfer the appr
6140: 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73  opriate markings
6150: 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64   over to derived
6160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6170: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
6180: 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72  kings(Expr *pDer
6190: 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73  ived, Expr *pBas
61a0: 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76  e){.  if( pDeriv
61b0: 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76  ed ){.    pDeriv
61c0: 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61  ed->flags |= pBa
61d0: 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  se->flags & EP_F
61e0: 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65  romJoin;.    pDe
61f0: 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69  rived->iRightJoi
6200: 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e  nTable = pBase->
6210: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
6220: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
6230: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6240: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
6250: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
6260: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6270: 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  RY)./*.** Analyz
6280: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f  e a term that co
6290: 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72  nsists of two or
62a0: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
62b0: 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20  ed.** subterms. 
62c0: 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20   So in:.**.**   
62d0: 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d    ... WHERE  (a=
62e0: 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63  5) AND (b=7 OR c
62f0: 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20  =9 OR d=13) AND 
6300: 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20  (d=13).**       
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e     ^^^^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68  ^^^^^^^.**.** Th
6340: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79  is routine analy
6350: 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61  zes terms such a
6360: 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72  s the middle ter
6370: 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65  m in the above e
6380: 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65  xample..** A Whe
6390: 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20  reOrTerm object 
63a0: 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20  is computed and 
63b0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
63c0: 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e  term under.** an
63d0: 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65  alysis, regardle
63e0: 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d  ss of the outcom
63f0: 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69  e of the analysi
6400: 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a  s.  Hence:.**.**
6410: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77       WhereTerm.w
6420: 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52  tFlags   |=  TER
6430: 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20  M_ORINFO.**     
6440: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
6450: 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69  nfo  =  a dynami
6460: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
6470: 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65  WhereOrTerm obje
6480: 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  ct.**.** The ter
6490: 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  m being analyzed
64a0: 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f   must have two o
64b0: 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e  r more of OR-con
64c0: 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e  nected subterms.
64d0: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62  .** A single sub
64e0: 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20  term might be a 
64f0: 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65  set of AND-conne
6500: 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d  cted sub-subterm
6510: 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f  s..** Examples o
6520: 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e  f terms under an
6530: 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  alysis:.**.**   
6540: 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74    (A)     t1.x=t
6550: 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a  2.y OR t1.x=t2.z
6560: 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74   OR t1.y=15 OR t
6570: 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20  1.z=t3.a+5.**   
6580: 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72    (B)     x=expr
6590: 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20  1 OR expr2=x OR 
65a0: 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28  x=expr3.**     (
65b0: 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79  C)     t1.x=t2.y
65c0: 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41   OR (t1.x=t2.z A
65d0: 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20  ND t1.y=15).**  
65e0: 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70     (D)     x=exp
65f0: 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20  r1 OR (y>11 AND 
6600: 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20  y<22 AND z LIKE 
6610: 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20  '*hello*').**   
6620: 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31    (E)     (p.a=1
6630: 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72   AND q.b=2 AND r
6640: 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20  .c=3) OR (p.x=4 
6650: 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e  AND q.y=5 AND r.
6660: 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20  z=6).**.** CASE 
6670: 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  1:.**.** If all 
6680: 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20  subterms are of 
6690: 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70  the form T.C=exp
66a0: 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c  r for some singl
66b0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e  e column of C an
66c0: 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  d.** a single ta
66d0: 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20  ble T (as shown 
66e0: 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f  in example B abo
66f0: 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ve) then create 
6700: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a  a new virtual.**
6710: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e   term that is an
6720: 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65   equivalent IN e
6730: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f  xpression.  In o
6740: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
6750: 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67  he term.** being
6760: 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a   analyzed is:.**
6770: 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70  .**      x = exp
6780: 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20  r1  OR  expr2 = 
6790: 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33  x  OR  x = expr3
67a0: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61  .**.** then crea
67b0: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
67c0: 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a   term like this:
67d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
67e0: 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78   (expr1,expr2,ex
67f0: 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20  pr3).**.** CASE 
6800: 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  2:.**.** If all 
6810: 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64  subterms are ind
6820: 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67  exable by a sing
6830: 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e  le table T, then
6840: 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57   set.**.**     W
6850: 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74  hereTerm.eOperat
6860: 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  or              
6870: 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20  =  WO_OR.**     
6880: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
6890: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20  nfo->indexable  
68a0: 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e  |=  the cursor n
68b0: 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20  umber for table 
68c0: 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72  T.**.** A subter
68d0: 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22  m is "indexable"
68e0: 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65   if it is of the
68f0: 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f   form.** "T.C <o
6900: 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65  p> <expr>" where
6910: 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e   C is any column
6920: 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20   of table T and 
6930: 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  .** <op> is one 
6940: 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d  of "=", "<", "<=
6950: 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49  ", ">", ">=", "I
6960: 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22  S NULL", or "IN"
6970: 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69  ..** A subterm i
6980: 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65  s also indexable
6990: 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44   if it is an AND
69a0: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
69b0: 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61  ** subsubterms a
69c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77  t least one of w
69d0: 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c  hich is indexabl
69e0: 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e  e.  Indexable AN
69f0: 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68  D .** subterms h
6a00: 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61  ave their eOpera
6a10: 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e  tor set to WO_AN
6a20: 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a  D and they have.
6a30: 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65  ** u.pAndInfo se
6a40: 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c  t to a dynamical
6a50: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  ly allocated Whe
6a60: 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74  reAndTerm object
6a70: 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f  ..**.** From ano
6a80: 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69  ther point of vi
6a90: 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20  ew, "indexable" 
6aa0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73  means that the s
6ab0: 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20  ubterm could.** 
6ac0: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75  potentially be u
6ad0: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
6ae0: 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69  x if an appropri
6af0: 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73  ate index exists
6b00: 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73  ..** This analys
6b10: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73  is does not cons
6b20: 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20  ider whether or 
6b30: 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78  not the index ex
6b40: 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73  ists; that.** is
6b50: 20 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65   decided elsewhe
6b60: 72 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73  re.  This analys
6b70: 69 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74  is only looks at
6b80: 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d   whether subterm
6b90: 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65  s.** appropriate
6ba0: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78   for indexing ex
6bb0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65  ist..**.** All e
6bc0: 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67  xamples A throug
6bd0: 68 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66  h E above satisf
6be0: 79 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69  y case 2.  But i
6bf0: 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f  f a term.** also
6c00: 20 73 74 61 74 69 73 66 69 65 73 20 63 61 73 65   statisfies case
6c10: 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77   1 (such as B) w
6c20: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
6c30: 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a  optimizer will.*
6c40: 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20  * always prefer 
6c50: 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68  case 1, so in th
6c60: 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65  at case we prete
6c70: 6e 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69  nd that case 2 i
6c80: 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69  s not.** satisfi
6c90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67  ed..**.** It mig
6ca0: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
6cb0: 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62  hat multiple tab
6cc0: 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c  les are indexabl
6cd0: 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  e.  For example,
6ce0: 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73  .** (E) above is
6cf0: 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61   indexable on ta
6d00: 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52  bles P, Q, and R
6d10: 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68  ..**.** Terms th
6d20: 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  at satisfy case 
6d30: 32 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73  2 are candidates
6d40: 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75   for lookup by u
6d50: 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65  sing.** separate
6d60: 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64   indices to find
6d70: 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68   rowids for each
6d80: 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d   subterm and com
6d90: 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e  posing.** the un
6da0: 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64  ion of all rowid
6db0: 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74  s using a RowSet
6dc0: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69   object.  This i
6dd0: 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20  s similar.** to 
6de0: 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22  "bitmap indices"
6df0: 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61   in other databa
6e00: 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a  se engines..**.*
6e10: 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a  * OTHERWISE:.**.
6e20: 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61  ** If neither ca
6e30: 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20  se 1 nor case 2 
6e40: 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76  apply, then leav
6e50: 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20  e the eOperator 
6e60: 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20  set to.** zero. 
6e70: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f   This term is no
6e80: 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61  t useful for sea
6e90: 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rch..*/.static v
6ea0: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f  oid exprAnalyzeO
6eb0: 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74  rTerm(.  SrcList
6ec0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
6ed0: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
6ee0: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
6ef0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
6f00: 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70       /* the comp
6f10: 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73  lete WHERE claus
6f20: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
6f30: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
6f40: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
6f50: 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61   OR-term to be a
6f60: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
6f70: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
6f80: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
6f90: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
6fa0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
6fb0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6fc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
6fd0: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
6fe0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
6ff0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  r context */.  s
7000: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7010: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
7020: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7030: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
7040: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
7050: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
7060: 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68  xTerm];    /* Th
7070: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
7080: 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  lyzed */.  Expr 
7090: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
70a0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
70b0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
70c0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d  sion of the term
70d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7100: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
7110: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
7120: 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a  *pOrWc;       /*
7130: 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72   Breakup of pTer
7140: 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  m into subterms 
7150: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
7160: 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f  pOrTerm;       /
7170: 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74  * A Sub-term wit
7180: 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f  hin the pOrWc */
7190: 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  .  WhereOrInfo *
71a0: 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  pOrInfo;     /* 
71b0: 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  Additional infor
71c0: 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  mation associate
71d0: 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a  d with pTerm */.
71e0: 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f    Bitmask chngTo
71f0: 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  IN;         /* T
7200: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
7210: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20   satisfy case 1 
7220: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64  */.  Bitmask ind
7230: 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f  exable;        /
7240: 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72  * Tables that ar
7250: 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74  e indexable, sat
7260: 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a  isfying case 2 *
7270: 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65  /..  /*.  ** Bre
7280: 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ak the OR clause
7290: 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61   into its separa
72a0: 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68  te subterms.  Th
72b0: 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20  e subterms are. 
72c0: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20   ** stored in a 
72d0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
72e0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
72f0: 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72   within the Wher
7300: 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a  eOrInfo.  ** obj
7310: 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61  ect that is atta
7320: 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67  ched to the orig
7330: 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74  inal OR clause t
7340: 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  erm..  */.  asse
7350: 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
7360: 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41  ags & (TERM_DYNA
7370: 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c  MIC|TERM_ORINFO|
7380: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d  TERM_ANDINFO))==
7390: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
73a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
73b0: 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f  );.  pTerm->u.pO
73c0: 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20  rInfo = pOrInfo 
73d0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
73e0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
73f0: 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69  (*pOrInfo));.  i
7400: 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20  f( pOrInfo==0 ) 
7410: 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d  return;.  pTerm-
7420: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
7430: 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63  _ORINFO;.  pOrWc
7440: 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b   = &pOrInfo->wc;
7450: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
7460: 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f  it(pOrWc, pWInfo
7470: 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
7480: 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b  pOrWc, pExpr, TK
7490: 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c  _OR);.  exprAnal
74a0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72  yzeAll(pSrc, pOr
74b0: 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  Wc);.  if( db->m
74c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
74d0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
74e0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20  pOrWc->nTerm>=2 
74f0: 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f  );..  /*.  ** Co
7500: 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66  mpute the set of
7510: 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   tables that mig
7520: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73  ht satisfy cases
7530: 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20   1 or 2..  */.  
7540: 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69  indexable = ~(Bi
7550: 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54  tmask)0;.  chngT
7560: 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  oIN = ~(Bitmask)
7570: 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63  0;.  for(i=pOrWc
7580: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
7590: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
75a0: 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20  0 && indexable; 
75b0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
75c0: 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72  .    if( (pOrTer
75d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
75e0: 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a  O_SINGLE)==0 ){.
75f0: 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e        WhereAndIn
7600: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  fo *pAndInfo;.  
7610: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72      assert( (pOr
7620: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7630: 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45  (TERM_ANDINFO|TE
7640: 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29  RM_ORINFO))==0 )
7650: 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e  ;.      chngToIN
7660: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64   = 0;.      pAnd
7670: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
7680: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
7690: 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29  zeof(*pAndInfo))
76a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  ;.      if( pAnd
76b0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
76c0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e  WhereClause *pAn
76d0: 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65  dWC;.        Whe
76e0: 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d  reTerm *pAndTerm
76f0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
7700: 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
7710: 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   b = 0;.        
7720: 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
7730: 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a  nfo = pAndInfo;.
7740: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
7750: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
7760: 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20  _ANDINFO;.      
7770: 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72    pOrTerm->eOper
7780: 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20  ator = WO_AND;. 
7790: 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20         pAndWC = 
77a0: 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  &pAndInfo->wc;. 
77b0: 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75         whereClau
77c0: 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70  seInit(pAndWC, p
77d0: 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20  WC->pWInfo);.   
77e0: 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28       whereSplit(
77f0: 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d  pAndWC, pOrTerm-
7800: 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b  >pExpr, TK_AND);
7810: 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61  .        exprAna
7820: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41  lyzeAll(pSrc, pA
7830: 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70  ndWC);.        p
7840: 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20  AndWC->pOuter = 
7850: 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73  pWC;.        tes
7860: 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f  tcase( db->mallo
7870: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
7880: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
7890: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
78a0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
78b0: 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e  AndTerm=pAndWC->
78c0: 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65  a; j<pAndWC->nTe
78d0: 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72  rm; j++, pAndTer
78e0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
78f0: 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65    assert( pAndTe
7900: 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
7910: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c           if( all
7920: 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d  owedOp(pAndTerm-
7930: 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20  >pExpr->op) ){. 
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c               b |
7950: 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
7960: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e  o->sMaskSet, pAn
7970: 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  dTerm->leftCurso
7980: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
7990: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
79a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
79b0: 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a  indexable &= b;.
79c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
79d0: 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77  e if( pOrTerm->w
79e0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
79f0: 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  PIED ){.      /*
7a00: 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20   Skip this term 
7a10: 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76  for now.  We rev
7a20: 69 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20  isit it when we 
7a30: 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20  process the.    
7a40: 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69    ** correspondi
7a50: 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  ng TERM_VIRTUAL 
7a60: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  term */.    }els
7a70: 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
7a80: 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65   b;.      b = ge
7a90: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
7aa0: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
7ab0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
7ac0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
7ad0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
7ae0: 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20  _VIRTUAL ){.    
7af0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
7b00: 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e  Other = &pOrWc->
7b10: 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65  a[pOrTerm->iPare
7b20: 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c  nt];.        b |
7b30: 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
7b40: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74  o->sMaskSet, pOt
7b50: 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  her->leftCursor)
7b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7b70: 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a  indexable &= b;.
7b80: 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
7b90: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7ba0: 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20  WO_EQ)==0 ){.   
7bb0: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
7bc0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
7bd0: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
7be0: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
7bf0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
7c00: 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73   ** Record the s
7c10: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
7c20: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
7c30: 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74  .  The set might
7c40: 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a   be.  ** empty..
7c50: 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e    */.  pOrInfo->
7c60: 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65  indexable = inde
7c70: 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e  xable;.  pTerm->
7c80: 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65  eOperator = inde
7c90: 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57  xable==0 ? 0 : W
7ca0: 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  O_OR;..  /*.  **
7cb0: 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20   chngToIN holds 
7cc0: 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  a set of tables 
7cd0: 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74  that *might* sat
7ce0: 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75  isfy case 1.  Bu
7cf0: 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74  t.  ** we have t
7d00: 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69  o do some additi
7d10: 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f  onal checking to
7d20: 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72   see if case 1 r
7d30: 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61  eally.  ** is sa
7d40: 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20  tisfied..  **.  
7d50: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c  ** chngToIN will
7d60: 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20   hold either 0, 
7d70: 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54  1, or 2 bits.  T
7d80: 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65  he 0-bit case me
7d90: 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ans.  ** that th
7da0: 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62  ere is no possib
7db0: 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f  ility of transfo
7dc0: 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61  rming the OR cla
7dd0: 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a  use into an.  **
7de0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63   IN operator bec
7df0: 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ause one or more
7e00: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
7e10: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a   clause contain.
7e20: 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f    ** something o
7e30: 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20  ther than == on 
7e40: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
7e50: 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54  single table.  T
7e60: 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61  he 1-bit.  ** ca
7e70: 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76  se means that ev
7e80: 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
7e90: 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20  OR clause is of 
7ea0: 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74  the form.  ** "t
7eb0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72  able.column=expr
7ec0: 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c  " for some singl
7ed0: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e  e table.  The on
7ee0: 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65  e bit that is se
7ef0: 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72  t.  ** will corr
7f00: 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f  espond to the co
7f10: 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20  mmon table.  We 
7f20: 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68  still need to ch
7f30: 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eck to make.  **
7f40: 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63   sure the same c
7f50: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e  olumn is used on
7f60: 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65   all terms.  The
7f70: 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77   2-bit case is w
7f80: 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c  hen.  ** the all
7f90: 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68   terms are of th
7fa0: 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63  e form "table1.c
7fb0: 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c  olumn=table2.col
7fc0: 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d  umn".  It.  ** m
7fd0: 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65  ight be possible
7fe0: 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f   to form an IN o
7ff0: 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74  perator with eit
8000: 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  her table1.colum
8010: 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32  n.  ** or table2
8020: 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c  .column as the L
8030: 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20  HS if either is 
8040: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
8050: 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65  term of.  ** the
8060: 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   OR clause..  **
8070: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
8080: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
8090: 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31  m "table.column1
80a0: 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20  =table.column2" 
80b0: 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74  (the.  ** same t
80c0: 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a  able on both siz
80d0: 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61  es of the ==) ca
80e0: 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
80f0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  d..  */.  if( ch
8100: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e  ngToIN ){.    in
8110: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d  t okToChngToIN =
8120: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
8130: 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  if the conversio
8140: 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64  n to IN is valid
8150: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
8160: 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  umn = -1;       
8170: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65    /* Column inde
8180: 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f  x on lhs of IN o
8190: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69  perator */.    i
81a0: 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  nt iCursor = -1;
81b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
81c0: 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20  e cursor common 
81d0: 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a  to all terms */.
81e0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20      int j = 0;  
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8200: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8210: 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  ..    /* Search 
8220: 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20  for a table and 
8230: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65  column that appe
8240: 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20  ars on one side 
8250: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74  or the.    ** ot
8260: 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70  her of the == op
8270: 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20  erator in every 
8280: 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74  subterm.  That t
8290: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a  able and column.
82a0: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
82b0: 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73  ecorded in iCurs
82c0: 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20  or and iColumn. 
82d0: 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74   There might not
82e0: 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73   be any.    ** s
82f0: 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  uch table and co
8300: 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43  lumn.  Set okToC
8310: 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70  hngToIN if an ap
8320: 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a  propriate table.
8330: 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d      ** and colum
8340: 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c  n is found but l
8350: 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  eave okToChngToI
8360: 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66  N false if not f
8370: 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ound..    */.   
8380: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26   for(j=0; j<2 &&
8390: 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20   !okToChngToIN; 
83a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54  j++){.      pOrT
83b0: 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a  erm = pOrWc->a;.
83c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
83d0: 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  c->nTerm-1; i>=0
83e0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
83f0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8400: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
8410: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
8420: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
8430: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
8440: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
8450: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
8460: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
8470: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
8480: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32  /* This is the 2
8490: 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65  -bit case and we
84a0: 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f   are on the seco
84b0: 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64  nd iteration and
84c0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75  .          ** cu
84d0: 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72  rrent term is fr
84e0: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65  om the first ite
84f0: 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70  ration.  So skip
8500: 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20   this term. */. 
8510: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8520: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
8530: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8550: 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67  f( (chngToIN & g
8560: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
8570: 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  sMaskSet, pOrTer
8580: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d  m->leftCursor))=
8590: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
85a0: 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73  /* This term mus
85b0: 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  t be of the form
85c0: 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72   t1.a==t2.b wher
85d0: 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20  e t2 is in the. 
85e0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67           ** chng
85f0: 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20  ToIN set but t1 
8600: 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65  is not.  This te
8610: 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65  rm will be eithe
8620: 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20  r preceeded.    
8630: 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c        ** or foll
8640: 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74  wed by an invert
8650: 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74  ed copy (t2.b==t
8660: 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73  1.a).  Skip this
8670: 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20   term .         
8680: 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20   ** and use its 
8690: 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20  inversion. */.  
86a0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
86b0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
86c0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
86d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
86e0: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
86f0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8700: 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
8710: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
8720: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
8730: 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52  (TERM_COPIED|TER
8740: 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20  M_VIRTUAL) );.  
8750: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
8760: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8770: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f      iColumn = pO
8780: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
8790: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75  umn;.        iCu
87a0: 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  rsor = pOrTerm->
87b0: 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  leftCursor;.    
87c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
87d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30   }.      if( i<0
87e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
87f0: 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  o candidate tabl
8800: 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75  e+column was fou
8810: 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  nd.  This can on
8820: 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20  ly occur.       
8830: 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e   ** on the secon
8840: 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  d iteration */. 
8850: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
8860: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
8870: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
8880: 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b  Two(chngToIN) );
8890: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
88a0: 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61   chngToIN==getMa
88b0: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
88c0: 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29  kSet, iCursor) )
88d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
88e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
88f0: 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b  estcase( j==1 );
8900: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61  ..      /* We ha
8910: 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69  ve found a candi
8920: 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63  date table and c
8930: 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f  olumn.  Check to
8940: 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20   see if that.   
8950: 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20     ** table and 
8960: 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e  column is common
8970: 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
8980: 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  n the OR clause 
8990: 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e  */.      okToChn
89a0: 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20  gToIN = 1;.     
89b0: 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f   for(; i>=0 && o
89c0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d  kToChngToIN; i--
89d0: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
89e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
89f0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
8a00: 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
8a10: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
8a20: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
8a30: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
8a40: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
8a50: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
8a60: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
8a70: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e   if( pOrTerm->u.
8a80: 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  leftColumn!=iCol
8a90: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
8aa0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8ab0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
8ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
8ad0: 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68  affLeft, affRigh
8ae0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;.          /* 
8af0: 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  If the right-han
8b00: 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61  d side is also a
8b10: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68   column, then th
8b20: 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20  e affinities.   
8b30: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74         ** of bot
8b40: 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74  h right and left
8b50: 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73   sides must be s
8b60: 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65  uch that no type
8b70: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
8b80: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65  nversions are re
8b90: 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69  quired on the ri
8ba0: 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32  ght.  (Ticket #2
8bb0: 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a  249).          *
8bc0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52  /.          affR
8bd0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
8be0: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
8bf0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
8c00: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  t);.          af
8c10: 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  fLeft = sqlite3E
8c20: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
8c30: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
8c40: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
8c50: 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26  ( affRight!=0 &&
8c60: 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65   affRight!=affLe
8c70: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
8c80: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
8c90: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
8ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
8cb0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8cc0: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b  s |= TERM_OR_OK;
8cd0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8cf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
8d00: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f  this point, okTo
8d10: 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65  ChngToIN is true
8d20: 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65   if original pTe
8d30: 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20  rm satisfies.   
8d40: 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20   ** case 1.  In 
8d50: 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74  that case, const
8d60: 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75  ruct a new virtu
8d70: 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  al term that is 
8d80: 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f  .    ** pTerm co
8d90: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
8da0: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
8db0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f   */.    if( okTo
8dc0: 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  ChngToIN ){.    
8dd0: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20    Expr *pDup;   
8de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72           /* A tr
8df0: 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74  ansient duplicat
8e00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
8e10: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
8e20: 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20  pList = 0;   /* 
8e30: 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  The RHS of the I
8e40: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
8e50: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
8e60: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  = 0;       /* Th
8e70: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
8e80: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
8e90: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20    Expr *pNew;   
8ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8eb0: 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72  complete IN oper
8ec0: 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66  ator */..      f
8ed0: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
8ee0: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72  m-1, pOrTerm=pOr
8ef0: 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Wc->a; i>=0; i--
8f00: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
8f10: 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
8f20: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
8f30: 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63  RM_OR_OK)==0 ) c
8f40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8f50: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
8f60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8f70: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61  _EQ );.        a
8f80: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
8f90: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
8fa0: 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61  sor );.        a
8fb0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
8fc0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43  u.leftColumn==iC
8fd0: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
8fe0: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
8ff0: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65  xprDup(db, pOrTe
9000: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
9010: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
9020: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
9030: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49  prListAppend(pWI
9040: 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69  nfo->pParse, pLi
9050: 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  st, pDup);.     
9060: 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65     pLeft = pOrTe
9070: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
9080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9090: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
90a0: 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d   );.      pDup =
90b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
90c0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
90d0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
90e0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
90f0: 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c   TK_IN, pDup, 0,
9100: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
9110: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  New ){.        i
9120: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
9130: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
9140: 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45  arkings(pNew, pE
9150: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  xpr);.        as
9160: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
9170: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
9180: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
9190: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
91a0: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  ist = pList;.   
91b0: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
91c0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
91d0: 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f  pWC, pNew, TERM_
91e0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
91f0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74  AMIC);.        t
9200: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
9210: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78  =0 );.        ex
9220: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
9230: 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20  pWC, idxNew);.  
9240: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
9250: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
9260: 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69          pWC->a[i
9270: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
9280: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
9290: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
92a0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
92b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
92c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
92d0: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
92e0: 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d    }.      pTerm-
92f0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
9300: 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31  NOOP;  /* case 1
9310: 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a   trumps case 2 *
9320: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  /.    }.  }.}.#e
9330: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
9340: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
9350: 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f  TION && !SQLITE_
9360: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
9370: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75  ../*.** The inpu
9380: 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
9390: 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72  e is an WhereTer
93a0: 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  m structure with
93b0: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45   only the.** "pE
93c0: 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65  xpr" field fille
93d0: 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f  d in.  The job o
93e0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
93f0: 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  s to analyze the
9400: 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f  .** subexpressio
9410: 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  n and populate a
9420: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65  ll the other fie
9430: 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65  lds of the Where
9440: 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72  Term.** structur
9450: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
9460: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
9470: 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72   the form "<expr
9480: 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74  > <op> X" it get
9490: 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f  s commuted.** to
94a0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f   the standard fo
94b0: 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65  rm of "X <op> <e
94c0: 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xpr>"..**.** If 
94d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
94e0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
94f0: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62   <op> Y" where b
9500: 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a  oth X and Y are.
9510: 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  ** columns, then
9520: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
9530: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68  pression is unch
9540: 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20  anged and a new 
9550: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
9560: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c  of the form "Y <
9570: 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20  op> X" is added 
9580: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
9590: 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  use and.** analy
95a0: 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  zed separately. 
95b0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
95c0: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
95d0: 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a  h TERM_COPIED.**
95e0: 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72   and the new ter
95f0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
9600: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62   TERM_DYNAMIC (b
9610: 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70  ecause it's pExp
9620: 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65  r.** needs to be
9630: 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20   freed with the 
9640: 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64  WhereClause) and
9650: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62   TERM_VIRTUAL (b
9660: 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20  ecause it.** is 
9670: 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20  a commuted copy 
9680: 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e  of a prior term.
9690: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
96a0: 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d  term has nChild=
96b0: 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70  1.** and the cop
96c0: 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20  y has idxParent 
96d0: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
96e0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
96f0: 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63   term..*/.static
9700: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
9710: 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e(.  SrcList *pS
9720: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
9730: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
9740: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
9750: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
9760: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
9770: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
9780: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
9790: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
97a0: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  the term to be a
97b0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
97c0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
97d0: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
97e0: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
97f0: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
9800: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
9810: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
9820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9830: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
9840: 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d  yzed */.  WhereM
9850: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
9860: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
9870: 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78  t of table index
9880: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72   masks */.  Expr
9890: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20   *pExpr;        
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98b0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
98c0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
98d0: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
98e0: 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  qLeft;          
98f0: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
9900: 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70  ites of the pExp
9910: 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69  r->pLeft */.  Bi
9920: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9940: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
9950: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69  of pExpr */.  Bi
9960: 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74  tmask extraRight
9970: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
9980: 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e  * Extra dependen
9990: 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49  cies on LEFT JOI
99a0: 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74  N */.  Expr *pSt
99b0: 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  r1 = 0;         
99c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
99d0: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
99e0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ator */.  int is
99f0: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20  Complete = 0;   
9a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
9a10: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65  S of LIKE/GLOB e
9a20: 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72  nds with wildcar
9a30: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73  d */.  int noCas
9a40: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
9a50: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f          /* LIKE/
9a60: 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68  GLOB distinguish
9a70: 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  es case */.  int
9a80: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9aa0: 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61   Top-level opera
9ab0: 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20  tor.  pExpr->op 
9ac0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
9ad0: 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
9ae0: 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67  rse;  /* Parsing
9af0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
9b00: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9b10: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f  se->db;        /
9b20: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
9b30: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
9b40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9b50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
9b60: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
9b70: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
9b80: 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
9b90: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
9ba0: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
9bb0: 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >pExpr;.  assert
9bc0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
9bd0: 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  AS && pExpr->op!
9be0: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20  =TK_COLLATE );. 
9bf0: 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78   prereqLeft = ex
9c00: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
9c10: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c  skSet, pExpr->pL
9c20: 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78  eft);.  op = pEx
9c30: 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  pr->op;.  if( op
9c40: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  ==TK_IN ){.    a
9c50: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
9c60: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
9c70: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
9c80: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
9c90: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
9ca0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
9cb0: 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74  ght = exprSelect
9cc0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9cd0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Set, pExpr->x.pS
9ce0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
9cf0: 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e{.      pTerm->
9d00: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
9d10: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
9d20: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
9d30: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
9d40: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  }.  }else if( op
9d50: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
9d60: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
9d70: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Right = 0;.  }el
9d80: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70  se{.    pTerm->p
9d90: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9da0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
9db0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  kSet, pExpr->pRi
9dc0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72  ght);.  }.  prer
9dd0: 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c  eqAll = exprTabl
9de0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
9df0: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45   pExpr);.  if( E
9e00: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9e10: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
9e20: 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  n) ){.    Bitmas
9e30: 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k x = getMask(pM
9e40: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  askSet, pExpr->i
9e50: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b  RightJoinTable);
9e60: 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c  .    prereqAll |
9e70: 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69  = x;.    extraRi
9e80: 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f  ght = x-1;  /* O
9e90: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  N clause terms m
9ea0: 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77  ay not be used w
9eb0: 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20  ith an index.   
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74      ** on left t
9ee0: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
9ef0: 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30  OIN.  Ticket #30
9f00: 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72  15 */.  }.  pTer
9f10: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
9f20: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72  rereqAll;.  pTer
9f30: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
9f40: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  -1;.  pTerm->iPa
9f50: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rent = -1;.  pTe
9f60: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
9f70: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64  0;.  if( allowed
9f80: 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78  Op(op) ){.    Ex
9f90: 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr *pLeft = sqli
9fa0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
9fb0: 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  te(pExpr->pLeft)
9fc0: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
9fd0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
9fe0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
9ff0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
a000: 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54  u16 opMask = (pT
a010: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a020: 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d   & prereqLeft)==
a030: 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f  0 ? WO_ALL : WO_
a040: 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70  EQUIV;.    if( p
a050: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
a060: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65  UMN ){.      pTe
a070: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
a080: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
a090: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c        pTerm->u.l
a0a0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
a0b0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
a0c0: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
a0d0: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
a0e0: 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a  k(op) & opMask;.
a0f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52      }.    if( pR
a100: 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e  ight && pRight->
a110: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
a120: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
a130: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78   *pNew;.      Ex
a140: 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  pr *pDup;.      
a150: 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30  u16 eExtraOp = 0
a160: 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  ;        /* Extr
a170: 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d  a bits for pNew-
a180: 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  >eOperator */.  
a190: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
a1a0: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
a1b0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
a1c0: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
a1d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a1e0: 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
a1f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
a200: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a210: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a220: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a230: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
a240: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
a250: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e    }.        idxN
a260: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
a270: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
a280: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
a290: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
a2a0: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
a2b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a2c0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
a2d0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
a2e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72        pNew->iPar
a2f0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
a300: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
a310: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
a320: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
a330: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
a340: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
a350: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
a360: 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  D;.        if( p
a370: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a  Expr->op==TK_EQ.
a380: 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
a390: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
a3a0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
a3b0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
a3c0: 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
a3d0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e  (db, SQLITE_Tran
a3e0: 73 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20  sitive).        
a3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  ){.          pTe
a400: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d  rm->eOperator |=
a410: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20   WO_EQUIV;.     
a420: 20 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20       eExtraOp = 
a430: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
a440: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
a450: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
a460: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70  pExpr;.        p
a470: 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  New = pTerm;.   
a480: 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43     }.      exprC
a490: 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70  ommute(pParse, p
a4a0: 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66  Dup);.      pLef
a4b0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
a4c0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d  kipCollate(pDup-
a4d0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70  >pLeft);.      p
a4e0: 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  New->leftCursor 
a4f0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
a500: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c  .      pNew->u.l
a510: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
a520: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
a530: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65    testcase( (pre
a540: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
a550: 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c  ight) != prereqL
a560: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  eft );.      pNe
a570: 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  w->prereqRight =
a580: 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78   prereqLeft | ex
a590: 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20  traRight;.      
a5a0: 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20  pNew->prereqAll 
a5b0: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  = prereqAll;.   
a5c0: 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74     pNew->eOperat
a5d0: 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61  or = (operatorMa
a5e0: 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65  sk(pDup->op) + e
a5f0: 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73  ExtraOp) & opMas
a600: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  k;.    }.  }..#i
a610: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a620: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
a630: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61  ZATION.  /* If a
a640: 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54   term is the BET
a650: 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63  WEEN operator, c
a660: 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69  reate two new vi
a670: 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a  rtual terms.  **
a680: 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65   that define the
a690: 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20   range that the 
a6a0: 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e  BETWEEN implemen
a6b0: 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ts.  For example
a6c0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
a6d0: 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44   a BETWEEN b AND
a6e0: 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20   c.  **.  ** is 
a6f0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a  converted into:.
a700: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28    **.  **      (
a710: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
a720: 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e  c) AND (a>=b) AN
a730: 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20  D (a<=c).  **.  
a740: 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74  ** The two new t
a750: 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f  erms are added o
a760: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
a770: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
a780: 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20  bject..  ** The 
a790: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64  new terms are "d
a7a0: 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20  ynamic" and are 
a7b0: 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20  children of the 
a7c0: 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e  original BETWEEN
a7d0: 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61  .  ** term.  Tha
a7e0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  t means that if 
a7f0: 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d  the BETWEEN term
a800: 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63   is coded, the c
a810: 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a  hildren are.  **
a820: 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69   skipped.  Or, i
a830: 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  f the children a
a840: 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20  re satisfied by 
a850: 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72  an index, the or
a860: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57  iginal.  ** BETW
a870: 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70  EEN term is skip
a880: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
a890: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
a8a0: 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57  TK_BETWEEN && pW
a8b0: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  C->op==TK_AND ){
a8c0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
a8d0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
a8e0: 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  pList;.    int i
a8f0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
a900: 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54  st u8 ops[] = {T
a910: 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20  K_GE, TK_LE};.  
a920: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
a930: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
a940: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
a950: 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  2 );.    for(i=0
a960: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
a970: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
a980: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  r;.      int idx
a990: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  New;.      pNewE
a9a0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
a9b0: 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69  pr(pParse, ops[i
a9c0: 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a9f0: 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
aa00: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
aa30: 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
aa40: 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b  ].pExpr, 0), 0);
aa50: 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a  .      transferJ
aa60: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
aa70: 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20  Expr, pExpr);.  
aa80: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
aa90: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
aaa0: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
aab0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
aac0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
aad0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
aae0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
aaf0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
ab00: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
ab10: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
ab20: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
ab30: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
ab40: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
ab50: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  erm;.    }.    p
ab60: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
ab70: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
ab80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
ab90: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
aba0: 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
abb0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  d(SQLITE_OMIT_OR
abc0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26  _OPTIMIZATION) &
abd0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
abe0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
abf0: 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20  .  /* Analyze a 
ac00: 74 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d  term that is com
ac10: 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20  posed of two or 
ac20: 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f  more subterms co
ac30: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20  nnected by.  ** 
ac40: 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a  an OR operator..
ac50: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
ac60: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
ac70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ac80: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
ac90: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
aca0: 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70  zeOrTerm(pSrc, p
acb0: 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  WC, idxTerm);.  
acc0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
acd0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a  a[idxTerm];.  }.
ace0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
acf0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
ad00: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
ad10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  f SQLITE_OMIT_LI
ad20: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  KE_OPTIMIZATION.
ad30: 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61    /* Add constra
ad40: 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74  ints to reduce t
ad50: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
ad60: 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  on a LIKE or GLO
ad70: 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e  B.  ** operator.
ad80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b  .  **.  ** A lik
ad90: 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65  e pattern of the
ada0: 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61   form "x LIKE 'a
adb0: 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64  bc%'" is changed
adc0: 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74   into constraint
add0: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  s.  **.  **     
ade0: 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e       x>='abc' AN
adf0: 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20  D x<'abd' AND x 
ae00: 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a  LIKE 'abc%'.  **
ae10: 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63  .  ** The last c
ae20: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
ae30: 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20  prefix "abc" is 
ae40: 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66  incremented to f
ae50: 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72  orm the.  ** ter
ae60: 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69  mination conditi
ae70: 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20  on "abd"..  */. 
ae80: 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b   if( pWC->op==TK
ae90: 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69  _AND .   && isLi
aea0: 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c  keOrGlob(pParse,
aeb0: 20 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20   pExpr, &pStr1, 
aec0: 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f  &isComplete, &no
aed0: 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45  Case).  ){.    E
aee0: 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  xpr *pLeft;     
aef0: 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45    /* LHS of LIKE
af00: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
af10: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72  /.    Expr *pStr
af20: 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  2;       /* Copy
af30: 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20   of pStr1 - RHS 
af40: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
af50: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
af60: 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20  r *pNewExpr1;.  
af70: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
af80: 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  2;.    int idxNe
af90: 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  w1;.    int idxN
afa0: 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73  ew2;.    Token s
afb0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a  CollSeqName;  /*
afc0: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   Name of collati
afd0: 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
afe0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
aff0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
b000: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72  .pExpr;.    pStr
b010: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
b020: 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29  up(db, pStr1, 0)
b030: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ;.    if( !db->m
b040: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b050: 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20       u8 c, *pC; 
b060: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68        /* Last ch
b070: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
b080: 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72  he first wildcar
b090: 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20  d */.      pC = 
b0a0: 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a  (u8*)&pStr2->u.z
b0b0: 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72  Token[sqlite3Str
b0c0: 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a  len30(pStr2->u.z
b0d0: 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20  Token)-1];.     
b0e0: 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20   c = *pC;.      
b0f0: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
b100: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
b110: 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65  nt is to increme
b120: 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  nt the last char
b130: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
b140: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
b150: 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74  * wildcard.  But
b160: 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74   if we increment
b170: 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20   '@', that will 
b180: 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65  push it into the
b190: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68  .        ** alph
b1a0: 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65  abetic range whe
b1b0: 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69  re case conversi
b1c0: 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70  ons will mess up
b1d0: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
b1e0: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f   inequality.  To
b1f0: 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b   avoid this, mak
b200: 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72  e sure to also r
b210: 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20  un the full.    
b220: 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61      ** LIKE on a
b230: 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70  ll candidate exp
b240: 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61  ressions by clea
b250: 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c  ring the isCompl
b260: 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20  ete flag.       
b270: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
b280: 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d  c=='A'-1 ) isCom
b290: 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  plete = 0;.     
b2a0: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70     c = sqlite3Up
b2b0: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
b2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43       }.      *pC
b2d0: 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a   = c + 1;.    }.
b2e0: 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65      sCollSeqName
b2f0: 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e  .z = noCase ? "N
b300: 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59  OCASE" : "BINARY
b310: 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e  ";.    sCollSeqN
b320: 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70  ame.n = 6;.    p
b330: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
b340: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b350: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
b360: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
b370: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b380: 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  _GE, .          
b390: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
b3a0: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
b3b0: 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43  se,pNewExpr1,&sC
b3c0: 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20  ollSeqName),.   
b3d0: 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30          pStr1, 0
b3e0: 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a  );.    transferJ
b3f0: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
b400: 45 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20  Expr1, pExpr);. 
b410: 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65     idxNew1 = whe
b420: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
b430: 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54  WC, pNewExpr1, T
b440: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
b450: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
b460: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31  estcase( idxNew1
b470: 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
b480: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
b490: 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20  , idxNew1);.    
b4a0: 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
b4b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b4c0: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
b4d0: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
b4e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b4f0: 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_LT,.          
b500: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
b510: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
b520: 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43  se,pNewExpr2,&sC
b530: 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20  ollSeqName),.   
b540: 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30          pStr2, 0
b550: 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a  );.    transferJ
b560: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
b570: 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20  Expr2, pExpr);. 
b580: 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65     idxNew2 = whe
b590: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
b5a0: 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54  WC, pNewExpr2, T
b5b0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
b5c0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
b5d0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32  estcase( idxNew2
b5e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
b5f0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
b600: 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20  , idxNew2);.    
b610: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b620: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66  idxTerm];.    if
b630: 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  ( isComplete ){.
b640: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
b650: 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New1].iParent = 
b660: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
b670: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69  WC->a[idxNew2].i
b680: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
b690: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
b6a0: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d  Child = 2;.    }
b6b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
b6c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
b6d0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
b6e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b6f0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
b700: 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f  E.  /* Add a WO_
b710: 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20  MATCH auxiliary 
b720: 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73  term to the cons
b730: 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68  traint set if th
b740: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65  e.  ** current e
b750: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
b760: 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d  the form:  colum
b770: 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20  n MATCH expr..  
b780: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
b790: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
b7a0: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
b7b0: 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69  thods of.  ** vi
b7c0: 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54  rtual tables.  T
b7d0: 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20  he native query 
b7e0: 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e  optimizer does n
b7f0: 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20  ot attempt.  ** 
b800: 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77  to do anything w
b810: 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69  ith MATCH functi
b820: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
b830: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
b840: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
b850: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78  t idxNew;.    Ex
b860: 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
b870: 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ft;.    WhereTer
b880: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20  m *pNewTerm;.   
b890: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43   Bitmask prereqC
b8a0: 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70  olumn, prereqExp
b8b0: 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d  r;..    pRight =
b8c0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
b8d0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
b8e0: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
b8f0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
b900: 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45  xpr;.    prereqE
b910: 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55  xpr = exprTableU
b920: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
b930: 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72  Right);.    prer
b940: 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54  eqColumn = exprT
b950: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
b960: 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  et, pLeft);.    
b970: 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20  if( (prereqExpr 
b980: 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d  & prereqColumn)=
b990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
b9a0: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
b9b0: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
b9c0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b9d0: 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20  , TK_MATCH, .   
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
ba00: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
ba10: 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b   pRight, 0), 0);
ba20: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
ba30: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
ba40: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
ba50: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
ba60: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
ba70: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
ba80: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
ba90: 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d  pNewTerm = &pWC-
baa0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
bab0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
bac0: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
bad0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
bae0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
baf0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
bb00: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
bb10: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
bb20: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
bb30: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
bb40: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
bb50: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65  MATCH;.      pNe
bb60: 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
bb70: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
bb80: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
bb90: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
bba0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
bbb0: 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
bbc0: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
bbd0: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
bbe0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
bbf0: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
bc00: 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
bc10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bc20: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
bc30: 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
bc40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
bc50: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20  3_OR_STAT4.  /* 
bc60: 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  When sqlite_stat
bc70: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
bc80: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e   is available an
bc90: 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
bca0: 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53  .  ** form "x IS
bcb0: 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73   NOT NULL" can s
bcc0: 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c  ometimes be eval
bcd0: 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63  uated more effic
bce0: 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22  iently.  ** as "
bcf0: 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20  x>NULL" if x is 
bd00: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
bd10: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20  RIMARY KEY.  So 
bd20: 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a  construct a.  **
bd30: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66   virtual term of
bd40: 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a   that form..  **
bd50: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
bd60: 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  the virtual term
bd70: 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20   must be tagged 
bd80: 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e  with TERM_VNULL.
bd90: 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d    This.  ** TERM
bda0: 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20  _VNULL tag will 
bdb0: 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74  suppress the not
bdc0: 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74  -null check at t
bdd0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
bde0: 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  * of the loop.  
bdf0: 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d  Without the TERM
be00: 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65  _VNULL flag, the
be10: 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
be20: 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72  at.  ** the star
be30: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  t of the loop wi
be40: 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72  ll prevent any r
be50: 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e  esults from bein
be60: 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  g returned..  */
be70: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
be80: 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
be90: 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
bea0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
beb0: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
bec0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  t->iColumn>=0.  
bed0: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
bee0: 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
bef0: 54 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20  TE_Stat3).  ){. 
bf00: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
bf10: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  r;.    Expr *pLe
bf20: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
bf30: 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  t;.    int idxNe
bf40: 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  w;.    WhereTerm
bf50: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20   *pNewTerm;..   
bf60: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
bf70: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
bf80: 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20   TK_GT,.        
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
bfb0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
bfc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
bfe0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
bff0: 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  e, TK_NULL, 0, 0
c000: 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69  , 0), 0);..    i
c010: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
c020: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
c030: 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20  NewExpr,.       
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 54 45 52 4d 5f 56 49 52 54         TERM_VIRT
c060: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c070: 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20  |TERM_VNULL);.  
c080: 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a    if( idxNew ){.
c090: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d        pNewTerm =
c0a0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
c0b0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c0c0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
c0d0: 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  0;.      pNewTer
c0e0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
c0f0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
c100: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
c110: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
c120: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
c130: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
c140: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b  perator = WO_GT;
c150: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c160: 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
c170: 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  rm;.      pTerm 
c180: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
c190: 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  m];.      pTerm-
c1a0: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
c1b0: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
c1c0: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
c1d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c1e0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54  ->prereqAll = pT
c1f0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a  erm->prereqAll;.
c200: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
c210: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
c220: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
c230: 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e   */..  /* Preven
c240: 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d  t ON clause term
c250: 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  s of a LEFT JOIN
c260: 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64   from being used
c270: 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61   to drive.  ** a
c280: 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c  n index for tabl
c290: 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
c2a0: 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
c2b0: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
c2c0: 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69  Right |= extraRi
c2d0: 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ght;.}../*.** Th
c2e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  is function sear
c2f0: 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61  ches pList for a
c300: 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63   entry that matc
c310: 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  hes the iCol-th 
c320: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64  column.** of ind
c330: 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49  ex pIdx..**.** I
c340: 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73  f such an expres
c350: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69  sion is found, i
c360: 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  ts index in pLis
c370: 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e  t->a[] is return
c380: 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70  ed. If.** no exp
c390: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
c3a0: 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
c3b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c3c0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20  findIndexCol(.  
c3d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3f0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
c400: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
c410: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
c420: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
c430: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72  ion list to sear
c440: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  ch */.  int iBas
c450: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
c460: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
c470: 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f  r for table asso
c480: 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
c490: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
c4a0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
c4b0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
c4c0: 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f  o match column o
c4d0: 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  f */.  int iCol 
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
c500: 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74   of index to mat
c510: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ch */.){.  int i
c520: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
c530: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
c540: 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66  Coll[iCol];..  f
c550: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
c560: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
c570: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
c580: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
c590: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
c5a0: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
c5b0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
c5c0: 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75       && p->iColu
c5d0: 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn==pIdx->aiColu
c5e0: 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26  mn[iCol].     &&
c5f0: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73   p->iTable==iBas
c600: 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43  e.    ){.      C
c610: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
c620: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
c630: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  eq(pParse, pList
c640: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
c650: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
c660: 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c  pColl) && 0==sql
c670: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
c680: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
c690: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
c6a0: 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn i;.      }.  
c6b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
c6c0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n -1;.}../*.** R
c6d0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
c6e0: 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65  e DISTINCT expre
c6f0: 73 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65  ssion-list passe
c700: 64 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  d as the third a
c710: 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65  rgument.** is re
c720: 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41  dundant..**.** A
c730: 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69   DISTINCT list i
c740: 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74  s redundant if t
c750: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
c760: 61 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74  ains some subset
c770: 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74   of.** columns t
c780: 68 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61  hat are unique a
c790: 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a  nd non-null..*/.
c7a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
c7b0: 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a  tinctRedundant(.
c7c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c7e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c7f0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
c800: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  bList,        /*
c810: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
c820: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
c830: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
c840: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
c850: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
c860: 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20  t *pDistinct    
c870: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
c880: 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20   set that needs 
c890: 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a  to be DISTINCT *
c8a0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
c8b0: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
c8c0: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  x;.  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 0a 20 20 69 6e 74 20 69 42 61 73       .  int iBas
c8f0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  e;..  /* If ther
c900: 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e is more than o
c910: 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d  ne table or sub-
c920: 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52  select in the FR
c930: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a  OM clause of.  *
c940: 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  * this query, th
c950: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  en it will not b
c960: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68  e possible to sh
c970: 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54  ow that the DIST
c980: 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73  INCT .  ** claus
c990: 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  e is redundant. 
c9a0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
c9b0: 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  t->nSrc!=1 ) ret
c9c0: 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d  urn 0;.  iBase =
c9d0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
c9e0: 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20  iCursor;.  pTab 
c9f0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
ca00: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
ca10: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
ca20: 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b  ssions is an IPK
ca30: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65   column on table
ca40: 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74   iBase, then ret
ca50: 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20  urn .  ** true. 
ca60: 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54  Note: The (p->iT
ca70: 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72  able==iBase) par
ca80: 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d  t of this test m
ca90: 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74  ay be false if t
caa0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
cab0: 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72  SELECT is a corr
cac0: 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
cad0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
cae0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
caf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
cb00: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
cb10: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
cb20: 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d  (pDistinct->a[i]
cb30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
cb40: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
cb50: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
cb60: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
cb70: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
cb80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
cb90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
cba0: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
cbb0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
cbc0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
cbd0: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
cbe0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
cbf0: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
cc00: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
cc10: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
cc20: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
cc30: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
cc40: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
cc50: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
cc60: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
cc70: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
cc80: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
cc90: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
cca0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ccb0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
ccc0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
ccd0: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
cce0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
ccf0: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
cd00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
cd10: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
cd20: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
cd30: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
cd40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
cd50: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
cd60: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
cd70: 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20  *.  **   3. All 
cd80: 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63  of those index c
cd90: 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
cda0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
cdb0: 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
cdc0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22       contain a "
cdd0: 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20  col=X" term are 
cde0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54  subject to a NOT
cdf0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
ce00: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
ce10: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
ce20: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
ce30: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
ce40: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
ce50: 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e  OE_None ) contin
ce60: 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ue;.    for(i=0;
ce70: 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   i<pIdx->nKeyCol
ce80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31  ; i++){.      i1
ce90: 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61  6 iCol = pIdx->a
cea0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
ceb0: 20 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72    if( 0==findTer
cec0: 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43  m(pWC, iBase, iC
ced0: 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c  ol, ~(Bitmask)0,
cee0: 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b   WO_EQ, pIdx) ){
cef0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64  .        int iId
cf00: 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78  xCol = findIndex
cf10: 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73  Col(pParse, pDis
cf20: 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49  tinct, iBase, pI
cf30: 64 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  dx, i);.        
cf40: 69 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c  if( iIdxCol<0 ||
cf50: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
cf60: 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  ].notNull==0 ){.
cf70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
cf80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cf90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
cfa0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   i==pIdx->nKeyCo
cfb0: 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  l ){.      /* Th
cfc0: 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73  is index implies
cfd0: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
cfe0: 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  CT qualifier is 
cff0: 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
d000: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d010: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
d020: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  n 0;.}.../*.** E
d030: 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61  stimate the loga
d040: 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70  rithm of the inp
d050: 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65  ut value to base
d060: 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f   2..*/.static Lo
d070: 67 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45  gEst estLog(LogE
d080: 73 74 20 4e 29 7b 0a 20 20 4c 6f 67 45 73 74 20  st N){.  LogEst 
d090: 78 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  x = sqlite3LogEs
d0a0: 74 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 78  t(N);.  return x
d0b0: 3e 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20 30  >33 ? x - 33 : 0
d0c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
d0d0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
d0e0: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
d0f0: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
d100: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
d110: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
d120: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
d130: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
d140: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
d150: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
d160: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
d170: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
d180: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
d190: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
d1a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d1b0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d1c0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48  E) && defined(WH
d1d0: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
d1e0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  ).static void TR
d1f0: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73  ACE_IDX_INPUTS(s
d200: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d210: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
d220: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
d230: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
d240: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
d250: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
d260: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
d270: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d280: 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20  constraint[%d]: 
d290: 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64  col=%d termid=%d
d2a0: 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25   op=%d usabled=%
d2b0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
d2c0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
d2d0: 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
d2e0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
d2f0: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
d300: 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70  Offset,.       p
d310: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
d320: 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  .op,.       p->a
d330: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
d340: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  able);.  }.  for
d350: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65  (i=0; i<p->nOrde
d360: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rBy; i++){.    s
d370: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d380: 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d  f("  orderby[%d]
d390: 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64  : col=%d desc=%d
d3a0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
d3b0: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
d3c0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  y[i].iColumn,.  
d3d0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
d3e0: 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d  [i].desc);.  }.}
d3f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
d400: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73  CE_IDX_OUTPUTS(s
d410: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d420: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
d430: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
d440: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
d450: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
d460: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
d470: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
d480: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d490: 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
d4a0: 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
d4b0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
d4c0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d4d0: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
d4e0: 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
d4f0: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
d500: 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
d510: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d520: 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
d530: 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
d540: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
d550: 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
d560: 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
d570: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
d580: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
d590: 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
d5a0: 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
d5b0: 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
d5c0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
d5d0: 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
d5e0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
d5f0: 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ost);.  sqlite3D
d600: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
d610: 74 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64  timatedRows=%lld
d620: 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
d630: 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dRows);.}.#else.
d640: 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
d650: 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
d660: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
d670: 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
d680: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d690: 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
d6a0: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NDEX./*.** Retur
d6b0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48  n TRUE if the WH
d6c0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
d6d0: 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f  pTerm is of a fo
d6e0: 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63  rm where it.** c
d6f0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74  ould be used wit
d700: 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63  h an index to ac
d710: 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d  cess pSrc, assum
d720: 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ing an appropria
d730: 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73  te.** index exis
d740: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
d750: 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  nt termCanDriveI
d760: 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72  ndex(.  WhereTer
d770: 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20  m *pTerm,       
d780: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
d790: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63  clause term to c
d7a0: 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74  heck */.  struct
d7b0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
d7c0: 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  Src,     /* Tabl
d7d0: 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  e we are trying 
d7e0: 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42  to access */.  B
d7f0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d810: 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72   Tables in outer
d820: 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f   loops of the jo
d830: 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  in */.){.  char 
d840: 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  aff;.  if( pTerm
d850: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53  ->leftCursor!=pS
d860: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65  rc->iCursor ) re
d870: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
d880: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
d890: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65  & WO_EQ)==0 ) re
d8a0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
d8b0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
d8c0: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
d8d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d8e0: 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  f( pTerm->u.left
d8f0: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
d900: 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
d910: 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
d920: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
d930: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
d940: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
d950: 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
d960: 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
d970: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
d980: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
d990: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d9a0: 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
d9b0: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  NDEX./*.** Gener
d9c0: 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73  ate code to cons
d9d0: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
d9e0: 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75  object for an au
d9f0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a  tomatic index.**
da00: 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
da10: 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62  he WhereLevel ob
da20: 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74  ject pLevel so t
da30: 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hat the code gen
da40: 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20  erator.** makes 
da50: 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d  use of the autom
da60: 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  atic index..*/.s
da70: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74  tatic void const
da80: 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
da90: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
daa0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
dab0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
dac0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
dad0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
dae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
daf0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
db00: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
db10: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
db20: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
db30: 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68  e term to get th
db40: 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a  e next index */.
db50: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
db60: 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
db70: 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
db80: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
db90: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  ailable */.  Whe
dba0: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
dbb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
dbc0: 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65  e new index here
dbd0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65   */.){.  int nKe
dbe0: 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
dbf0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dc00: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
dc10: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64   constructed ind
dc20: 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
dc30: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
dc40: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
dc50: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
dc60: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
dc70: 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b  ereTerm *pWCEnd;
dc80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
dc90: 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
dca0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcc0: 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   Object describi
dcd0: 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
dce0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
dcf0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
dd00: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
dd10: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
dd20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
dd30: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
dd40: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
dd50: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
dd60: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
dd70: 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a  on bypass jump *
dd80: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  /.  Table *pTabl
dd90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
dda0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
ddb0: 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ng indexed */.  
ddc0: 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dde0: 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  op of the index 
ddf0: 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  fill loop */.  i
de00: 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
de10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
de20: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
de30: 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  n index record *
de40: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65  /* Column counte
de70: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  r */.  int i;   
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
dea0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69  er */.  int mxBi
deb0: 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tCol;           
dec0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
ded0: 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63  olumn in pSrc->c
dee0: 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c  olUsed */.  Coll
def0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
df00: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
df10: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
df20: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   on a column */.
df30: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
df40: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
df50: 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74   The Loop object
df60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74   */.  char *zNot
df70: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
df80: 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65    /* Extra space
df90: 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70   on the end of p
dfa0: 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  Idx */.  Bitmask
dfb0: 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20   idxCols;       
dfc0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
dfd0: 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66  f columns used f
dfe0: 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20  or indexing */. 
dff0: 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f   Bitmask extraCo
e000: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ls;          /* 
e010: 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69  Bitmap of additi
e020: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  onal columns */.
e030: 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67    u8 sentWarning
e040: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
e050: 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e   True if a warnn
e060: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73  ing has been iss
e070: 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  ued */..  /* Gen
e080: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
e090: 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
e0a0: 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
e0b0: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
e0c0: 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
e0d0: 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
e0e0: 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
e0f0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
e100: 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
e110: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
e120: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
e130: 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
e140: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
e150: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
e160: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
e170: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
e180: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
e190: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
e1a0: 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
e1b0: 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
e1c0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
e1d0: 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f  ints */.  nKeyCo
e1e0: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  l = 0;.  pTable 
e1f0: 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
e200: 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
e210: 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
e220: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
e230: 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c  pWLoop;.  idxCol
e240: 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
e250: 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
e260: 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
e270: 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
e280: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
e290: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
e2a0: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
e2b0: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
e2c0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
e2d0: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
e2e0: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
e2f0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
e300: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
e310: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
e320: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
e330: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
e340: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
e350: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
e360: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
e370: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e380: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
e390: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
e3a0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
e3b0: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
e3c0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
e3d0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
e3e0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
e3f0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
e400: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
e410: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
e420: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
e430: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
e440: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
e450: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
e460: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
e470: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
e480: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
e490: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
e4a0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
e4b0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
e4c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e4d0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
e4e0: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
e4f0: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
e500: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
e510: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
e520: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
e530: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
e540: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
e550: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e570: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
e580: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
e590: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
e5a0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
e5b0: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
e5c0: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
e5d0: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
e5e0: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
e5f0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
e600: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
e610: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
e620: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
e630: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
e640: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
e650: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
e660: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
e670: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
e680: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
e690: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
e6a0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
e6b0: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
e6c0: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
e6d0: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
e6e0: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
e6f0: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
e700: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
e710: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
e720: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
e730: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
e740: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
e750: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
e760: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
e770: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
e780: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
e790: 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e   (pTable->nCol >
e7a0: 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31  = BMS-1) ? BMS-1
e7b0: 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   : pTable->nCol;
e7c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
e7d0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
e7e0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e7f0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
e800: 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
e810: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
e820: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
e830: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
e840: 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a  i) ) nKeyCol++;.
e850: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
e860: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
e870: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
e880: 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c  nKeyCol += pTabl
e890: 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
e8a0: 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e  1;.  }.  pLoop->
e8b0: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
e8c0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
e8d0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20  RE_IDX_ONLY;..  
e8e0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
e8f0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
e900: 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
e910: 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d  ndex */.  pIdx =
e920: 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
e930: 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72  IndexObject(pPar
e940: 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b  se->db, nKeyCol+
e950: 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29  1, 0, &zNotUsed)
e960: 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  ;.  if( pIdx==0 
e970: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f  ) return;.  pLoo
e980: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
e990: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
e9a0: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
e9b0: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
e9c0: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
e9d0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
e9e0: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
e9f0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
ea00: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
ea10: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
ea20: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
ea30: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
ea40: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
ea50: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
ea60: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
ea70: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
ea80: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
ea90: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
eaa0: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
eab0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
eac0: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
ead0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
eae0: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
eaf0: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
eb00: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
eb10: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
eb20: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
eb30: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
eb40: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
eb50: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
eb60: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
eb70: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
eb80: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
eb90: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
eba0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
ebb0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
ebc0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
ebd0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
ebe0: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f   ALWAYS(pColl) ?
ebf0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
ec00: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
ec10: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
ec20: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
ec30: 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70  t( (u32)n==pLoop
ec40: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
ec50: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
ec60: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
ec70: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
ec80: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
ec90: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
eca0: 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
ecb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
ecc0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
ecd0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
ece0: 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20  MASKBIT(i) ){.  
ecf0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ed00: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
ed10: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
ed20: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
ed30: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
ed40: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
ed50: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
ed60: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f  BMS-1) ){.    fo
ed70: 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61  r(i=BMS-1; i<pTa
ed80: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
ed90: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
eda0: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
edb0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
edc0: 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
edd0: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
ede0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
edf0: 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70  ==nKeyCol );.  p
ee00: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ee10: 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61   = -1;.  pIdx->a
ee20: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
ee30: 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  RY";..  /* Creat
ee40: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
ee50: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
ee60: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
ee70: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
ee80: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
ee90: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
eea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
eeb0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
eec0: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
eed0: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
eee0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
eef0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
ef00: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
ef10: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
ef20: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
ef30: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
ef40: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
ef50: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
ef60: 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f  tent */.  addrTo
ef70: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
ef80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
ef90: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
efa0: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
efb0: 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f  ge(v);.  regReco
efc0: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
efd0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
efe0: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
eff0: 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
f000: 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
f010: 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
f020: 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  rd, 0, 0, 0, 0);
f030: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f040: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
f050: 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sert, pLevel->iI
f060: 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  dxCur, regRecord
f070: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f080: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
f090: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
f0a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f0b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f0c0: 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
f0d0: 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20  ur, addrTop+1); 
f0e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f0f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
f100: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
f110: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
f120: 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
f130: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f140: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
f150: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
f160: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
f170: 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
f180: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
f190: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
f1a0: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
f1b0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f1c0: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
f1d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f1e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
f1f0: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
f200: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f210: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
f220: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
f230: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
f240: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f250: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
f260: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
f270: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
f280: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
f290: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
f2a0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
f2b0: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
f2c0: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
f2d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
f2e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
f2f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
f300: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
f310: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
f320: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f330: 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
f340: 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
f350: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
f360: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
f370: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
f380: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
f390: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
f3a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
f3b0: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
f3c0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f3d0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
f3e0: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
f3f0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
f400: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
f410: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
f420: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f430: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
f440: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
f450: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
f460: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
f470: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
f480: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
f490: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
f4a0: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
f4b0: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
f4c0: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
f4d0: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
f4e0: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
f4f0: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
f500: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
f510: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
f520: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
f530: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
f540: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
f550: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
f560: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
f570: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
f580: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
f590: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
f5a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
f5b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
f5c0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
f5d0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
f5e0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f5f0: 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  _ALL );.    if( 
f600: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
f610: 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c  r & ~(WO_ISNULL|
f620: 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20  WO_EQUIV))==0 ) 
f630: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
f640: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
f650: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
f660: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
f670: 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
f680: 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
f690: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
f6a0: 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
f6b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
f6c0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
f6d0: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
f6e0: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
f6f0: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
f700: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
f710: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
f720: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
f730: 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
f740: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
f750: 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
f760: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
f770: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
f780: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
f790: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
f7a0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
f7b0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
f7c0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
f7d0: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
f7e0: 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
f7f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f800: 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
f810: 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
f820: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
f830: 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
f840: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
f850: 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
f860: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
f870: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
f880: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
f890: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
f8c0: 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
f8d0: 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
f8e0: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
f900: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
f910: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
f920: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
f930: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
f940: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f950: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
f960: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
f970: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
f980: 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
f990: 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
f9a0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
f9b0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
f9c0: 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64  .  ** many field
f9d0: 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
f9e0: 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
f9f0: 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
fa00: 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e  x from.  ** chan
fa10: 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
fa20: 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
fa30: 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
fa40: 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e  order to.  ** in
fa50: 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
fa60: 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ields..  */.  pI
fa70: 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
fa80: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fa90: 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
faa0: 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f  Info[1];.  pIdxO
fab0: 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
fac0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
fad0: 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
fae0: 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61  s[nTerm];.  pUsa
faf0: 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
fb00: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
fb10: 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
fb20: 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
fb30: 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  By];.  *(int*)&p
fb40: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
fb50: 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
fb60: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
fb70: 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
fb80: 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
fb90: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fba0: 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
fbb0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
fbc0: 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
fbd0: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
fbe0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
fbf0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
fc00: 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
fc10: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
fc20: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fc30: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
fc40: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
fc50: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f     pUsage;..  fo
fcb0: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
fcc0: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
fcd0: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
fce0: 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20  +){.    u8 op;. 
fcf0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
fd00: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
fd10: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
fd20: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
fd30: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
fd40: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
fd50: 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
fd60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
fd70: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd80: 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
fd90: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
fda0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
fdb0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
fdc0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
fdd0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
fde0: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
fdf0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
fe00: 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
fe10: 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  UIV))==0 ) conti
fe20: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
fe30: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
fe40: 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
fe50: 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
fe60: 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
fe70: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
fe80: 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
fe90: 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
fea0: 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
feb0: 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
fec0: 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
fed0: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
fee0: 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
fef0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
ff00: 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
ff10: 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
ff20: 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
ff30: 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
ff40: 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
ff50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
ff60: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
ff70: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
ff80: 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
ff90: 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
ffa0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
ffb0: 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
ffc0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ffd0: 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
ffe0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
fff0: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
10000 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
10010 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10020 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
10030 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
10040 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10050 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
10060 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
10070 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10080 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
10090 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
100a0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
100b0 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
100c0 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
100d0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
100e0 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
100f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
10100 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
10110 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
10120 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
10130 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
10140 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
10150 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
10160 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
10170 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
10180 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
10190 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
101a0 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
101b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
101c0 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
101d0 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
101e0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
101f0 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
10200 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
10210 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
10220 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
10230 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
10240 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
10250 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
10260 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
10270 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
10280 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
10290 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
102a0 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
102b0 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
102c0 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
102d0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
102e0 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
102f0 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
10300 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
10310 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
10320 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
10330 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
10340 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
10350 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
10360 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
10370 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
10380 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
10390 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
103a0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
103b0 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
103c0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
103d0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
103e0 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
103f0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
10400 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
10410 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
10420 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
10430 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
10440 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
10450 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
10460 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
10470 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
10480 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
10490 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
104a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
104b0 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
104c0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
104d0 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
104e0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
104f0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
10500 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
10510 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
10520 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
10530 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
10540 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
10550 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
10560 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
10570 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
10580 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
10590 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
105a0 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
105b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
105c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
105d0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
105e0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
105f0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
10600 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
10610 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
10620 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10630 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
10640 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
10650 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
10660 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10670 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
10680 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
10690 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
106a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
106b0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
106c0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
106d0 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
106e0 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
106f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
10700 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
10710 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
10720 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
10730 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
10740 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10750 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10760 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
10770 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
10780 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
10790 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
107a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
107b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
107c0 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
107d0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
107e0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
107f0 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
10800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10810 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
10820 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
10830 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
10840 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
10850 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
10860 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
10870 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
10880 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
10890 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
108a0 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
108b0 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
108c0 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
108d0 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61   pVal.**    aSta
108e0 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
108f0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
10900 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a  ual to pVal.**.*
10910 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10920 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
10930 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10940 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
10950 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
10970 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10980 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
10990 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
109a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
109b0 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
109c0 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  f */.  UnpackedR
109d0 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20  ecord *pRec,    
109e0 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20     /* Vector of 
109f0 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64  values to consid
10a00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
10a10 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
10a20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
10a30 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
10a40 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
10a50 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
10a60 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
10a70 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
10a80 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
10a90 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
10aa0 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
10ab0 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43  Sample;.  int iC
10ac0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
10ad0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
10ae0 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73  f required stats
10af0 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20   in anEq[] etc. 
10b00 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20  */.  int iMin = 
10b10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10b20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
10b30 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74  ple not yet test
10b40 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  ed */.  int i = 
10b50 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20  pIdx->nSample;  
10b60 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
10b70 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68  sample larger th
10b80 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
10b90 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  Rec */.  int iTe
10ba0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
10bb0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d       /* Next sam
10bc0 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ple to test */. 
10bd0 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10bf0 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  Result of compar
10c00 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ison operation *
10c10 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
10c20 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
10c30 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72  _PARAMETER( pPar
10c40 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  se );.#endif.  a
10c50 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29  ssert( pRec!=0 )
10c60 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d  ;.  iCol = pRec-
10c70 3e 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61  >nField - 1;.  a
10c80 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61  ssert( pIdx->nSa
10c90 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
10ca0 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  rt( pRec->nField
10cb0 3e 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  >0 && iCol<pIdx-
10cc0 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20  >nSampleCol );. 
10cd0 20 64 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d   do{.    iTest =
10ce0 20 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20   (iMin+i)/2;.   
10cf0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
10d00 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
10d10 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e  aSample[iTest].n
10d20 2c 20 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d  , aSample[iTest]
10d30 2e 70 2c 20 70 52 65 63 2c 20 30 29 3b 0a 20 20  .p, pRec, 0);.  
10d40 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
10d50 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
10d60 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
10d70 20 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b        i = iTest;
10d80 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
10d90 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29   res && iMin<i )
10da0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10db0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
10dc0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
10dd0 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63   statements chec
10de0 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72  k that the binar
10df0 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20  y search code.  
10e00 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74  ** above found t
10e10 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e  he right answer.
10e20 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
10e30 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74  es no purpose ot
10e40 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f  her.  ** than to
10e50 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65   invoke the asse
10e60 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  rts.  */.  if( r
10e70 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
10e80 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74  If (res==0) is t
10e90 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65  rue, then sample
10ea0 20 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61   $i must be equa
10eb0 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20  l to pRec */.   
10ec0 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d   assert( i<pIdx-
10ed0 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20  >nSample );.    
10ee0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
10ef0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
10f00 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
10f10 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
10f20 70 52 65 63 2c 20 30 29 0a 20 20 20 20 20 20 20  pRec, 0).       
10f30 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
10f40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10f50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
10f60 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63   Otherwise, pRec
10f70 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
10f80 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20   than sample $i 
10f90 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a  and larger than.
10fa0 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24      ** sample ($
10fb0 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  i-1).  */.    as
10fc0 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
10fd0 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
10fe0 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
10ff0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
11000 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
11010 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 2c 20 30  le[i].p, pRec, 0
11020 29 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  )>0.         || 
11030 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
11040 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
11050 61 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20  assert( i==0.   
11060 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
11070 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
11080 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  e(aSample[i-1].n
11090 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70  , aSample[i-1].p
110a0 2c 20 70 52 65 63 2c 20 30 29 3c 30 0a 20 20 20  , pRec, 0)<0.   
110b0 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
110c0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
110d0 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d );.  }.#endif 
110e0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
110f0 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41  DEBUG */..  /* A
11100 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53  t this point, aS
11110 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
11120 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61  first sample tha
11130 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
11140 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20  n.  ** or equal 
11150 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20  to pVal.  Or if 
11160 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
11170 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c  , then all sampl
11180 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a  es are less.  **
11190 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20   than pVal.  If 
111a0 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c  aSample[i]==pVal
111b0 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20  , then res==0.. 
111c0 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   */.  if( res==0
111d0 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d   ){.    aStat[0]
111e0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
111f0 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53  Lt[iCol];.    aS
11200 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[1] = aSample
11210 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a  [i].anEq[iCol];.
11220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
11230 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70  wcnt iLower, iUp
11240 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
11250 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
11260 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
11270 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
11280 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[0].anLt[iCol
11290 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
112a0 20 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d      iUpper = i>=
112b0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20  pIdx->nSample ? 
112c0 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30  pIdx->aiRowEst[0
112d0 5d 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] : aSample[i].a
112e0 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  nLt[iCol];.     
112f0 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
11300 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c  e[i-1].anEq[iCol
11310 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  ] + aSample[i-1]
11320 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
11330 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20   }.    aStat[1] 
11340 3d 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  = (pIdx->nKeyCol
11350 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41  >iCol ? pIdx->aA
11360 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b  vgEq[iCol] : 1);
11370 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
11380 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
11390 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
113a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
113b0 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
113c0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
113d0 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
113e0 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
113f0 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
11400 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
11410 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
11420 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
11430 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a  r + iGap;.  }.}.
11440 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11450 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11460 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
11470 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11480 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
11490 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
114a0 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
114b0 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
114c0 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
114d0 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
114e0 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
114f0 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
11500 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
11510 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
11520 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
11530 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
11540 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
11550 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
11560 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
11570 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
11580 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
11590 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
115a0 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
115b0 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
115c0 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
115d0 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
115e0 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
115f0 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
11620 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
11630 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
11640 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
11650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
11660 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
11670 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
11680 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
11690 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
116a0 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
116b0 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
116c0 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
116d0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
116e0 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
116f0 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
11700 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
11710 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
11720 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
11730 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  index.** column 
11740 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72  subject to the r
11750 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
11760 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
11770 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
11780 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .** equality con
11790 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a  straints optimiz
117a0 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
117b0 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
117c0 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  or example,.** a
117d0 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
117e0 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  is on t1(a, b), 
117f0 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
11800 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
11810 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
11820 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
11830 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
11840 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
11850 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65  set to 1 (as the
11860 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
11870 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20  d column, b, is 
11880 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c  the second .** l
11890 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
118a0 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
118b0 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
118c0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
118d0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
118e0 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
118f0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
11900 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
11910 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
11920 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11930 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20  , *pnOut is set 
11940 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f  to the sqlite3Lo
11950 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a  gEst() of the.**
11960 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
11970 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73  that the index s
11980 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20  can is expected 
11990 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74  to visit without
119a0 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67   .** considering
119b0 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
119c0 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69  raints. If nEq i
119d0 73 20 30 2c 20 74 68 69 73 20 69 73 20 74 68 65  s 0, this is the
119e0 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72   number of .** r
119f0 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
11a00 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  . Assuming no er
11a10 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f  ror occurs, *pnO
11a20 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20 28  ut is adjusted (
11a30 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61  reduced).** to a
11a40 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72  ccount for the r
11a50 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20  ange contraints 
11a60 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
11a70 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65  r..** .** In the
11a80 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
11a90 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45  te_stat4 ANALYZE
11aa0 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63   data, or if suc
11ab0 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65  h data cannot be
11ac0 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68 20 72  .** used, each r
11ad0 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20  ange inequality 
11ae0 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
11af0 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61  ch space by a fa
11b00 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 48  ctor of 4. .** H
11b10 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66 20 63  ence a pair of c
11b20 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20  onstraints (x>? 
11b30 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73  AND x<?) reduces
11b40 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75   the expected nu
11b50 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20  mber of.** rows 
11b60 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63  visited by a fac
11b70 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74  tor of 16..*/.st
11b80 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
11b90 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ngeScanEst(.  Pa
11ba0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11bb0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
11bc0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
11bd0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
11be0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
11bf0 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65  Builder,.  Where
11c00 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
11c10 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
11c20 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
11c30 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
11c40 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
11c50 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
11c60 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
11c70 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
11c80 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
11c90 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
11ca0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20  reLoop *pLoop   
11cb0 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20    /* Modify the 
11cc0 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20  .nOut and maybe 
11cd0 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a  .rRun fields */.
11ce0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11cf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
11d00 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Out = pLoop->nOu
11d10 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77  t;.  LogEst nNew
11d20 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
11d30 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11d40 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a  _STAT4.  Index *
11d50 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  p = pLoop->u.btr
11d60 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
11d70 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
11d80 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66  btree.nEq;..  if
11d90 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a 20  ( p->nSample>0. 
11da0 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69 6c 64    && nEq==pBuild
11db0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20 20  er->nRecValid.  
11dc0 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70   && nEq<p->nSamp
11dd0 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69  leCol.   && Opti
11de0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
11df0 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
11e00 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b 0a  TE_Stat3) .  ){.
11e10 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f      UnpackedReco
11e20 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
11e30 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 74  der->pRec;.    t
11e40 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
11e50 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 2f 2a   u8 aff;..    /*
11e60 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72   Variable iLower
11e70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
11e80 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
11e90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
11ea0 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68  ws in .    ** th
11eb0 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
11ec0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
11ed0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
11ee0 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54  e range query. T
11ef0 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20  he.    ** lower 
11f00 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20  bound being the 
11f10 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
11f20 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72   $P and $L, wher
11f30 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20  e $P is the.    
11f40 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
11f50 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
11f60 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
11f70 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
11f80 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a 20  eft-most.    ** 
11f90 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
11fa0 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20  ndex, and $L is 
11fb0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f  the value in pLo
11fc0 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  wer..    **.    
11fd0 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72  ** Or, if pLower
11fe0 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63   is NULL or $L c
11ff0 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
12000 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61  ed from it (beca
12010 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20 69 73  use it.    ** is
12020 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61   not a simple va
12030 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61  riable or litera
12040 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f  l value), the lo
12050 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
12060 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73  .    ** range is
12070 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75   $P. Due to a qu
12080 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77  irk in the way w
12090 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 77  hereKeyStats() w
120a0 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 2a  orks, even.    *
120b0 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c  * if $L is avail
120c0 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74  able, whereKeySt
120d0 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ats() is called 
120e0 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e  for both ($P) an
120f0 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c  d .    ** ($P:$L
12100 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72  ) and the larger
12110 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75   of the two retu
12120 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65 64  rned values used
12130 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12140 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65  Similarly, iUppe
12150 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74  r is to be set t
12160 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
12170 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
12180 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73 73  rows.    ** less
12190 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
121a0 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
121b0 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
121c0 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
121d0 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
121e0 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29   ($P) or ($P:$U)
121f0 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66  . Again, even if
12200 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $U is available
12210 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  , both values.  
12220 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61    ** of iUpper a
12230 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66 20  re requested of 
12240 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
12250 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20  and the smaller 
12260 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  used..    */.   
12270 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
12280 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
12290 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e 45  per;..    if( nE
122a0 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  q==p->nKeyCol ){
122b0 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
122c0 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
122d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
122e0 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c    aff = p->pTabl
122f0 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
12300 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69  umn[nEq]].affini
12310 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ty;.    }.    /*
12320 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65   Determine iLowe
12330 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73 69  r and iUpper usi
12340 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f  ng ($P) only. */
12350 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  .    if( nEq==0 
12360 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
12370 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65  = 0;.      iUppe
12380 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  r = p->aiRowEst[
12390 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0];.    }else{. 
123a0 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
123b0 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
123c0 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
123d0 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
123e0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
123f0 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e      ** have been
12400 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20   requested when 
12410 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69  testing key $P i
12420 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  n whereEqualScan
12430 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20  Est().  */.     
12440 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
12450 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
12460 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 69 4c 6f  0, a);.      iLo
12470 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  wer = a[0];.    
12480 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20    iUpper = a[0] 
12490 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20  + a[1];.    }.. 
124a0 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c     /* If possibl
124b0 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68  e, improve on th
124c0 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74  e iLower estimat
124d0 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e  e using ($P:$L).
124e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 77   */.    if( pLow
124f0 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  er ){.      int 
12500 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  bOk;            
12510 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12520 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72  if value is extr
12530 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
12540 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
12550 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
12560 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
12570 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
12580 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
12590 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
125a0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
125b0 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
125c0 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
125d0 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
125e0 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26  xpr, aff, nEq, &
125f0 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bOk);.      if( 
12600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12610 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   bOk ){.        
12620 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20  tRowcnt iNew;.  
12630 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74        whereKeySt
12640 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
12650 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
12660 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
12670 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65  + ((pLower->eOpe
12680 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29 20 3f  rator & WO_GT) ?
12690 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
126a0 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f      if( iNew>iLo
126b0 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69  wer ) iLower = i
126c0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  New;.        nOu
126d0 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t--;.      }.   
126e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f   }..    /* If po
126f0 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
12700 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73  on the iUpper es
12710 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
12720 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28  :$U). */.    if(
12730 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
12740 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20   int bOk;       
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12760 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73  True if value is
12770 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
12780 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 45  pExpr */.      E
12790 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
127a0 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
127b0 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
127c0 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  ( (pUpper->eOper
127d0 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
127e0 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
127f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
12800 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
12810 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
12820 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
12830 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
12840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12850 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20  OK && bOk ){.   
12860 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65       tRowcnt iNe
12870 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  w;.        where
12880 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
12890 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b   p, pRec, 1, a);
128a0 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20  .        iNew = 
128b0 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
128c0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
128d0 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b  LE) ? a[1] : 0);
128e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65  .        if( iNe
128f0 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
12900 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
12910 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
12920 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42 75  }.    }..    pBu
12930 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52  ilder->pRec = pR
12940 65 63 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ec;.    if( rc==
12950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12960 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c     if( iUpper>iL
12970 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
12980 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
12990 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
129a0 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ower);.      }el
129b0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77  se{.        nNew
129c0 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73   = 10;        as
129d0 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
129e0 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
129f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12a00 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20  nNew<nOut ){.   
12a10 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77       nOut = nNew
12a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12a30 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
12a40 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 20 20  ogEst)nOut;.    
12a50 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
12a60 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61 6e 20  0, ("range scan 
12a70 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20  regions: %u..%u 
12a80 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
12ab0 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e  , (u32)iUpper, n
12ac0 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Out));.      ret
12ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12ae0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
12af0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12b00 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
12b10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42  SED_PARAMETER(pB
12b20 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64 69 66 0a  uilder);.#endif.
12b30 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
12b40 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20   || pUpper );.  
12b50 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45 61 63 68  /* TUNING:  Each
12b60 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
12b70 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 20 74  traint reduces t
12b80 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
12b90 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20 41 20 42  4-fold..  ** A B
12ba0 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
12bb0 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65 64 75   therefore, redu
12bc0 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
12bd0 70 61 63 65 20 31 36 2d 66 6f 6c 64 20 2a 2f 0a  pace 16-fold */.
12be0 20 20 6e 4e 65 77 20 3d 20 6e 4f 75 74 3b 0a 20    nNew = nOut;. 
12bf0 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 28   if( pLower && (
12c00 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73 20  pLower->wtFlags 
12c10 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
12c20 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
12c30 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72  20;        asser
12c40 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 20==sqlite3Lo
12c50 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 6e  gEst(4) );.    n
12c60 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28  Out--;.  }.  if(
12c70 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 6e   pUpper ){.    n
12c80 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  New -= 20;      
12c90 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
12ca0 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
12cb0 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20  ;.    nOut--;.  
12cc0 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20  }.  if( nNew<10 
12cd0 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69  ) nNew = 10;.  i
12ce0 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e  f( nNew<nOut ) n
12cf0 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 4c  Out = nNew;.  pL
12d00 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67  oop->nOut = (Log
12d10 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75  Est)nOut;.  retu
12d20 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
12d30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
12d40 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
12d50 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
12d60 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
12d70 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
12d80 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
12d90 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f  * an equality co
12da0 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45  nstraint x=VALUE
12db0 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20   and where that 
12dc0 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a  VALUE occurs in.
12dd0 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d  ** the histogram
12de0 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c   data.  This onl
12df0 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69  y works when x i
12e00 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  s the left-most.
12e10 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20  ** column of an 
12e20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65  index and sqlite
12e30 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
12e40 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
12e50 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69  le.** for that i
12e60 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70  ndex.  When pExp
12e70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  r==NULL that mea
12e80 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ns the constrain
12e90 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55  t is.** "x IS NU
12ea0 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  LL" instead of "
12eb0 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20  x=VALUE"..**.** 
12ec0 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
12ed0 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
12ee0 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
12ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
12f00 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
12f10 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
12f20 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
12f30 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
12f40 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
12f50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12f60 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
12f70 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
12f80 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
12f90 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
12fa0 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
12fb0 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
12fc0 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
12fd0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
12fe0 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
12ff0 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
13000 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
13010 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
13020 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
13030 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
13040 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
13050 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
13060 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
13070 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
13080 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
13090 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
130a0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
130b0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
130c0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
130d0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
130e0 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20  on for VALUE in 
130f0 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73  the x=VALUE cons
13100 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77  traint */.  tRow
13110 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20  cnt *pnRow      
13120 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
13130 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
13140 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
13150 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c  Index *p = pBuil
13160 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
13170 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
13180 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d   nEq = pBuilder-
13190 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
131a0 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  Eq;.  UnpackedRe
131b0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
131c0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75  ilder->pRec;.  u
131d0 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20  8 aff;          
131e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
131f0 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20  mn affinity */. 
13200 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
13220 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
13230 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
13240 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20  nt a[2];        
13250 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69       /* Statisti
13260 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b  cs */.  int bOk;
13270 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e  ..  assert( nEq>
13280 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
13290 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43 6f 6c  nEq<=(p->nKeyCol
132a0 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
132b0 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
132c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
132d0 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73  Sample>0 );.  as
132e0 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
132f0 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b  nRecValid<nEq );
13300 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73  ..  /* If values
13310 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
13320 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64  le for all field
13330 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  s of the index t
13340 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20  o the left.  ** 
13350 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20  of this one, no 
13360 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20  estimate can be 
13370 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  made. Return SQL
13380 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f  ITE_NOTFOUND. */
13390 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
133a0 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d  >nRecValid<(nEq-
133b0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
133c0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
133d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
133e0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
133f0 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61  ion only. The ca
13400 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61  ll to sqlite3Sta
13410 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
13420 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75  ).  ** below wou
13430 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ld return the sa
13440 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  me value.  */.  
13450 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65 79 43  if( nEq>p->nKeyC
13460 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77  ol ){.    *pnRow
13470 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
13480 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13490 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
134a0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
134b0 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66  lumn[nEq-1]].aff
134c0 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71  inity;.  rc = sq
134d0 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
134e0 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
134f0 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
13500 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f   aff, nEq-1, &bO
13510 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  k);.  pBuilder->
13520 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69  pRec = pRec;.  i
13530 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13540 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
13550 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74  if( bOk==0 ) ret
13560 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
13570 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  UND;.  pBuilder-
13580 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71  >nRecValid = nEq
13590 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61  ;..  whereKeySta
135a0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
135b0 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45  ec, 0, a);.  WHE
135c0 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65  RETRACE(0x10,("e
135d0 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
135e0 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e  ions: %d\n", (in
135f0 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52  t)a[1]));.  *pnR
13600 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20  ow = a[1];.  .  
13610 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
13620 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
13630 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
13640 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AT4 */..#ifdef S
13650 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
13660 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
13670 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
13680 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
13690 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
136a0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
136b0 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
136c0 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
136d0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
136e0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
136f0 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
13700 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
13710 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
13720 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
13730 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
13740 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
13750 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
13760 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
13770 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
13780 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
13790 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
137a0 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
137b0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
137c0 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
137d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
137e0 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
137f0 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
13800 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
13810 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
13820 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
13830 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
13840 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
13850 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
13860 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
13870 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
13880 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
13890 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
138a0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
138b0 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
138c0 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
138d0 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
138e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
138f0 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
13900 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
13910 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
13920 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
13930 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r,.  ExprList *p
13940 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
13950 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
13960 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
13970 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
13980 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
13990 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
139a0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
139b0 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
139c0 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
139d0 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
139e0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
139f0 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61  ex;.  int nRecVa
13a00 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
13a10 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74  nRecValid;.  int
13a20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13a30 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
13a40 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
13a50 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73  */.  tRowcnt nEs
13a60 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
13a70 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66  Number of rows f
13a80 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  or a single term
13a90 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52   */.  tRowcnt nR
13aa0 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  owEst = 0;    /*
13ab0 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66   New estimate of
13ac0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
13ad0 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ows */.  int i; 
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13af0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
13b00 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
13b10 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
13b20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
13b30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
13b40 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
13b50 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e  {.    nEst = p->
13b60 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
13b70 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
13b80 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
13b90 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d  pBuilder, pList-
13ba0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45  >a[i].pExpr, &nE
13bb0 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74  st);.    nRowEst
13bc0 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42   += nEst;.    pB
13bd0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
13be0 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20  d = nRecValid;. 
13bf0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
13c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
13c10 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e  f( nRowEst > p->
13c20 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52  aiRowEst[0] ) nR
13c30 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77  owEst = p->aiRow
13c40 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52  Est[0];.    *pnR
13c50 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
13c60 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
13c70 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
13c80 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20  ate: est=%g\n", 
13c90 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
13ca0 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
13cb0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
13cc0 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
13cd0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
13ce0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
13cf0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
13d00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62   */../*.** Disab
13d10 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
13d20 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
13d30 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
13d40 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
13d50 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
13d60 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
13d70 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
13d80 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
13d90 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
13da0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
13db0 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
13dc0 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
13dd0 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
13de0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
13df0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
13e00 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13e10 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
13e20 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
13e30 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
13e40 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
13e50 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
13e60 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
13e70 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
13e80 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
13e90 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
13ea0 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
13eb0 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
13ec0 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
13ed0 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
13ee0 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
13ef0 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
13f00 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
13f10 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
13f20 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
13f30 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
13f40 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
13f50 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
13f60 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
13f70 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
13f80 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
13f90 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
13fa0 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
13fb0 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
13fc0 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
13fd0 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
13fe0 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
13ff0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
14000 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
14010 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
14020 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
14030 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
14040 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
14050 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
14060 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
14070 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
14080 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
14090 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
140a0 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
140b0 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
140c0 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
140d0 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
140e0 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
140f0 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
14100 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
14110 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
14120 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
14130 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
14140 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
14150 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
14160 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
14170 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
14180 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
14190 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
141a0 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
141b0 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
141c0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
141d0 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
141e0 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
141f0 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
14200 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
14210 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
14220 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
14230 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  && (pLevel->notR
14240 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72  eady & pTerm->pr
14250 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b  ereqAll)==0.  ){
14260 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
14270 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
14280 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
14290 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
142a0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
142b0 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
142c0 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
142d0 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
142e0 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
142f0 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
14300 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
14310 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
14320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14330 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
14340 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79  e an OP_Affinity
14350 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79   opcode to apply
14360 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
14370 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66  nity string zAff
14380 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67  .** to the n reg
14390 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
143a0 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  at base. .**.** 
143b0 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
143c0 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  on, SQLITE_AFF_N
143d0 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69  ONE entries (whi
143e0 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61  ch are no-ops) a
143f0 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69  t the.** beginni
14400 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41  ng and end of zA
14410 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20  ff are ignored. 
14420 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   If all entries 
14430 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53  in zAff are.** S
14440 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20  QLITE_AFF_NONE, 
14450 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74  then no code get
14460 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a  s generated..**.
14470 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14480 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f  makes its own co
14490 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68  py of zAff so th
144a0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  at the caller is
144b0 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69   free.** to modi
144c0 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68  fy zAff after th
144d0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
144e0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
144f0 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
14500 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
14510 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
14520 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29  t n, char *zAff)
14530 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
14540 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
14550 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20  f( zAff==0 ){.  
14560 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14570 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
14580 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
14590 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
145a0 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  v!=0 );..  /* Ad
145b0 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20  just base and n 
145c0 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c  to skip over SQL
145d0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
145e0 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69  ries at the begi
145f0 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65  nning.  ** and e
14600 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69  nd of the affini
14610 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a  ty string..  */.
14620 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
14630 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  zAff[0]==SQLITE_
14640 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
14650 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b  n--;.    base++;
14660 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d  .    zAff++;.  }
14670 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
14680 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49   zAff[n-1]==SQLI
14690 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
146a0 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f     n--;.  }..  /
146b0 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66  * Code the OP_Af
146c0 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66  finity opcode if
146d0 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
146e0 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a  ng left to do. *
146f0 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  /.  if( n>0 ){. 
14700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14710 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp2(v, OP_Affin
14720 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  ity, base, n);. 
14730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
14740 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41  angeP4(v, -1, zA
14750 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
14760 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
14770 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
14780 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
14790 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
147a0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
147b0 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
147c0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
147d0 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
147e0 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
147f0 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
14800 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
14810 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
14820 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
14830 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
14840 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
14850 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
14860 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
14870 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
14880 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
14890 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
148a0 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
148b0 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
148c0 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
148d0 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
148e0 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
148f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
14900 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
14910 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
14920 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
14930 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
14940 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
14950 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
14960 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
14970 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
14980 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14990 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
149a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
149b0 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
149c0 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
149d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
149e0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
149f0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
14a00 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65  vel, /* The leve
14a10 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
14a20 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
14a30 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
14a40 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  iEq,            
14a50 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
14a60 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69  equality term wi
14a70 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20  thin this level 
14a80 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
14a90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14aa0 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
14ab0 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73  er IN operations
14ac0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
14ad0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
14ae0 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
14af0 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
14b00 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
14b10 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
14b20 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
14b30 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
14b40 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
14b70 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
14b80 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
14b90 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
14ba0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
14bb0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
14bc0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
14bd0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
14be0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
14bf0 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
14c00 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
14c10 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
14c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14c30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
14c40 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
14c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14c60 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
14c70 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
14c80 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
14c90 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
14ca0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65  op *pIn;.    Whe
14cb0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
14cc0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
14cd0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
14ce0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14cf0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
14d00 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
14d10 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
14d20 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  !=0.      && pLo
14d30 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
14d40 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
14d50 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
14d60 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
14d70 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
14d80 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
14d90 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
14da0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
14db0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
14dc0 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
14dd0 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
14de0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
14df0 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
14e00 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65  X, 0);.    if( e
14e10 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
14e20 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20  NDEX_DESC ){.   
14e30 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
14e40 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
14e50 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
14e60 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
14e70 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
14e80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
14e90 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
14ea0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
14eb0 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76   0);.    VdbeCov
14ec0 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 29  erageIf(v, bRev)
14ed0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
14ee0 67 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a  geIf(v, !bRev);.
14ef0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
14f00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
14f10 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30  ERE_MULTI_OR)==0
14f20 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77   );.    pLoop->w
14f30 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
14f40 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28  IN_ABLE;.    if(
14f50 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
14f60 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
14f70 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
14f80 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14f90 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
14fa0 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
14fb0 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
14fc0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
14fd0 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
14fe0 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
14ff0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
15000 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
15010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
15040 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
15050 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
15060 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
15070 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
15080 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
15090 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
150a0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
150b0 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
150c0 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
150d0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
150e0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
150f0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
15100 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
15110 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15120 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
15130 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
15140 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
15150 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
15160 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15170 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
15180 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
15190 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45   }.      pIn->eE
151a0 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20  ndLoopOp = bRev 
151b0 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20  ? OP_PrevIfOpen 
151c0 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b  : OP_NextIfOpen;
151d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
151e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
151f0 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56 64  sNull, iReg); Vd
15200 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15220 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
15230 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 0;.    }.#end
15240 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65  if.  }.  disable
15250 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
15260 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  rm);.  return iR
15270 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
15280 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
15290 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c  will evaluate al
152a0 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  l == and IN cons
152b0 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a  traints for an.*
152c0 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a  * index scan..**
152d0 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
152e0 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
152f0 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
15300 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
15310 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
15320 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
15330 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
15340 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
15350 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
15360 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
15370 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
15380 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
15390 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
153a0 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
153b0 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
153c0 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
153d0 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
153e0 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
153f0 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
15400 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
15410 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
15420 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
15430 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
15440 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
15450 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
15460 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
15470 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e  stored.** in con
15480 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
15490 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  rs and the index
154a0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
154b0 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e  gister is return
154c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ed..**.** In the
154d0 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e   example above n
154e0 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73  Eq==2.  But this
154f0 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b   subroutine work
15500 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a  s for any value.
15510 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64  ** of nEq includ
15520 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d  ing 0.  If nEq==
15530 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0, this routine 
15540 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f  is nearly a no-o
15550 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  p..** The only t
15560 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20  hing it does is 
15570 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65  allocate the pLe
15580 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79  vel->iMem memory
15590 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d   cell and.** com
155a0 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74  pute the affinit
155b0 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
155c0 54 68 65 20 6e 45 78 74 72 61 52 65 67 20 70 61  The nExtraReg pa
155d0 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20  rameter is 0 or 
155e0 31 2e 20 20 49 74 20 69 73 20 30 20 69 66 20 61  1.  It is 0 if a
155f0 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ll WHERE clause 
15600 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61  constraints.** a
15610 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20  re == or IN and 
15620 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74  are covered by t
15630 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52  he nEq.  nExtraR
15640 65 67 20 69 73 20 31 20 69 66 20 74 68 65 72 65  eg is 1 if there
15650 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61   is.** an inequa
15660 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
15670 28 73 75 63 68 20 61 73 20 74 68 65 20 22 63 3e  (such as the "c>
15680 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20  =5 AND c<10" in 
15690 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61  the example) tha
156a0 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65  t.** occurs afte
156b0 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74  r the nEq qualit
156c0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a  y constraints..*
156d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
156e0 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61  e allocates a ra
156f0 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72  nge of nEq+nExtr
15700 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  aReg memory cell
15710 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  s and returns.**
15720 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
15730 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63  e first memory c
15740 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67  ell in that rang
15750 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  e. The code that
15760 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
15770 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
15780 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67  that memory rang
15790 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20  e to store keys 
157a0 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64  for.** start and
157b0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
157c0 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  ditions of the l
157d0 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  oop..** key valu
157e0 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
157f0 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
15800 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
15810 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
15820 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
15830 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
15840 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
15850 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
15860 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  * use..**.** Bef
15870 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
15880 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20  pzAff is set to 
15890 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
158a0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  r containing a.*
158b0 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  * copy of the co
158c0 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
158d0 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65  ring of the inde
158e0 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  x allocated usin
158f0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61  g.** sqlite3DbMa
15900 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20  lloc(). Except, 
15910 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63  entries in the c
15920 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  opy of the strin
15930 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  g associated.** 
15940 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f  with equality co
15950 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75  nstraints that u
15960 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  se NONE affinity
15970 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53   are set to.** S
15980 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
15990 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20  This is to deal 
159a0 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73  with SQL such as
159b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
159c0 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
159d0 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50  ABLE t1(a TEXT P
159e0 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
159f0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  **   SELECT ... 
15a00 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74  FROM t1 AS t2, t
15a10 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74  1 WHERE t1.a = t
15a20 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  2.b;.**.** In th
15a30 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c  e example above,
15a40 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31   the index on t1
15a50 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66  (a) has TEXT aff
15a60 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65  inity. But since
15a70 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61  .** the right ha
15a80 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65  nd side of the e
15a90 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
15aa0 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f  nt (t2.b) has NO
15ab0 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20  NE affinity,.** 
15ac0 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68  no conversion sh
15ad0 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65  ould be attempte
15ae0 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61  d before using a
15af0 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70   t2.b value as p
15b00 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20  art of.** a key 
15b10 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e  to search the in
15b20 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66  dex. Hence the f
15b30 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65  irst byte in the
15b40 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69   returned affini
15b50 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20  ty.** string in 
15b60 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75  this example wou
15b70 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ld be set to SQL
15b80 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f  ITE_AFF_NONE..*/
15b90 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
15ba0 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
15bb0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15bc0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
15bd0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15be0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
15bf0 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
15c00 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
15c10 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
15c20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
15c30 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
15c40 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65    /* Reverse the
15c50 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65   order of IN ope
15c60 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  rators */.  int 
15c70 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20  nExtraReg,      
15c80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
15c90 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74  xtra registers t
15ca0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
15cb0 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20  char **pzAff    
15cc0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
15cd0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66  t to point to af
15ce0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
15cf0 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20 20  .){.  u16 nEq;  
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d10 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
15d20 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
15d30 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
15d40 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70  e */.  u16 nSkip
15d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15d60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15d70 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  f left-most colu
15d80 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  mns to skip */. 
15d90 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
15da0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
15db0 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63  * The vm under c
15dc0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
15dd0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15df0 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
15e00 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  g used for this 
15e10 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54  loop */.  WhereT
15e20 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
15e30 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
15e40 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
15e50 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  erm */.  WhereLo
15e60 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
15e70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
15e80 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
15e90 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15ec0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
15ed0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
15ee0 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
15ef0 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
15f00 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
15f10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15f20 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
15f30 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
15f40 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20   char *zAff;    
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15f60 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
15f70 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  g to return */..
15f80 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
15f90 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
15fa0 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
15fb0 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
15fc0 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  . */.  pLoop = p
15fd0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
15fe0 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
15ff0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
16000 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
16010 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f  0 );.  nEq = pLo
16020 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
16030 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70  .  nSkip = pLoop
16040 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b  ->u.btree.nSkip;
16050 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d  .  pIdx = pLoop-
16060 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
16070 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
16080 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  =0 );..  /* Figu
16090 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
160a0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20  memory cells we 
160b0 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61  will need then a
160c0 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20  llocate them..  
160d0 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70  */.  regBase = p
160e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
160f0 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d  .  nReg = pLoop-
16100 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e  >u.btree.nEq + n
16110 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72  ExtraReg;.  pPar
16120 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
16130 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69  ;..  zAff = sqli
16140 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
16150 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49  se->db, sqlite3I
16160 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
16170 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28  v, pIdx));.  if(
16180 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50   !zAff ){.    pP
16190 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
161a0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
161b0 0a 20 20 69 66 28 20 6e 53 6b 69 70 20 29 7b 0a  .  if( nSkip ){.
161c0 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20      int iIdxCur 
161d0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
161e0 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
161f0 62 65 41 64 64 4f 70 31 28 76 2c 20 28 62 52 65  beAddOp1(v, (bRe
16200 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f 52 65 77  v?OP_Last:OP_Rew
16210 69 6e 64 29 2c 20 69 49 64 78 43 75 72 29 3b 0a  ind), iIdxCur);.
16220 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
16230 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a  If(v, bRev==0);.
16240 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
16250 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a  If(v, bRev!=0);.
16260 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
16270 28 76 2c 20 22 62 65 67 69 6e 20 73 6b 69 70 2d  (v, "begin skip-
16280 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 49 64  scan on %s", pId
16290 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
162a0 6a 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  j = sqlite3VdbeA
162b0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
162c0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  );.    pLevel->a
162d0 64 64 72 53 6b 69 70 20 3d 20 73 71 6c 69 74 65  ddrSkip = sqlite
162e0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
162f0 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65 65 6b 4c  , (bRev?OP_SeekL
16300 54 3a 4f 50 5f 53 65 65 6b 47 54 29 2c 0a 20 20  T:OP_SeekGT),.  
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 20 20 20 20 20 20 20 20 20 69 49 64 78 43 75            iIdxCu
16330 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2c 20 6e  r, 0, regBase, n
16340 53 6b 69 70 29 3b 0a 20 20 20 20 56 64 62 65 43  Skip);.    VdbeC
16350 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
16360 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43  v==0);.    VdbeC
16370 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
16380 76 21 3d 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  v!=0);.    sqlit
16390 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
163a0 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  , j);.    for(j=
163b0 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29  0; j<nSkip; j++)
163c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
163d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
163e0 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
163f0 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a   j, regBase+j);.
16400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
16410 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e  dx->aiColumn[j]>
16420 3d 30 20 29 3b 0a 20 20 20 20 20 20 56 64 62 65  =0 );.      Vdbe
16430 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
16440 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  , pIdx->pTable->
16450 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
16460 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b  umn[j]].zName));
16470 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 20 0a 0a  .    }.  }    ..
16480 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
16490 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
164a0 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
164b0 73 65 72 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c  sert( zAff==0 ||
164c0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66   (int)strlen(zAf
164d0 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72  f)>=nEq );.  for
164e0 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b  (j=nSkip; j<nEq;
164f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   j++){.    int r
16500 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  1;.    pTerm = p
16510 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
16520 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
16530 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20  rm!=0 );.    /* 
16540 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
16550 73 74 63 61 73 65 20 69 73 20 74 72 75 65 20 66  stcase is true f
16560 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20  or indices with 
16570 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e  redundant column
16580 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43  s. .    ** Ex: C
16590 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
165a0 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c  N t1(a,b,a); SEL
165b0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
165c0 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b  ERE a=0 AND b=0;
165d0 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
165e0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
165f0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21  s & TERM_CODED)!
16600 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
16610 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
16620 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
16630 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f  L );.    r1 = co
16640 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
16650 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
16660 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72  evel, j, bRev, r
16670 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69  egBase+j);.    i
16680 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a  f( r1!=regBase+j
16690 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52   ){.      if( nR
166a0 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  eg==1 ){.       
166b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
166c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
166d0 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  egBase);.       
166e0 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20   regBase = r1;. 
166f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16710 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
16720 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a  y, r1, regBase+j
16730 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16740 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
16750 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
16760 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
16770 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
16780 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
16790 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28  WO_IN );.    if(
167a0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
167b0 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  or & (WO_ISNULL|
167c0 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20  WO_IN))==0 ){.  
167d0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
167e0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
167f0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69  >pRight;.      i
16800 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
16810 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 20  nBeNull(pRight) 
16820 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16830 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16840 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61  OP_IsNull, regBa
16850 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  se+j, pLevel->ad
16860 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  drBrk);.        
16870 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16890 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20  f( zAff ){.     
168a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
168b0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
168c0 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d  ight, zAff[j])==
168d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
168e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
168f0 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[j] = SQLITE_AF
16900 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
16910 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
16920 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
16930 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
16940 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20  Right, zAff[j]) 
16950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
16960 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[j] = SQLITE_AF
16970 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
16980 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16990 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a    }.  *pzAff = z
169a0 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  Aff;.  return re
169b0 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  gBase;.}..#ifnde
169c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
169d0 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PLAIN./*.** This
169e0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65   routine is a he
169f0 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e  lper for explain
16a00 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c  IndexRange() bel
16a10 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f  ow.**.** pStr ho
16a20 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20  lds the text of 
16a30 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
16a40 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69  at we are buildi
16a50 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a  ng up one term.*
16a60 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  * at a time.  Th
16a70 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
16a80 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
16a90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70  e end of the exp
16aa0 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d  ression..** Term
16ab0 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  s are separated 
16ac0 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68  by AND so add th
16ad0 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72  e "AND" text for
16ae0 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
16af0 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20  equent.** terms 
16b00 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
16b10 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65  void explainAppe
16b20 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63  ndTerm(.  StrAcc
16b30 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  um *pStr,       
16b40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
16b50 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  t expression bei
16b60 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e  ng built */.  in
16b70 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t iTerm,        
16b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16b90 65 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e  ex of this term.
16ba0 20 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20    First is zero 
16bb0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
16bc0 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  *zColumn,       
16bd0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16be0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73  column */.  cons
16bf0 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20  t char *zOp     
16c00 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16c10 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  of the operator 
16c20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72  */.){.  if( iTer
16c30 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  m ) sqlite3StrAc
16c40 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
16c50 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73  " AND ", 5);.  s
16c60 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
16c70 70 65 6e 64 41 6c 6c 28 70 53 74 72 2c 20 7a 43  pendAll(pStr, zC
16c80 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74 65  olumn);.  sqlite
16c90 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
16ca0 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20  pStr, zOp, 1);. 
16cb0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
16cc0 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22  Append(pStr, "?"
16cd0 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 1);.}../*.** A
16ce0 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64  rgument pLevel d
16cf0 65 73 63 72 69 62 65 73 20 61 20 73 74 72 61 74  escribes a strat
16d00 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67  egy for scanning
16d10 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69   table pTab. Thi
16d20 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
16d30 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
16d40 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66   to a string buf
16d50 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
16d60 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20   description.** 
16d70 6f 66 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  of the subset of
16d80 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e   table rows scan
16d90 6e 65 64 20 62 79 20 74 68 65 20 73 74 72 61 74  ned by the strat
16da0 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20  egy in the form 
16db0 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70  of an.** SQL exp
16dc0 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20  ression. Or, if 
16dd0 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61  all rows are sca
16de0 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nned, NULL is re
16df0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  turned..**.** Fo
16e00 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
16e10 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
16e20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
16e30 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20  1 WHERE a=1 AND 
16e40 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75  b>2;.**.** is ru
16e50 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  n and there is a
16e60 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62  n index on (a, b
16e70 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ), then this fun
16e80 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a  ction returns a.
16e90 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61  ** string simila
16ea0 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61  r to:.**.**   "a
16eb0 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a  =? AND b>?".**.*
16ec0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
16ed0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ointer points to
16ee0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
16ef0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
16f00 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69  alloc()..** It i
16f10 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
16f20 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
16f30 65 72 20 74 6f 20 66 72 65 65 20 74 68 65 20 62  er to free the b
16f40 75 66 66 65 72 20 77 68 65 6e 20 69 74 20 69 73  uffer when it is
16f50 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65  .** no longer re
16f60 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
16f70 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49  c char *explainI
16f80 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65  ndexRange(sqlite
16f90 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
16fa0 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a   *pLoop, Table *
16fb0 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  pTab){.  Index *
16fc0 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
16fd0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
16fe0 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f    u16 nEq = pLoo
16ff0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
17000 20 20 75 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c    u16 nSkip = pL
17010 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  oop->u.btree.nSk
17020 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ip;.  int i, j;.
17030 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d    Column *aCol =
17040 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69   pTab->aCol;.  i
17050 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70  16 *aiColumn = p
17060 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b  Index->aiColumn;
17070 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b  .  StrAccum txt;
17080 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26  ..  if( nEq==0 &
17090 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
170a0 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
170b0 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
170c0 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20  IMIT))==0 ){.   
170d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
170e0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
170f0 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c  Init(&txt, 0, 0,
17100 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
17110 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20  TH);.  txt.db = 
17120 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  db;.  sqlite3Str
17130 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
17140 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f  , " (", 2);.  fo
17150 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b  r(i=0; i<nEq; i+
17160 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  +){.    char *z 
17170 3d 20 28 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b  = (i==pIndex->nK
17180 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64  eyCol ) ? "rowid
17190 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
171a0 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[i]].zName;.   
171b0 20 69 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b   if( i>=nSkip ){
171c0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 41 70  .      explainAp
171d0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
171e0 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d  , z, "=");.    }
171f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
17200 69 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  i ) sqlite3StrAc
17210 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
17220 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20  " AND ", 5);.   
17230 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
17240 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
17250 41 4e 59 28 22 2c 20 34 29 3b 0a 20 20 20 20 20  ANY(", 4);.     
17260 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
17270 41 70 70 65 6e 64 41 6c 6c 28 26 74 78 74 2c 20  AppendAll(&txt, 
17280 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
17290 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
172a0 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20  &txt, ")", 1);. 
172b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20     }.  }..  j = 
172c0 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  i;.  if( pLoop->
172d0 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54  wsFlags&WHERE_BT
172e0 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63  M_LIMIT ){.    c
172f0 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e  har *z = (j==pIn
17300 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f  dex->nKeyCol ) ?
17310 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
17320 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
17330 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
17340 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
17350 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20  i++, z, ">");.  
17360 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
17370 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  sFlags&WHERE_TOP
17380 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68  _LIMIT ){.    ch
17390 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64  ar *z = (j==pInd
173a0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20  ex->nKeyCol ) ? 
173b0 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
173c0 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
173d0 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  e;.    explainAp
173e0 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
173f0 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20  , z, "<");.  }. 
17400 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
17410 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22  Append(&txt, ")"
17420 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 1);.  return s
17430 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
17440 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f  nish(&txt);.}../
17450 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17460 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  on is a no-op un
17470 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70  less currently p
17480 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50  rocessing an EXP
17490 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
174a0 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74  ** command. If t
174b0 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63  he query being c
174c0 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58  ompiled is an EX
174d0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
174e0 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65  , a single.** re
174f0 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f  cord is added to
17500 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64   the output to d
17510 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c  escribe the tabl
17520 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20  e scan strategy 
17530 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a  in .** pLevel..*
17540 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
17550 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
17560 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17580 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
17590 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
175a0 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
175b0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c        /* Table l
175c0 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65  ist this loop re
175d0 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65  fers to */.  Whe
175e0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17600 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50  Scan to write OP
17610 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20  _Explain opcode 
17620 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  for */.  int iLe
17630 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
17640 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
17650 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f  e for "level" co
17660 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
17670 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17690 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
176a0 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f   "from" column o
176b0 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31  f output */.  u1
176c0 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20  6 wctrlFlags    
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
176e0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   Flags passed to
176f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
17700 69 6e 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  in() */.){.#ifnd
17710 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
17720 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
17730 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69  plain==2 ).#endi
17740 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  f.  {.    struct
17750 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
17760 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
17770 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
17780 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  m];.    Vdbe *v 
17790 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
177a0 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e        /* VM bein
177b0 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f  g constructed */
177c0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
177d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
177e0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
177f0 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  andle */.    cha
17800 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20  r *zMsg;        
17810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
17820 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50  xt to add to EQP
17830 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69   output */.    i
17840 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d  nt iId = pParse-
17850 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20  >iSelectId;  /* 
17860 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d  Select id (left-
17870 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75  most output colu
17880 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn) */.    int i
17890 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20  sSearch;        
178a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
178b0 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46   for a SEARCH. F
178c0 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a  alse for SCAN. *
178d0 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  /.    WhereLoop 
178e0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
178f0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72      /* The contr
17900 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  olling WhereLoop
17910 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75   object */.    u
17920 33 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  32 flags;       
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17940 46 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72  Flags that descr
17950 69 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  ibe this loop */
17960 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ..    pLoop = pL
17970 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
17980 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d    flags = pLoop-
17990 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 66  >wsFlags;.    if
179a0 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d  ( (flags&WHERE_M
179b0 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74  ULTI_OR) || (wct
179c0 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e  rlFlags&WHERE_ON
179d0 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72  ETABLE_ONLY) ) r
179e0 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65  eturn;..    isSe
179f0 61 72 63 68 20 3d 20 28 66 6c 61 67 73 26 28 57  arch = (flags&(W
17a00 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
17a10 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
17a20 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
17a30 7c 7c 20 28 28 66 6c 61 67 73 26 57 48 45 52 45  || ((flags&WHERE
17a40 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
17a50 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62  0 && (pLoop->u.b
17a60 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20  tree.nEq>0)).   
17a70 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
17a80 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
17a90 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
17aa0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a  _ORDERBY_MAX));.
17ab0 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
17ac0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
17ad0 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53  %s", isSearch?"S
17ae0 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a  EARCH":"SCAN");.
17af0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
17b00 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
17b10 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
17b20 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
17b30 20 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64   "%s SUBQUERY %d
17b40 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69  ", zMsg,pItem->i
17b50 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d  SelectId);.    }
17b60 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67  else{.      zMsg
17b70 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
17b80 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
17b90 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67   TABLE %s", zMsg
17ba0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
17bb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
17bc0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
17bd0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
17be0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
17bf0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25  , zMsg, "%s AS %
17c00 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
17c10 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a  >zAlias);.    }.
17c20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
17c30 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52   (WHERE_IPK|WHER
17c40 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29  E_VIRTUALTABLE))
17c50 3d 3d 30 0a 20 20 20 20 20 26 26 20 41 4c 57 41  ==0.     && ALWA
17c60 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  YS(pLoop->u.btre
17c70 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a 20 20 20  e.pIndex!=0).   
17c80 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
17c90 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e  zWhere = explain
17ca0 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70  IndexRange(db, p
17cb0 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61  Loop, pItem->pTa
17cc0 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  b);.      zMsg =
17cd0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
17ce0 28 64 62 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  (db, zMsg,.     
17cf0 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
17d00 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
17d10 4e 44 45 58 29 20 3f 20 0a 20 20 20 20 20 20 20  NDEX) ? .       
17d20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20              "%s 
17d30 55 53 49 4e 47 20 41 55 54 4f 4d 41 54 49 43 20  USING AUTOMATIC 
17d40 25 73 49 4e 44 45 58 25 2e 30 73 25 73 22 20 3a  %sINDEX%.0s%s" :
17d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17d60 20 20 20 20 22 25 73 20 55 53 49 4e 47 20 25 73      "%s USING %s
17d70 49 4e 44 45 58 20 25 73 25 73 22 29 2c 20 0a 20  INDEX %s%s"), . 
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d                zM
17d90 73 67 2c 20 28 28 66 6c 61 67 73 20 26 20 57 48  sg, ((flags & WH
17da0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 3f 20  ERE_IDX_ONLY) ? 
17db0 22 43 4f 56 45 52 49 4e 47 20 22 20 3a 20 22 22  "COVERING " : ""
17dc0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
17dd0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
17de0 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  .pIndex->zName, 
17df0 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73  zWhere);.      s
17e00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17e10 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65   zWhere);.    }e
17e20 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
17e30 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26   WHERE_IPK)!=0 &
17e40 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  & (flags & WHERE
17e50 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20  _CONSTRAINT)!=0 
17e60 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
17e70 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
17e80 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
17e90 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
17ea0 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b  ARY KEY", zMsg);
17eb0 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  ..      if( flag
17ec0 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  s&(WHERE_COLUMN_
17ed0 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
17ee0 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IN) ){.        z
17ef0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
17f00 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
17f10 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20  "%s (rowid=?)", 
17f20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
17f30 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48  se if( (flags&WH
17f40 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d  ERE_BOTH_LIMIT)=
17f50 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  =WHERE_BOTH_LIMI
17f60 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  T ){.        zMs
17f70 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17f80 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
17f90 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72  s (rowid>? AND r
17fa0 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
17fb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
17fc0 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d   flags&WHERE_BTM
17fd0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
17fe0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
17ff0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
18000 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29  g, "%s (rowid>?)
18010 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
18020 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
18030 28 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  (flags&WHERE_TOP
18040 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20  _LIMIT) ){.     
18050 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
18060 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
18070 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f  sg, "%s (rowid<?
18080 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
18090 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
180a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
180b0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c  TUALTABLE.    el
180c0 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  se if( (flags & 
180d0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
180e0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
180f0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
18100 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
18110 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42   "%s VIRTUAL TAB
18120 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
18130 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
18140 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
18150 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
18160 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
18170 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Str);.    }.#end
18180 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  if.    zMsg = sq
18190 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
181a0 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d  , zMsg, "%s", zM
181b0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
181c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
181d0 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69  _Explain, iId, i
181e0 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d  Level, iFrom, zM
181f0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
18200 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
18210 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65  efine explainOne
18220 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a  Scan(u,v,w,x,y,z
18230 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
18240 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
18250 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  */.../*.** Gener
18260 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
18270 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
18280 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
18290 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
182a0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
182b0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
182c0 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
182d0 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
182e0 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
182f0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
18300 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
18310 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
18320 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
18330 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
18340 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
18350 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
18360 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
18370 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42   be coded */.  B
18380 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
18390 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
183a0 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
183b0 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
183c0 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
183d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
183e0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
183f0 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
18400 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
18410 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
18420 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
18430 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
18440 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
18450 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
18460 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
18470 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
18480 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
18490 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
184a0 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
184b0 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
184c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
184d0 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
184e0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
184f0 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
18500 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
18510 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
18520 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
18530 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
18540 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  p;    /* The Whe
18550 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65  reLoop object be
18560 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57  ing coded */.  W
18570 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
18580 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
18590 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
185a0 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
185b0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
185c0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
185d0 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
185e0 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
185f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
18620 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
18630 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
18640 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
18650 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18660 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
18690 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20  ared stmt under 
186a0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f  constructions */
186b0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
186c0 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
186d0 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
186e0 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64  e term being cod
186f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
18700 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Brk;            
18710 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
18720 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
18730 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  t of the loop */
18740 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
18750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18760 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
18770 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
18780 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
18790 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d   int iRowidReg =
187a0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f   0;        /* Ro
187b0 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  wid is stored in
187c0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20   this register, 
187d0 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20  if not zero */. 
187e0 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67   int iReleaseReg
187f0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65   = 0;      /* Te
18800 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
18810 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ree before retur
18820 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73  ning */..  pPars
18830 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
18840 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  se;.  v = pParse
18850 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d  ->pVdbe;.  pWC =
18860 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
18870 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
18880 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57  ;.  pLevel = &pW
18890 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b  Info->a[iLevel];
188a0 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
188b0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61  l->pWLoop;.  pTa
188c0 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
188d0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
188e0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
188f0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
18900 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65  iCursor;.  pLeve
18910 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f  l->notReady = no
18920 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73  tReady & ~getMas
18930 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
18940 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52  Set, iCur);.  bR
18950 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65  ev = (pWInfo->re
18960 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31  vMask>>iLevel)&1
18970 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
18980 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
18990 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
189a0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
189b0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
189c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
189d0 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b  FORCE_TABLE)==0;
189e0 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
189f0 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
18a00 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
18a10 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65  ",iLevel,pTabIte
18a20 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
18a30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
18a40 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
18a50 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
18a60 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
18a70 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
18a80 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
18a90 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
18aa0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
18ab0 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
18ac0 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
18ad0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
18ae0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
18af0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
18b00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
18b10 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
18b20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
18b30 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
18b40 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
18b50 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
18b60 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
18b70 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
18b80 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
18b90 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
18ba0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
18bb0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
18bc0 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
18bd0 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
18be0 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
18bf0 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
18c00 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
18c10 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
18c20 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
18c30 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
18c40 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
18c50 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
18c60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18c70 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
18c80 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
18c90 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
18ca0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
18cb0 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
18cc0 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
18cd0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
18ce0 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
18cf0 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
18d00 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
18d10 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
18d20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
18d30 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
18d40 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
18d50 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
18d60 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
18d70 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
18d80 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
18d90 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
18da0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18db0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
18dc0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
18dd0 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
18de0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
18df0 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
18e00 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
18e10 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
18e20 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  se of a FROM cla
18e30 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70  use subquery imp
18e40 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
18e50 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66  -routine */.  if
18e60 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
18e70 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
18e80 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
18e90 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
18ea0 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
18eb0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18ec0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
18ed0 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
18ee0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
18ef0 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  b);.    pLevel->
18f00 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  p2 =  sqlite3Vdb
18f10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
18f20 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61  eld, regYield, a
18f30 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62  ddrBrk);.    Vdb
18f40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18f50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
18f60 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c  , "next row of \
18f70 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d  "%s\"", pTabItem
18f80 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
18f90 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
18fa0 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c  = OP_Goto;.  }el
18fb0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
18fc0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
18fd0 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f  ABLE.  if(  (pLo
18fe0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
18ff0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
19000 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
19010 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c  ase 1:  The tabl
19020 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
19030 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
19040 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
19050 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
19060 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
19070 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
19080 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
19090 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
190a0 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  Filter */.    in
190b0 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a  t addrNotFound;.
190c0 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
190d0 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  int = pLoop->nLT
190e0 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  erm;..    sqlite
190f0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
19100 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67  Parse);.    iReg
19110 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19120 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
19130 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
19140 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
19150 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
19160 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  k;.    for(j=0; 
19170 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
19180 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
19190 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b  Target = iReg+j+
191a0 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  2;.      pTerm =
191b0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
191c0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ];.      if( pTe
191d0 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
191e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
191f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
19200 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
19210 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
19220 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
19230 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
19240 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
19250 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
19260 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
19270 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
19280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19290 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
192a0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
192b0 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
192c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
192d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
192e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
192f0 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  r, pLoop->u.vtab
19300 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  .idxNum, iReg);.
19310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19320 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19330 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ger, nConstraint
19340 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
19350 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19360 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
19370 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75  iCur, addrNotFou
19380 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20  nd, iReg,.      
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
193b0 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
193c0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
193d0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
193e0 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  ee ? P4_MPRINTF 
193f0 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
19400 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
19410 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  );.    pLoop->u.
19420 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
19430 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
19440 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26  j<nConstraint &&
19450 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<16; j++){.   
19460 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75     if( (pLoop->u
19470 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e  .vtab.omitMask>>
19480 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j)&1 ){.        
19490 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
194a0 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  el, pLoop->aLTer
194b0 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m[j]);.      }. 
194c0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
194d0 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
194e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
194f0 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
19500 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
19510 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19520 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
19530 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
19540 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
19550 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
19560 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19570 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
19580 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
19590 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
195a0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
195b0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
195c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
195d0 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f  K)!=0.   && (pLo
195e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
195f0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57  HERE_COLUMN_IN|W
19600 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29  HERE_COLUMN_EQ))
19610 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
19620 43 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20  Case 2:  We can 
19630 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
19640 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
19650 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
19660 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74           equalit
19670 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
19680 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
19690 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a  ield.  Or.    **
196a0 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
196b0 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
196c0 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
196d0 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
196e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
196f0 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a  nstruct..    */.
19700 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
19710 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  p->u.btree.nEq==
19720 31 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  1 );.    pTerm =
19730 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
19740 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
19750 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
19760 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
19770 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  xpr!=0 );.    as
19780 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
19790 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
197a0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
197b0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
197c0 4c 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73  L );.    iReleas
197d0 65 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eReg = ++pParse-
197e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69  >nMem;.    iRowi
197f0 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c  dReg = codeEqual
19800 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
19810 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30  pTerm, pLevel, 0
19820 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65  , bRev, iRelease
19830 52 65 67 29 3b 0a 20 20 20 20 69 66 28 20 69 52  Reg);.    if( iR
19840 6f 77 69 64 52 65 67 21 3d 69 52 65 6c 65 61 73  owidReg!=iReleas
19850 65 52 65 67 20 29 20 73 71 6c 69 74 65 33 52 65  eReg ) sqlite3Re
19860 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19870 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67  rse, iReleaseReg
19880 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d  );.    addrNxt =
19890 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
198a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
198b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
198c0 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52  stBeInt, iRowidR
198d0 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 20 56 64  eg, addrNxt); Vd
198e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
198f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19900 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
19910 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72  ists, iCur, addr
19920 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Nxt, iRowidReg);
19930 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
19940 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
19950 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
19960 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
19970 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a   iRowidReg, 1);.
19980 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19990 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
199a0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
199b0 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65  idReg);.    Vdbe
199c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
199d0 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
199e0 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
199f0 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70  }else if( (pLoop
19a00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
19a10 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20  E_IPK)!=0.      
19a20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
19a30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
19a40 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20  LUMN_RANGE)!=0. 
19a50 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
19a60 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69  3:  We have an i
19a70 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72  nequality compar
19a80 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
19a90 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20   ROWID field..  
19aa0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73    */.    int tes
19ab0 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
19ac0 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
19ad0 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75    int memEndValu
19ae0 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65  e = 0;.    Where
19af0 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
19b00 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  End;..    assert
19b10 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
19b20 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
19b30 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d   pStart = pEnd =
19b40 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   0;.    if( pLoo
19b50 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
19b60 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70  RE_BTM_LIMIT ) p
19b70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61  Start = pLoop->a
19b80 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
19b90 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
19ba0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
19bb0 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c  IMIT ) pEnd = pL
19bc0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
19bd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
19be0 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21  tart!=0 || pEnd!
19bf0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52  =0 );.    if( bR
19c00 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  ev ){.      pTer
19c10 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20  m = pStart;.    
19c20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b    pStart = pEnd;
19c30 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54  .      pEnd = pT
19c40 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  erm;.    }.    i
19c50 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
19c60 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
19c70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19c80 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
19c90 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72  defines the star
19ca0 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  t bound */.     
19cb0 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20   int r1, rTemp; 
19cc0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
19cd0 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ers for holding 
19ce0 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61  the start bounda
19cf0 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ry */..      /* 
19d00 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
19d10 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78  nstant maps TK_x
19d20 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72  x codes into cor
19d30 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20  responding .    
19d40 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65    ** seek opcode
19d50 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f  s.  It depends o
19d60 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f  n a particular o
19d70 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78  rdering of TK_xx
19d80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19d90 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70  const u8 aMoveOp
19da0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
19db0 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f    /* TK_GT */  O
19dc0 50 5f 53 65 65 6b 47 54 2c 0a 20 20 20 20 20 20  P_SeekGT,.      
19dd0 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f       /* TK_LE */
19de0 20 20 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20    OP_SeekLE,.   
19df0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54          /* TK_LT
19e00 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a   */  OP_SeekLT,.
19e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
19e20 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GE */  OP_SeekG
19e30 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  E.      };.     
19e40 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
19e50 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20  TK_GT+1 );      
19e60 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
19e70 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20   ordering.. */. 
19e80 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
19e90 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20  LT==TK_GT+2 );  
19ea0 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74      /*  ... of t
19eb0 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e  he TK_xx values.
19ec0 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
19ed0 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54  rt( TK_GE==TK_GT
19ee0 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +3 );      /*  .
19ef0 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20  .. is correcct. 
19f00 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
19f10 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  ( (pStart->wtFla
19f20 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
19f30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
19f40 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77  tcase( pStart->w
19f50 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
19f60 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70  RTUAL );.      p
19f70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70  X = pStart->pExp
19f80 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
19f90 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
19fa0 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74  testcase( pStart
19fb0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
19fc0 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74  ur ); /* transit
19fd0 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
19fe0 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  */.      r1 = sq
19ff0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1a000 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
1a010 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
1a020 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a030 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f  AddOp3(v, aMoveO
1a040 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c  p[pX->op-TK_GT],
1a050 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
1a060 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1a070 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1a080 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1a090 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f  erageIf(v, pX->o
1a0a0 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20  p==TK_GT);.     
1a0b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1a0c0 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  v, pX->op==TK_LE
1a0d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1a0e0 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f  erageIf(v, pX->o
1a0f0 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
1a100 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1a110 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45  v, pX->op==TK_GE
1a120 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a130 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1a140 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1a150 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  r1, 1);.      sq
1a160 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a170 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d  Reg(pParse, rTem
1a180 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  p);.      disabl
1a190 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
1a1a0 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tart);.    }else
1a1b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1a1c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
1a1d0 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
1a1e0 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
1a1f0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56  ddrBrk);.      V
1a200 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1a210 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20   bRev==0);.     
1a220 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1a230 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20  v, bRev!=0);.   
1a240 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20   }.    if( pEnd 
1a250 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1a260 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45  X;.      pX = pE
1a270 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nd->pExpr;.     
1a280 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1a290 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a2a0 28 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  (pEnd->wtFlags &
1a2b0 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
1a2c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a2d0 65 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72  e( pEnd->leftCur
1a2e0 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20  sor!=iCur ); /* 
1a2f0 54 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74  Transitive const
1a300 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
1a310 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e  testcase( pEnd->
1a320 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1a330 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
1a340 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b  memEndValue = ++
1a350 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a360 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a370 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
1a380 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61  pRight, memEndVa
1a390 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lue);.      if( 
1a3a0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
1a3b0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
1a3c0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1a3d0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20   = bRev ? OP_Le 
1a3e0 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d  : OP_Ge;.      }
1a3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
1a400 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
1a410 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20  _Lt : OP_Gt;.   
1a420 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62     }.      disab
1a430 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1a440 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  End);.    }.    
1a450 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
1a460 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1a470 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1a480 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
1a490 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
1a4a0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1a4b0 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
1a4c0 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
1a4d0 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1a4e0 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >p5==0 );.    if
1a4f0 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
1a500 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  p ){.      iRowi
1a510 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  dReg = ++pParse-
1a520 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1a530 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a540 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72  , OP_Rowid, iCur
1a550 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1a560 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a570 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
1a580 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
1a590 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1a5a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a5b0 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e  v, testOp, memEn
1a5c0 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c  dValue, addrBrk,
1a5d0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1a5e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1a5f0 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f  f(v, testOp==OP_
1a600 4c 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Le);.      VdbeC
1a610 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73  overageIf(v, tes
1a620 74 4f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  tOp==OP_Lt);.   
1a630 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1a640 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f  f(v, testOp==OP_
1a650 47 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ge);.      VdbeC
1a660 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73  overageIf(v, tes
1a670 74 4f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  tOp==OP_Gt);.   
1a680 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1a690 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
1a6a0 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53  _AFF_NUMERIC | S
1a6b0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1a6c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1a6d0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1a6e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
1a6f0 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  XED ){.    /* Ca
1a700 73 65 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69  se 4: A scan usi
1a710 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20  ng an index..   
1a720 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1a730 20 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61     The WHERE cla
1a740 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  use may contain 
1a750 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75  zero or more equ
1a760 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20  ality .    **   
1a770 20 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d        terms ("==
1a780 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74  " or "IN" operat
1a790 6f 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20  ors) that refer 
1a7a0 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20  to the N.    ** 
1a7b0 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73          left-mos
1a7c0 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  t columns of the
1a7d0 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61   index. It may a
1a7e0 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  lso contain.    
1a7f0 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75  **         inequ
1a800 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1a810 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c  s (>, <, >= or <
1a820 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65  =) on the indexe
1a830 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  d.    **        
1a840 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d   column that imm
1a850 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73  ediately follows
1a860 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65   the N equalitie
1a870 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20  s. Only .    ** 
1a880 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
1a890 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61  t-most column ca
1a8a0 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  n be an inequali
1a8b0 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75  ty - the rest mu
1a8c0 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  st.    **       
1a8d0 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61    use the "==" a
1a8e0 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  nd "IN" operator
1a8f0 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
1a900 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20  if the .    **  
1a910 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20         index is 
1a920 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e  on (x,y,z), then
1a930 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1a940 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a  lauses are all .
1a950 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f      **         o
1a960 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a  ptimized:.    **
1a970 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a980 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20     x=5.    **   
1a990 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1a9a0 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y=10.    **    
1a9b0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1a9c0 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
1a9d0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1a9e0 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  >5 AND y<10.    
1a9f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1aa00 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c  5 AND y=5 AND z<
1aa10 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  =10.    **.    *
1aa20 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c  *         The z<
1aa30 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  10 term of the f
1aa40 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20  ollowing cannot 
1aa50 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20  be used, only.  
1aa60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
1aa70 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a   x=5 term:.    *
1aa80 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1aa90 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30      x=5 AND z<10
1aaa0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1aab0 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20         N may be 
1aac0 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
1aad0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
1aae0 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a  straints..    **
1aaf0 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72           If ther
1ab00 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c  e are no inequal
1ab10 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
1ab20 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20   then N is at.  
1ab30 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61    **         lea
1ab40 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20  st one..    **. 
1ab50 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
1ab60 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20  is case is also 
1ab70 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  used when there 
1ab80 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
1ab90 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  use.    **      
1aba0 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62     constraints b
1abb0 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ut an index is s
1abc0 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20  elected anyway, 
1abd0 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20  in order.    ** 
1abe0 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65          to force
1abf0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65   the output orde
1ac00 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20  r to conform to 
1ac10 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20  an ORDER BY..   
1ac20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63   */  .    static
1ac30 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74   const u8 aStart
1ac40 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30  Op[] = {.      0
1ac50 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  ,.      0,.     
1ac60 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
1ac70 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74        /* 2: (!st
1ac80 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1ac90 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21  && startEq &&  !
1aca0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1acb0 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20  P_Last,         
1acc0 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72      /* 3: (!star
1acd0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
1ace0 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52   startEq &&   bR
1acf0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1ad00 53 65 65 6b 47 54 2c 20 20 20 20 20 20 20 20 20  SeekGT,         
1ad10 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63    /* 4: (start_c
1ad20 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21  onstraints  && !
1ad30 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
1ad40 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1ad50 65 6b 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20  ekLT,           
1ad60 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 5: (start_con
1ad70 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
1ad80 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
1ad90 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1ada0 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  GE,           /*
1adb0 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   6: (start_const
1adc0 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
1add0 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
1ade0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45  .      OP_SeekLE
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37              /* 7
1ae00 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1ae10 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
1ae20 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
1ae30 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63     };.    static
1ae40 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70   const u8 aEndOp
1ae50 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f  [] = {.      OP_
1ae60 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20  IdxGE,          
1ae70 20 20 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e    /* 0: (end_con
1ae80 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65  straints && !bRe
1ae90 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a  v && !endEq) */.
1aea0 20 20 20 20 20 20 4f 50 5f 49 64 78 47 54 2c 20        OP_IdxGT, 
1aeb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a             /* 1:
1aec0 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
1aed0 73 20 26 26 20 21 62 52 65 76 20 26 26 20 20 65  s && !bRev &&  e
1aee0 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ndEq) */.      O
1aef0 50 5f 49 64 78 4c 45 2c 20 20 20 20 20 20 20 20  P_IdxLE,        
1af00 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63      /* 2: (end_c
1af10 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 20 62  onstraints &&  b
1af20 52 65 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a  Rev && !endEq) *
1af30 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
1af40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1af50 33 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  3: (end_constrai
1af60 6e 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20  nts &&  bRev && 
1af70 20 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d   endEq) */.    }
1af80 3b 0a 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20  ;.    u16 nEq = 
1af90 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1afa0 45 71 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  Eq;     /* Numbe
1afb0 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65  r of == or IN te
1afc0 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  rms */.    int r
1afd0 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
1afe0 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
1aff0 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
1b000 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
1b010 65 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  es */.    WhereT
1b020 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74  erm *pRangeStart
1b030 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61   = 0;  /* Inequa
1b040 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1b050 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a  at range start *
1b060 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
1b070 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20  *pRangeEnd = 0; 
1b080 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79     /* Inequality
1b090 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
1b0a0 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  ange end */.    
1b0b0 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20  int startEq;    
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b0d0 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74  True if range st
1b0e0 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  art uses ==, >= 
1b0f0 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
1b100 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20   endEq;         
1b110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1b120 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75  e if range end u
1b130 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
1b140 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
1b150 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20  t_constraints;  
1b160 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
1b170 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72   range is constr
1b180 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ained */.    int
1b190 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20   nConstraint;   
1b1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b1b0 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ber of constrain
1b1c0 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49  t terms */.    I
1b1d0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b1f0 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c  he index we will
1b200 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20   be using */.   
1b210 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20   int iIdxCur;   
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b230 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
1b240 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
1b250 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  /.    int nExtra
1b260 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
1b270 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b280 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
1b290 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e  needed */.    in
1b2a0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1b2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1b2c0 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65  struction opcode
1b2d0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
1b2e0 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20  tartAff;        
1b2f0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
1b300 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61   for start of ra
1b310 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
1b320 2f 0a 20 20 20 20 63 68 61 72 20 63 45 6e 64 41  /.    char cEndA
1b330 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
1b340 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
1b350 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20  or end of range 
1b360 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1b370 20 20 75 38 20 62 53 65 65 6b 50 61 73 74 4e 75    u8 bSeekPastNu
1b380 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ll = 0;        /
1b390 2a 20 54 72 75 65 20 74 6f 20 73 65 65 6b 20 70  * True to seek p
1b3a0 61 73 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c  ast initial null
1b3b0 73 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 74 6f  s */.    u8 bSto
1b3c0 70 41 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20  pAtNull = 0;    
1b3d0 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e        /* Add con
1b3e0 64 69 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e  dition to termin
1b3f0 61 74 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a  ate at NULLs */.
1b400 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  .    pIdx = pLoo
1b410 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1b420 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
1b430 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1b440 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  ;.    assert( nE
1b450 71 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  q>=pLoop->u.btre
1b460 65 2e 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20 20  e.nSkip );..    
1b470 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20  /* If this loop 
1b480 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74  satisfies a sort
1b490 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79   order (pOrderBy
1b4a0 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a  ) request that .
1b4b0 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65      ** was passe
1b4c0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1b4d0 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  on to implement 
1b4e0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
1b4f0 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75   ..." .    ** qu
1b500 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ery, then the ca
1b510 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61  ller will only a
1b520 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f  llow the loop to
1b530 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20   run for.    ** 
1b540 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69  a single iterati
1b550 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  on. This means t
1b560 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  hat the first ro
1b570 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a  w returned.    *
1b580 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  * should not hav
1b590 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73  e a NULL value s
1b5a0 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66  tored in 'x'. If
1b5b0 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20   column 'x' is. 
1b5c0 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
1b5d0 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45  one after the nE
1b5e0 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  q equality const
1b5f0 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  raints in the in
1b600 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73  dex,.    ** this
1b610 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73   requires some s
1b620 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
1b630 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1b640 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  rt( pWInfo->pOrd
1b650 65 72 42 79 3d 3d 30 0a 20 20 20 20 20 20 20 20  erBy==0.        
1b660 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64   || pWInfo->pOrd
1b670 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a 20  erBy->nExpr==1. 
1b680 20 20 20 20 20 20 20 20 7c 7c 20 28 70 57 49 6e          || (pWIn
1b690 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57  fo->wctrlFlags&W
1b6a0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1b6b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
1b6c0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1b6d0 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1b6e0 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26  Y_MIN)!=0.     &
1b6f0 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  & pWInfo->nOBSat
1b700 3e 30 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  >0.     && (pIdx
1b710 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a 20  ->nKeyCol>nEq). 
1b720 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
1b730 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  rt( pLoop->u.btr
1b740 65 65 2e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20  ee.nSkip==0 );. 
1b750 20 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75       bSeekPastNu
1b760 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ll = 1;.      nE
1b770 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1b780 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
1b790 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
1b7a0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1b7b0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
1b7c0 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
1b7d0 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
1b7e0 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b   */.    j = nEq;
1b7f0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1b800 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b810 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1b820 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
1b830 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1b840 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  ++];.      nExtr
1b850 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1b860 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1b870 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1b880 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1b890 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c    pRangeEnd = pL
1b8a0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1b8b0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1b8c0 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  g = 1;.      if(
1b8d0 20 70 52 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a   pRangeStart==0.
1b8e0 20 20 20 20 20 20 20 26 26 20 28 6a 20 3d 20 70         && (j = p
1b8f0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
1b900 71 5d 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  q])>=0 .       &
1b910 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  & pIdx->pTable->
1b920 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
1b930 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
1b940 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c      bSeekPastNul
1b950 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 1;.      }. 
1b960 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1b970 20 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c   pRangeEnd==0 ||
1b980 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
1b990 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
1b9a0 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  L)==0 );..    /*
1b9b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b9c0 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63  o evaluate all c
1b9d0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1b9e0 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20  using == or IN. 
1b9f0 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20     ** and store 
1ba00 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
1ba10 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20  ose terms in an 
1ba20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
1ba30 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
1ba40 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20  ng at regBase.. 
1ba50 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73     */.    regBas
1ba60 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  e = codeAllEqual
1ba70 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
1ba80 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74  pLevel,bRev,nExt
1ba90 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66  raReg,&zStartAff
1baa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  );.    assert( z
1bab0 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73  StartAff==0 || s
1bac0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1bad0 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29  StartAff)>=nEq )
1bae0 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72 74  ;.    if( zStart
1baf0 41 66 66 20 29 20 63 45 6e 64 41 66 66 20 3d 20  Aff ) cEndAff = 
1bb00 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a  zStartAff[nEq];.
1bb10 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1bb20 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a  evel->addrNxt;..
1bb30 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1bb40 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
1bb50 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
1bb60 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
1bb70 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
1bb80 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
1bb90 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
1bba0 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
1bbb0 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
1bbc0 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
1bbd0 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
1bbe0 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
1bbf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bc00 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79   (nEq<pIdx->nKey
1bc10 43 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49  Col && bRev==(pI
1bc20 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
1bc30 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
1bc40 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52  SC)).     || (bR
1bc50 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79  ev && pIdx->nKey
1bc60 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b  Col==nEq).    ){
1bc70 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
1bc80 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
1bc90 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
1bca0 3b 0a 20 20 20 20 20 20 53 57 41 50 28 75 38 2c  ;.      SWAP(u8,
1bcb0 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20   bSeekPastNull, 
1bcc0 62 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20  bStopAtNull);.  
1bcd0 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73    }..    testcas
1bce0 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
1bcf0 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  & (pRangeStart->
1bd00 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
1bd10 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  E)!=0 );.    tes
1bd20 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
1bd30 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61  rt && (pRangeSta
1bd40 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1bd50 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_GE)!=0 );.   
1bd60 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1bd70 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45  eEnd && (pRangeE
1bd80 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
1bd90 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_LE)!=0 );.   
1bda0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1bdb0 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45  eEnd && (pRangeE
1bdc0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
1bdd0 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20  WO_GE)!=0 );.   
1bde0 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e   startEq = !pRan
1bdf0 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67  geStart || pRang
1be00 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
1be10 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
1be20 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20  );.    endEq =  
1be30 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
1be40 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
1be50 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
1be60 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63  GE);.    start_c
1be70 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61  onstraints = pRa
1be80 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e  ngeStart || nEq>
1be90 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  0;..    /* Seek 
1bea0 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
1beb0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
1bec0 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
1bed0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
1bee0 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
1bef0 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20  angeStart ){.   
1bf00 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
1bf10 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70  = pRangeStart->p
1bf20 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
1bf30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1bf40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
1bf50 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
1bf60 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
1bf70 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
1bf80 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1bf90 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  =0.       && sql
1bfa0 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
1bfb0 6c 28 70 52 69 67 68 74 29 0a 20 20 20 20 20 20  l(pRight).      
1bfc0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bfd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bfe0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61  OP_IsNull, regBa
1bff0 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
1c000 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
1c010 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1c020 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74   }.      if( zSt
1c030 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20  artAff ){.      
1c040 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
1c050 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
1c060 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
1c070 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
1c080 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
1c090 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
1c0a0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
1c0b0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
1c0c0 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
1c0d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
1c0e0 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
1c0f0 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
1c100 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
1c110 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
1c120 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
1c130 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
1c140 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
1c150 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
1c160 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
1c170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1c180 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
1c190 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
1c1a0 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61  nge(pRight, zSta
1c1b0 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  rtAff[nEq]) ){. 
1c1c0 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
1c1d0 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
1c1e0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
1c1f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
1c200 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
1c210 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
1c220 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se( pRangeStart-
1c230 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1c240 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d  VIRTUAL );.    }
1c250 65 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50 61  else if( bSeekPa
1c260 73 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  stNull ){.      
1c270 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c280 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1c290 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1c2a0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
1c2b0 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
1c2c0 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
1c2d0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
1c2e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
1c2f0 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1c300 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
1c310 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62   nConstraint - b
1c320 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53  SeekPastNull, zS
1c330 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70  tartAff);.    op
1c340 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61   = aStartOp[(sta
1c350 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c  rt_constraints<<
1c360 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31  2) + (startEq<<1
1c370 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61  ) + bRev];.    a
1c380 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
1c390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c3a0 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
1c3b0 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
1c3c0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1c3d0 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 56 64 62  traint);.    Vdb
1c3e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1c3f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1c400 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  (v, op==OP_Rewin
1c410 64 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  d);  testcase( o
1c420 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a  p==OP_Rewind );.
1c430 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1c440 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73  If(v, op==OP_Las
1c450 74 29 3b 20 20 20 20 74 65 73 74 63 61 73 65 28  t);    testcase(
1c460 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
1c470 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1c480 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
1c490 6b 47 54 29 3b 20 20 74 65 73 74 63 61 73 65 28  kGT);  testcase(
1c4a0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29   op==OP_SeekGT )
1c4b0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1c4c0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
1c4d0 65 65 6b 47 45 29 3b 20 20 74 65 73 74 63 61 73  eekGE);  testcas
1c4e0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45  e( op==OP_SeekGE
1c4f0 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65   );.    VdbeCove
1c500 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1c510 5f 53 65 65 6b 4c 45 29 3b 20 20 74 65 73 74 63  _SeekLE);  testc
1c520 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
1c530 4c 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  LE );.    VdbeCo
1c540 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1c550 4f 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65 73  OP_SeekLT);  tes
1c560 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
1c570 65 6b 4c 54 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ekLT );..    /* 
1c580 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66  Load the value f
1c590 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74  or the inequalit
1c5a0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1c5b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
1c5c0 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20     ** range (if 
1c5d0 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  any)..    */.   
1c5e0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
1c5f0 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
1c600 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45  geEnd ){.      E
1c610 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
1c620 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e  angeEnd->pExpr->
1c630 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
1c640 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1c650 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  move(pParse, reg
1c660 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20  Base+nEq, 1);.  
1c670 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c680 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
1c690 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
1c6a0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
1c6b0 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
1c6c0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1c6d0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
1c6e0 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
1c6f0 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b  pRight).      ){
1c700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c710 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c720 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65  _IsNull, regBase
1c730 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
1c740 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1c750 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
1c760 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1c770 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1c780 79 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66  y(pRight, cEndAf
1c790 66 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f)!=SQLITE_AFF_N
1c7a0 4f 4e 45 0a 20 20 20 20 20 20 20 26 26 20 21 73  ONE.       && !s
1c7b0 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
1c7c0 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
1c7d0 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29  pRight, cEndAff)
1c7e0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1c7f0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
1c800 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
1c810 61 73 65 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e  ase+nEq, 1, &cEn
1c820 64 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dAff);.      }. 
1c830 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
1c840 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
1c850 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77  se( pRangeEnd->w
1c860 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1c870 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c  RTUAL );.    }el
1c880 73 65 20 69 66 28 20 62 53 74 6f 70 41 74 4e 75  se if( bStopAtNu
1c890 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
1c8a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c8b0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
1c8c0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
1c8d0 20 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20 20   endEq = 0;.    
1c8e0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1c8f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1c900 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
1c910 61 72 74 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a  artAff);..    /*
1c920 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
1c930 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
1c940 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
1c950 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1c960 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
1c970 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
1c980 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
1c990 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
1c9a0 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  nge. */.    if( 
1c9b0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  nConstraint ){. 
1c9c0 20 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70       op = aEndOp
1c9d0 5b 62 52 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d  [bRev*2 + endEq]
1c9e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1c9f0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1ca00 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
1ca10 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
1ca20 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
1ca30 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ca40 3d 4f 50 5f 49 64 78 47 54 20 29 3b 20 20 56 64  =OP_IdxGT );  Vd
1ca50 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ca60 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a  op==OP_IdxGT );.
1ca70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ca80 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20  op==OP_IdxGE ); 
1ca90 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1caa0 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20  v, op==OP_IdxGE 
1cab0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1cac0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
1cad0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
1cae0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
1caf0 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
1cb00 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
1cb10 4c 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LE );  VdbeCover
1cb20 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1cb30 49 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a  IdxLE );.    }..
1cb40 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
1cb50 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
1cb60 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
1cb70 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1cb80 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
1cb90 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  );.    disableTe
1cba0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
1cbb0 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 6f  eEnd);.    if( o
1cbc0 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
1cbd0 20 20 2f 2a 20 70 49 64 78 20 69 73 20 61 20 63    /* pIdx is a c
1cbe0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
1cbf0 4e 6f 20 6e 65 65 64 20 74 6f 20 61 63 63 65 73  No need to acces
1cc00 73 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  s the main table
1cc10 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  . */.    }else i
1cc20 66 28 20 48 61 73 52 6f 77 69 64 28 70 49 64 78  f( HasRowid(pIdx
1cc30 2d 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  ->pTable) ){.   
1cc40 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b     iRowidReg = +
1cc50 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cc60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cc70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
1cc80 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
1cc90 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1cca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ccb0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1ccc0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1ccd0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1cce0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ccf0 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
1cd00 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
1cd10 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
1cd20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cd30 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
1cd40 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1cd50 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62  Index(pIdx->pTab
1cd60 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69  le);.      iRowi
1cd70 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  dReg = sqlite3Ge
1cd80 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1cd90 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29  e, pPk->nKeyCol)
1cda0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1cdb0 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   j<pPk->nKeyCol;
1cdc0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b   j++){.        k
1cdd0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
1cde0 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50  OfIndex(pIdx, pP
1cdf0 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b  k->aiColumn[j]);
1ce00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ce10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ce20 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
1ce30 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a  , k, iRowidReg+j
1ce40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ce50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ce60 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
1ce70 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  ound, iCur, addr
1ce80 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cont,.          
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cea0 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d   iRowidReg, pPk-
1ceb0 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43  >nKeyCol); VdbeC
1cec0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1ced0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  }..    /* Record
1cee0 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1cef0 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
1cf00 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73  te the loop. Dis
1cf10 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45  able .    ** WHE
1cf20 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
1cf30 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62  made redundant b
1cf40 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67  y the index rang
1cf50 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e scan..    */. 
1cf60 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1cf70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
1cf80 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c  EROW ){.      pL
1cf90 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
1cfa0 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  op;.    }else if
1cfb0 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
1cfc0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1cfd0 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Prev;.    }else{
1cfe0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1cff0 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
1d000 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70   }.    pLevel->p
1d010 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
1d020 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28 70   pLevel->p3 = (p
1d030 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1d040 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29 21  ERE_UNQ_WANTED)!
1d050 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69 66  =0 ? 1:0;.    if
1d060 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1d070 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
1d080 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AINT)==0 ){.    
1d090 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
1d0a0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
1d0b0 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
1d0c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d0d0 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1d0e0 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  >p5==0 );.    }.
1d0f0 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
1d100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
1d110 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
1d120 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1d130 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
1d140 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  OR ){.    /* Cas
1d150 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72  e 5:  Two or mor
1d160 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64  e separately ind
1d170 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
1d180 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a  cted by OR.    *
1d190 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
1d1a0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1d1b0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1d1c0 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20  1(a,b,c,d);.    
1d1d0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
1d1e0 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20  X i1 ON t1(a);. 
1d1f0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
1d200 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29  NDEX i2 ON t1(b)
1d210 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
1d220 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31  E INDEX i3 ON t1
1d230 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  (c);.    **.    
1d240 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
1d250 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
1d260 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20  OR b=7 OR (c=11 
1d270 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a  AND d=13).    **
1d280 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65  .    ** In the e
1d290 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72  xample, there ar
1d2a0 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20  e three indexed 
1d2b0 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
1d2c0 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68  by OR..    ** Th
1d2d0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
1d2e0 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  p looks like thi
1d2f0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1d300 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
1d310 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
1d320 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
1d330 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
1d340 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1d350 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e  hen, for each in
1d360 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20  dexed term, the 
1d370 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61  following. The a
1d380 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20  rguments to.    
1d390 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72  ** RowSetTest ar
1d3a0 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  e such that the 
1d3b0 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72  rowid of the cur
1d3c0 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65  rent row is inse
1d3d0 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  rted.    ** into
1d3e0 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20   the RowSet. If 
1d3f0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  it is already pr
1d400 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73  esent, control s
1d410 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  kips the.    ** 
1d420 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64  Gosub opcode and
1d430 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20   jumps straight 
1d440 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
1d450 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e  rated by WhereEn
1d460 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  d()..    **.    
1d470 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
1d480 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72  3WhereBegin(<ter
1d490 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  m>).    **      
1d4a0 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20      RowSetTest  
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4c0 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69  # Insert rowid i
1d4d0 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a  nto rowset.    *
1d4e0 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  *          Gosub
1d4f0 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a        2 A.    **
1d500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1d510 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a  hereEnd().    **
1d520 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e  .    ** Followin
1d530 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64  g the above, cod
1d540 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  e to terminate t
1d550 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41  he loop. Label A
1d560 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20  , the target.   
1d570 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62   ** of the Gosub
1d580 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f   above, jumps to
1d590 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1d5a0 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
1d5b0 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20   Goto..    **.  
1d5c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
1d5d0 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
1d5e0 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
1d5f0 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
1d600 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  eg 1.    **     
1d610 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20       Goto       
1d620 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
1d630 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66   # The loop is f
1d640 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a  inished..    **.
1d650 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20      **       A: 
1d660 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20  <loop body>     
1d670 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65              # Re
1d680 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65  turn data, whate
1d690 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ver..    **.    
1d6a0 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75  **          Retu
1d6b0 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20  rn     2        
1d6c0 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62          # Jump b
1d6d0 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62  ack to the Gosub
1d6e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d6f0 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74       B: <after t
1d700 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a  he loop>.    **.
1d710 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65      */.    Where
1d720 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
1d730 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75    /* The OR-clau
1d740 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  se broken out in
1d750 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
1d760 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54     SrcList *pOrT
1d770 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f  ab;       /* Sho
1d780 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73  rtened table lis
1d790 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67  t or OR-clause g
1d7a0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
1d7b0 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30   Index *pCov = 0
1d7c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d7d0 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72   Potential cover
1d7e0 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55  ing index (or NU
1d7f0 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  LL) */.    int i
1d800 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d  CovCur = pParse-
1d810 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72  >nTab++;  /* Cur
1d820 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64  sor used for ind
1d830 65 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79  ex scans (if any
1d840 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65  ) */..    int re
1d850 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
1d860 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20  se->nMem;       
1d870 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1d880 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73  used with OP_Gos
1d890 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ub */.    int re
1d8a0 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20  gRowset = 0;    
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1d8d0 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  for RowSet objec
1d8e0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  t */.    int reg
1d8f0 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d910 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
1d920 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a  olding rowid */.
1d930 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64      int iLoopBod
1d940 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  y = sqlite3VdbeM
1d950 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
1d960 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62   Start of loop b
1d970 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ody */.    int i
1d980 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20  RetInit;        
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9a0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1d9b0 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69  of regReturn ini
1d9c0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74  t */.    int unt
1d9d0 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20  estedTerms = 0; 
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d9f0 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f  ome terms not co
1da00 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20  mpletely tested 
1da10 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1da40 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1da50 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20   Expr *pAndExpr 
1da60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1da70 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e      /* An ".. AN
1da80 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  D (...)" express
1da90 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70  ion */.   .    p
1daa0 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
1dab0 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73  Term[0];.    ass
1dac0 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
1dad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1dae0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1daf0 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73  WO_OR );.    ass
1db00 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
1db10 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
1db20 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f  FO)!=0 );.    pO
1db30 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWc = &pTerm->u.
1db40 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
1db50 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1db60 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65  _Return;.    pLe
1db70 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74  vel->p1 = regRet
1db80 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  urn;..    /* Set
1db90 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73   up a new SrcLis
1dba0 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74  t in pOrTab cont
1dbb0 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
1dbc0 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20   being scanned. 
1dbd0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f     ** by this lo
1dbe0 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73  op in the a[0] s
1dbf0 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52  lot and all notR
1dc00 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61  eady tables in a
1dc10 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20  [1..] slots..   
1dc20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73   ** This becomes
1dc30 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20   the SrcList in 
1dc40 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
1dc50 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
1dc60 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a  reBegin()..    *
1dc70 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  /.    if( pWInfo
1dc80 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20  ->nLevel>1 ){.  
1dc90 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64      int nNotRead
1dca0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1dcb0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
1dcc0 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62   of notReady tab
1dcd0 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  les */.      str
1dce0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1dcf0 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f   *origSrc;     /
1dd00 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  * Original list 
1dd10 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  of tables */.   
1dd20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70     nNotReady = p
1dd30 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20  WInfo->nLevel - 
1dd40 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20  iLevel - 1;.    
1dd50 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74    pOrTab = sqlit
1dd60 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
1dd70 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b  sizeof(*pOrTab)+
1dda0 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f   nNotReady*sizeo
1ddb0 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29  f(pOrTab->a[0]))
1ddc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
1ddd0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e  ab==0 ) return n
1dde0 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70  otReady;.      p
1ddf0 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  OrTab->nAlloc = 
1de00 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  (u8)(nNotReady +
1de10 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
1de20 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
1de30 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
1de40 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
1de50 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
1de60 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
1de70 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
1de80 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1de90 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
1dea0 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
1deb0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1dec0 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
1ded0 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
1dee0 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
1def0 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
1df00 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
1df10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1df20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
1df30 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
1df40 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
1df50 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
1df60 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
1df70 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
1df80 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
1df90 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
1dfa0 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
1dfb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
1dfc0 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
1dfd0 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
1dfe0 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
1dff0 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
1e000 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
1e010 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1e020 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
1e030 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
1e040 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
1e050 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
1e060 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
1e070 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
1e080 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
1e090 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
1e0a0 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
1e0b0 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
1e0c0 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
1e0d0 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
1e0e0 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
1e0f0 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
1e100 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
1e110 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
1e120 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
1e130 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
1e140 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
1e150 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
1e160 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
1e170 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
1e180 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
1e190 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
1e1a0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1e1b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1e1c0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
1e1d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67  ==0 ){.      reg
1e1e0 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
1e1f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
1e200 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
1e210 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1e220 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e230 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1e240 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20   regRowset);.   
1e250 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20   }.    iRetInit 
1e260 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1e270 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1e280 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29  r, 0, regReturn)
1e290 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1e2a0 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1e2b0 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74  clause is z of t
1e2c0 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52  he form:  (x1 OR
1e2d0 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20   x2 OR ...) AND 
1e2e0 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f  y.    ** Then fo
1e2f0 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c  r every term xN,
1e300 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65   evaluate as the
1e310 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20   subexpression: 
1e320 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20  xN AND z.    ** 
1e330 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20  That way, terms 
1e340 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61  in y that are fa
1e350 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20  ctored into the 
1e360 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  disjunction will
1e370 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65  .    ** be picke
1e380 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75  d up by the recu
1e390 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73  rsive calls to s
1e3a0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1e3b0 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  () below..    **
1e3c0 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  .    ** Actually
1e3d0 2c 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  , each subexpres
1e3e0 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65  sion is converte
1e3f0 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20  d to "xN AND w" 
1e400 77 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a  where w is.    *
1e410 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69  * the "interesti
1e420 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d  ng" terms of z -
1e430 20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20   terms that did 
1e440 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
1e450 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f   the.    ** ON o
1e460 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
1e470 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
1e480 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  nd terms that ar
1e490 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20  e usable as .   
1e4a0 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20   ** indices..   
1e4b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1e4c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73  optimization als
1e4d0 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69  o only applies i
1e4e0 66 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20  f the (x1 OR x2 
1e4f0 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20  OR ...) term.   
1e500 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61   ** is not conta
1e510 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63  ined in the ON c
1e520 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
1e530 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65  JOIN..    ** See
1e540 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77   ticket http://w
1e550 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
1e560 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65  c/info/f2369304e
1e570 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  4.    */.    if(
1e580 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b   pWC->nTerm>1 ){
1e590 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d  .      int iTerm
1e5a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72  ;.      for(iTer
1e5b0 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e  m=0; iTerm<pWC->
1e5c0 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b  nTerm; iTerm++){
1e5d0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1e5e0 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54  Expr = pWC->a[iT
1e5f0 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  erm].pExpr;.    
1e600 20 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b      if( &pWC->a[
1e610 69 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20  iTerm] == pTerm 
1e620 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e630 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1e640 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e650 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f  P_FromJoin) ) co
1e660 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1e670 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61  testcase( pWC->a
1e680 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
1e690 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 3b  & TERM_ORINFO );
1e6a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1e6b0 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
1e6c0 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
1e6d0 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1e6e0 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
1e6f0 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
1e700 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d  TERM_ORINFO|TERM
1e710 5f 56 49 52 54 55 41 4c 29 20 29 20 63 6f 6e 74  _VIRTUAL) ) cont
1e720 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1e730 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
1e740 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
1e750 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
1e760 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
1e770 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
1e780 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
1e790 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  ;.        pAndEx
1e7a0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1e7b0 41 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72  And(db, pAndExpr
1e7c0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1e7d0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
1e7e0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1e7f0 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
1e800 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1e810 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
1e820 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
1e830 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
1e840 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
1e850 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
1e860 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1e870 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
1e880 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
1e890 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1e8a0 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
1e8b0 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
1e8c0 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
1e8d0 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
1e8e0 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
1e8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
1e900 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
1e910 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
1e920 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
1e930 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
1e940 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
1e950 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78   pAndExpr && !Ex
1e960 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
1e970 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rExpr, EP_FromJo
1e980 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  in) ){.         
1e990 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
1e9a0 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20   = pOrExpr;.    
1e9b0 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20        pOrExpr = 
1e9c0 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20  pAndExpr;.      
1e9d0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c    }.        /* L
1e9e0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
1e9f0 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
1ea00 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
1ea10 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  m. */.        pS
1ea20 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
1ea30 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
1ea40 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45  se, pOrTab, pOrE
1ea50 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  xpr, 0, 0,.     
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50     WHERE_OMIT_OP
1ea80 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45  EN_CLOSE | WHERE
1ea90 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20  _AND_ONLY |.    
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f      WHERE_FORCE_
1eac0 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e  TABLE | WHERE_ON
1ead0 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f  ETABLE_ONLY, iCo
1eae0 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61  vCur);.        a
1eaf0 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
1eb00 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1eb10 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1eb20 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
1eb30 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b  if( pSubWInfo ){
1eb40 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
1eb50 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a  Loop *pSubLoop;.
1eb60 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
1eb70 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
1eb80 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
1eb90 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e  pOrTab, &pSubWIn
1eba0 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c  fo->a[0], iLevel
1ebb0 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
1ebc0 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a   0.          );.
1ebd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1ebe0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1ebf0 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
1ec00 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
1ec10 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
1ec20 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57  Set = ((ii==pOrW
1ec30 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69  c->nTerm-1)?-1:i
1ec40 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
1ec50 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20  int r;.         
1ec60 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78     r = sqlite3Ex
1ec70 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1ec80 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
1ec90 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72  ->pTab, -1, iCur
1eca0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
1ecd0 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  owid, 0);.      
1ece0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ecf0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1ed00 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67  _RowSetTest, reg
1ed10 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Rowset,.        
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ed40 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1ed50 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a  v)+2, r, iSet);.
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
1ed70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1ed80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ed90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1eda0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1edb0 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f  , regReturn, iLo
1edc0 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20  opBody);..      
1edd0 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57      /* The pSubW
1ede0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
1edf0 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  rms flag means t
1ee00 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d  hat this OR term
1ee10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1ee20 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d  ntained one or m
1ee30 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f  ore AND term fro
1ee40 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62  m a notReady tab
1ee50 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  le.  The.       
1ee60 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d     ** terms from
1ee70 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61   the notReady ta
1ee80 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ble could not be
1ee90 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c   tested and will
1eea0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
1eeb0 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ed to be tested 
1eec0 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20  later..         
1eed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1eee0 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  ( pSubWInfo->unt
1eef0 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74  estedTerms ) unt
1ef00 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
1ef10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1ef20 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63   all of the OR-c
1ef30 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61  onnected terms a
1ef40 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  re optimized usi
1ef50 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  ng the same.    
1ef60 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20        ** index, 
1ef70 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73  and the index is
1ef80 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
1ef90 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75  e same cursor nu
1efa0 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  mber.          *
1efb0 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74  * by each call t
1efc0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1efd0 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68  gin() made by th
1efe0 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a  is loop, it may.
1eff0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
1f000 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
1f010 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20  that index as a 
1f020 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
1f030 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
1f040 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
1f050 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1f060 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f  WhereBegin() abo
1f070 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61  ve resulted in a
1f080 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20   scan that.     
1f090 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20       ** uses an 
1f0a0 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20  index, and this 
1f0b0 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69  is either the fi
1f0c0 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  rst OR-connected
1f0d0 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
1f0e0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20  ** processed or 
1f0f0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65  the index is the
1f100 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73   same as that us
1f110 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f  ed by all previo
1f120 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
1f130 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20  terms, set pCov 
1f140 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  to the candidate
1f150 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
1f160 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
1f170 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43  .          ** pC
1f180 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e  ov to NULL to in
1f190 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63  dicate that no c
1f1a0 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
1f1b0 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20  g index will .  
1f1c0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76          ** be av
1f1d0 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ailable..       
1f1e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1f1f0 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57  pSubLoop = pSubW
1f200 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
1f210 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
1f220 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e  ert( (pSubLoop->
1f230 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1f240 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
1f250 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f260 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
1f270 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
1f280 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)!=0.         
1f290 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70    && (ii==0 || p
1f2a0 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
1f2b0 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20  .pIndex==pCov). 
1f2c0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1f2d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f2e0 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
1f2f0 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72  iIdxCur==iCovCur
1f300 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1f310 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d  pCov = pSubLoop-
1f320 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1f330 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f340 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
1f350 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ov = 0;.        
1f360 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
1f370 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f  * Finish the loo
1f380 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
1f390 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
1f3a0 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
1f3b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
1f3c0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
1f3d0 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
1f3e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f3f0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
1f400 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a  pCovidx = pCov;.
1f410 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70      if( pCov ) p
1f420 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
1f430 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66   iCovCur;.    if
1f440 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
1f450 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
1f460 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  eft = 0;.      s
1f470 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1f480 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  (db, pAndExpr);.
1f490 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1f4a0 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
1f4b0 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
1f4c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1f4d0 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
1f4e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f4f0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
1f500 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
1f510 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1f520 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
1f530 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
1f540 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
1f550 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
1f560 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62  kFree(db, pOrTab
1f570 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
1f580 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
1f590 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1f5a0 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
1f5b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1f5c0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
1f5d0 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
1f5e0 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68    /* Case 6:  Th
1f5f0 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
1f600 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
1f610 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
1f620 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
1f630 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
1f640 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
1f650 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1f660 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
1f670 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
1f680 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1f690 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
1f6a0 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
1f6b0 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
1f6c0 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
1f6d0 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
1f6e0 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 69   if( pTabItem->i
1f6f0 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
1f700 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61      /* Tables ma
1f710 72 6b 65 64 20 69 73 52 65 63 75 72 73 69 76 65  rked isRecursive
1f720 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
1f730 67 6c 65 20 72 6f 77 20 74 68 61 74 20 69 73 20  gle row that is 
1f740 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 20 20  stored in.      
1f750 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73  ** a pseudo-curs
1f760 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  or.  No need to 
1f770 52 65 77 69 6e 64 20 6f 72 20 4e 65 78 74 20 73  Rewind or Next s
1f780 75 63 68 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a  uch cursors. */.
1f790 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
1f7a0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1f7b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
1f7c0 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
1f7d0 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70 4c 65  bRev];.      pLe
1f7e0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
1f7f0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
1f800 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
1f810 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61  beAddOp2(v, aSta
1f820 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20  rt[bRev], iCur, 
1f830 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
1f840 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f850 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
1f860 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1f870 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
1f880 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
1f890 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
1f8a0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
1f8b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1f8c0 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
1f8d0 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
1f8e0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
1f8f0 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
1f900 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
1f910 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
1f920 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
1f930 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
1f940 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
1f950 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
1f960 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
1f970 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
1f980 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1f990 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1f9a0 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  TUAL );.    test
1f9b0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1f9c0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
1f9d0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
1f9e0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
1f9f0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
1fa00 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
1fa10 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
1fa20 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
1fa30 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
1fa40 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )!=0 ){.      te
1fa50 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
1fa60 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30  untestedTerms==0
1fa70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa80 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
1fa90 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1faa0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
1fab0 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   );.      pWInfo
1fac0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
1fad0 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 1;.      conti
1fae0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
1faf0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
1fb00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
1fb10 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
1fb20 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1fb30 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
1fb40 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1fb50 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63  Join) ){.      c
1fb60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1fb70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1fb80 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1fb90 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
1fba0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1fbb0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
1fbc0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
1fbd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  ;.  }..  /* Inse
1fbe0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
1fbf0 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73  for implied cons
1fc00 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e  traints based on
1fc10 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20   transitivity.  
1fc20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f  ** of the "==" o
1fc30 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
1fc40 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  ** Example: If t
1fc50 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1fc60 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74  contains "t1.a=t
1fc70 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31  2.b" and "t2.b=1
1fc80 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20  23".  ** and we 
1fc90 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74  are coding the t
1fca0 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74  1 loop and the t
1fcb0 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79  2 loop has not y
1fcc0 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74  et coded,.  ** t
1fcd0 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hen we cannot us
1fce0 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62  e the "t1.a=t2.b
1fcf0 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75  " constraint, bu
1fd00 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20  t we can code.  
1fd10 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22  ** the implied "
1fd20 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72  t1.a=123" constr
1fd30 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
1fd40 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
1fd50 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
1fd60 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
1fd70 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  .    Expr *pE, *
1fd80 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65  pEAlt;.    Where
1fd90 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20  Term *pAlt;.    
1fda0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
1fdb0 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
1fdc0 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
1fdd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1fde0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1fdf0 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57  tor!=(WO_EQUIV|W
1fe00 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65  O_EQ) ) continue
1fe10 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
1fe20 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
1fe30 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
1fe40 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
1fe50 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e  eftJoin ) contin
1fe60 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65  ue;.    pE = pTe
1fe70 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
1fe80 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1fe90 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
1fea0 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20  romJoin) );.    
1feb0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
1fec0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4c  prereqRight & pL
1fed0 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
1fee0 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d  =0 );.    pAlt =
1fef0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
1ff00 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  Cur, pTerm->u.le
1ff10 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61  ftColumn, notRea
1ff20 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
1ff30 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c   0);.    if( pAl
1ff40 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
1ff50 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77  .    if( pAlt->w
1ff60 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
1ff70 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
1ff80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1ff90 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
1ffa0 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74  & WO_EQ );.    t
1ffb0 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
1ffc0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1ffd0 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64 75   );.    VdbeModu
1ffe0 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  leComment((v, "b
1fff0 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20  egin transitive 
20000 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20  constraint"));. 
20010 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74     pEAlt = sqlit
20020 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
20030 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c  db, sizeof(*pEAl
20040 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41  t));.    if( pEA
20050 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41  lt ){.      *pEA
20060 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70  lt = *pAlt->pExp
20070 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e  r;.      pEAlt->
20080 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66  pLeft = pE->pLef
20090 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
200a0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
200b0 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43  se, pEAlt, addrC
200c0 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
200d0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
200e0 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
200f0 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20  db, pEAlt);.    
20100 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  }.  }..  /* For 
20110 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
20120 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
20130 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
20140 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
20150 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
20160 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67  e row of the rig
20170 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74  ht table has mat
20180 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61  ched the left ta
20190 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ble.  .  */.  if
201a0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
201b0 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  oin ){.    pLeve
201c0 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73  l->addrFirst = s
201d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
201e0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
201f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20200 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
20210 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
20220 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
20230 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
20240 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
20250 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ));.    sqlite3E
20260 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
20270 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  arse);.    for(p
20280 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30  Term=pWC->a, j=0
20290 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; j<pWC->nTerm; 
202a0 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
202b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
202c0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
202d0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
202e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
202f0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
20300 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
20310 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
20320 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
20330 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
20340 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
20350 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
20360 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
20370 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
20380 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
20390 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
203a0 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
203b0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
203c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
203d0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
203e0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
203f0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
20400 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
20410 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
20420 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
20430 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
20440 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
20450 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
20460 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76  }..  return pLev
20470 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  el->notReady;.}.
20480 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
20490 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
204a0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
204b0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
204c0 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65  XPLAIN)./*.** Ge
204d0 6e 65 72 61 74 65 20 22 45 78 70 6c 61 6e 61 74  nerate "Explanat
204e0 69 6f 6e 22 20 74 65 78 74 20 66 6f 72 20 61 20  ion" text for a 
204f0 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2f 0a 73 74  WhereTerm..*/.st
20500 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 45  atic void whereE
20510 78 70 6c 61 69 6e 54 65 72 6d 28 56 64 62 65 20  xplainTerm(Vdbe 
20520 2a 76 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  *v, WhereTerm *p
20530 54 65 72 6d 29 7b 0a 20 20 63 68 61 72 20 7a 54  Term){.  char zT
20540 79 70 65 5b 34 5d 3b 0a 20 20 6d 65 6d 63 70 79  ype[4];.  memcpy
20550 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34  (zType, "...", 4
20560 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  );.  if( pTerm->
20570 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
20580 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30  IRTUAL ) zType[0
20590 5d 20 3d 20 27 56 27 3b 0a 20 20 69 66 28 20 70  ] = 'V';.  if( p
205a0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
205b0 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54  & WO_EQUIV  ) zT
205c0 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20  ype[1] = 'E';.  
205d0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
205e0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
205f0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
20600 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b   zType[2] = 'L';
20610 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
20620 6e 50 72 69 6e 74 66 28 76 2c 20 22 25 73 20 22  nPrintf(v, "%s "
20630 2c 20 7a 54 79 70 65 29 3b 0a 20 20 73 71 6c 69  , zType);.  sqli
20640 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 76  te3ExplainExpr(v
20650 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b  , pTerm->pExpr);
20660 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 57 48 45  .}.#endif /* WHE
20670 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
20680 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
20690 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 20 2a 2f  _TREE_EXPLAIN */
206a0 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ...#ifdef WHERET
206b0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
206c0 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
206d0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
206e0 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
206f0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
20700 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
20710 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57  (WhereLoop *p, W
20720 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
20730 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
20740 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
20750 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20  nfo;.  int nb = 
20760 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  1+(pWInfo->pTabL
20770 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a  ist->nSrc+7)/8;.
20780 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20790 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
207a0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
207b0 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20  >a + p->iTab;.  
207c0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
207d0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c  tem->pTab;.  sql
207e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
207f0 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
20800 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20820 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
20830 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
20840 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20  , p->prereq);.  
20850 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
20860 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20880 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
20890 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
208a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
208b0 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
208c0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
208d0 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
208e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
208f0 61 6d 65 3b 0a 20 20 20 20 20 69 66 28 20 70 2d  ame;.     if( p-
20900 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
20910 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75  && (zName = p->u
20920 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
20930 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
20940 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
20950 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
20960 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30  oindex_", 17)==0
20970 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
20980 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
20990 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a  n30(zName) - 1;.
209a0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
209b0 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69  Name[i]!='_' ) i
209c0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  --;.        zNam
209d0 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  e += i;.      }.
209e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
209f0 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73  ugPrintf(".%-16s
20a00 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d   %2d", zName, p-
20a10 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20  >u.btree.nEq);. 
20a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20a30 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
20a40 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20  tf("%20s","");. 
20a50 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
20a60 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
20a70 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  f( p->u.vtab.idx
20a80 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  Str ){.      z =
20a90 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
20aa0 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29  ("(%d,\"%s\",%x)
20ab0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20ac0 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
20ad0 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  Num, p->u.vtab.i
20ae0 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62  dxStr, p->u.vtab
20af0 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
20b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
20b10 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
20b20 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75  ("(%d,%x)", p->u
20b30 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
20b40 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
20b50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
20b60 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
20b70 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20  " %-19s", z);.  
20b80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20b90 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
20ba0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
20bb0 25 30 34 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %04x N %d", p->w
20bc0 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
20bd0 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
20be0 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20  ugPrintf(" cost 
20bf0 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e  %d,%d,%d\n", p->
20c00 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c  rSetup, p->rRun,
20c10 20 70 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 64 65   p->nOut);.#ifde
20c20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20c30 54 52 45 45 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  TREE_EXPLAIN.  /
20c40 2a 20 49 66 20 74 68 65 20 30 78 31 30 30 20 62  * If the 0x100 b
20c50 69 74 20 6f 66 20 77 68 65 72 65 74 72 61 63 69  it of wheretraci
20c60 6e 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ng is set, then 
20c70 73 68 6f 77 20 61 6c 6c 20 6f 66 20 74 68 65 20  show all of the 
20c80 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20  constraint.  ** 
20c90 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
20ca0 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 61 4c 54  he WhereLoop.aLT
20cb0 65 72 6d 5b 5d 20 61 72 72 61 79 2e 0a 20 20 2a  erm[] array..  *
20cc0 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72  /.  if( p->nLTer
20cd0 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65  m && (sqlite3Whe
20ce0 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29  reTrace & 0x100)
20cf0 21 3d 30 20 29 7b 20 20 2f 2a 20 57 48 45 52 45  !=0 ){  /* WHERE
20d00 54 52 41 43 45 20 30 78 31 30 30 20 2a 2f 0a 20  TRACE 0x100 */. 
20d10 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
20d20 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e  be *v = pWInfo->
20d30 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
20d40 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
20d50 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20 20 66  nBegin(v);.    f
20d60 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54  or(i=0; i<p->nLT
20d70 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
20d80 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
20d90 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  m = p->aLTerm[i]
20da0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
20db0 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
20dc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20dd0 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22  plainPrintf(v, "
20de0 20 20 28 25 64 29 20 23 25 2d 32 64 20 22 2c 20    (%d) #%-2d ", 
20df0 69 2b 31 2c 20 28 69 6e 74 29 28 70 54 65 72 6d  i+1, (int)(pTerm
20e00 2d 70 57 43 2d 3e 61 29 29 3b 0a 20 20 20 20 20  -pWC->a));.     
20e10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
20e20 75 73 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68  ush(v);.      wh
20e30 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76  ereExplainTerm(v
20e40 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
20e50 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
20e60 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p(v);.      sqli
20e70 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b  te3ExplainNL(v);
20e80 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20e90 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68 28  e3ExplainFinish(
20ea0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  v);.    sqlite3D
20eb0 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c  ebugPrintf("%s",
20ec0 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
20ed0 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d  anation(v));.  }
20ee0 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
20ef0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
20f00 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f  bulk memory into
20f10 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f   a valid WhereLo
20f20 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70  op that can be p
20f30 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72  assed.** to wher
20f40 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c  eLoopClear harml
20f50 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  essly..*/.static
20f60 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49   void whereLoopI
20f70 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nit(WhereLoop *p
20f80 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  ){.  p->aLTerm =
20f90 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b   p->aLTermSpace;
20fa0 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  .  p->nLTerm = 0
20fb0 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20  ;.  p->nLSlot = 
20fc0 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54  ArraySize(p->aLT
20fd0 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e  ermSpace);.  p->
20fe0 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a  wsFlags = 0;.}..
20ff0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
21000 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f  WhereLoop.u unio
21010 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c  n.  Leave WhereL
21020 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63  oop.pLTerm intac
21030 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
21040 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
21050 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  Union(sqlite3 *d
21060 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
21070 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61  {.  if( p->wsFla
21080 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54  gs & (WHERE_VIRT
21090 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41  UALTABLE|WHERE_A
210a0 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20  UTO_INDEX) ){.  
210b0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
210c0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
210d0 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d  LTABLE)!=0 && p-
210e0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
210f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21100 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62  3_free(p->u.vtab
21110 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
21120 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
21130 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ee = 0;.      p-
21140 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
21150 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
21160 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
21170 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
21180 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72  )!=0 && p->u.btr
21190 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
211a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
211b0 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
211c0 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  ee.pIndex->zColA
211d0 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ff);.      sqlit
211e0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
211f0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
21200 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  ->pKeyInfo);.   
21210 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
21220 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
21230 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70  pIndex);.      p
21240 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
21250 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
21260 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
21270 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
21280 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
21290 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
212a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
212b0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
212c0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
212d0 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
212e0 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
212f0 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
21300 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
21310 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65  aLTerm);.  where
21320 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
21330 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f  b, p);.  whereLo
21340 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  opInit(p);.}../*
21350 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
21360 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
21370 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c  on for pLoop->aL
21380 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20  Term[] to be at 
21390 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74  least n..*/.stat
213a0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
213b0 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a  Resize(sqlite3 *
213c0 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
213d0 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72  , int n){.  Wher
213e0 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20  eTerm **paNew;. 
213f0 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d   if( p->nLSlot>=
21400 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
21410 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37  E_OK;.  n = (n+7
21420 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20  )&~7;.  paNew = 
21430 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
21440 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  aw(db, sizeof(p-
21450 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
21460 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
21470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
21480 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  OMEM;.  memcpy(p
21490 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
214a0 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
214b0 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
214c0 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
214d0 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
214e0 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
214f0 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
21500 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
21510 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
21520 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
21530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
21540 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
21550 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
21560 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
21570 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
21580 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
21590 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
215a0 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
215b0 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
215c0 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
215d0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
215e0 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
215f0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
21600 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
21610 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
21620 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
21630 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
21640 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21650 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
21660 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f  memcpy(pTo, pFro
21670 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46  m, WHERE_LOOP_XF
21680 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79  ER_SZ);.  memcpy
21690 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46  (pTo->aLTerm, pF
216a0 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f  rom->aLTerm, pTo
216b0 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28  ->nLTerm*sizeof(
216c0 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29  pTo->aLTerm[0]))
216d0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77  ;.  if( pFrom->w
216e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
216f0 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
21700 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62     pFrom->u.vtab
21710 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
21720 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f   }else if( (pFro
21730 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
21740 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
21750 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 ){.    pFrom->
21760 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
21770 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
21780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
21790 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68  *.** Delete a Wh
217a0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
217b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
217c0 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71  ereLoopDelete(sq
217d0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
217e0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72  Loop *p){.  wher
217f0 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
21800 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
21810 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
21820 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
21830 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
21840 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
21850 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
21860 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
21870 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
21880 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
21890 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  ) ){.    whereCl
218a0 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
218b0 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
218c0 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
218d0 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
218e0 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
218f0 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
21900 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
21910 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
21920 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
21930 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
21940 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
21950 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
21960 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
21970 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
21980 68 65 20 73 65 74 20 6f 66 20 57 48 45 52 45 20  he set of WHERE 
21990 63 6c 61 75 73 65 20 74 65 72 6d 73 20 75 73 65  clause terms use
219a0 64 20 62 79 20 70 41 20 69 73 20 61 20 70 72 6f  d by pA is a pro
219b0 70 65 72 0a 2a 2a 20 73 75 62 73 65 74 20 6f 66  per.** subset of
219c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
219d0 65 20 74 65 72 6d 73 20 75 73 65 64 20 62 79 20  e terms used by 
219e0 70 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pB..*/.static in
219f0 74 20 77 68 65 72 65 4c 6f 6f 70 50 72 6f 70 65  t whereLoopPrope
21a00 72 53 75 62 73 65 74 28 63 6f 6e 73 74 20 57 68  rSubset(const Wh
21a10 65 72 65 4c 6f 6f 70 20 2a 70 41 2c 20 63 6f 6e  ereLoop *pA, con
21a20 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 42  st WhereLoop *pB
21a30 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
21a40 20 69 66 28 20 70 41 2d 3e 6e 4c 54 65 72 6d 3e   if( pA->nLTerm>
21a50 3d 70 42 2d 3e 6e 4c 54 65 72 6d 20 29 20 72 65  =pB->nLTerm ) re
21a60 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 6a 3d  turn 0;.  for(j=
21a70 30 2c 20 69 3d 70 41 2d 3e 6e 4c 54 65 72 6d 2d  0, i=pA->nLTerm-
21a80 31 3b 20 69 3e 3d 30 20 26 26 20 6a 3e 3d 30 3b  1; i>=0 && j>=0;
21a90 20 69 2d 2d 29 7b 0a 20 20 20 20 66 6f 72 28 6a   i--){.    for(j
21aa0 3d 70 42 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  =pB->nLTerm-1; j
21ab0 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
21ac0 20 69 66 28 20 70 42 2d 3e 61 4c 54 65 72 6d 5b   if( pB->aLTerm[
21ad0 6a 5d 3d 3d 70 41 2d 3e 61 4c 54 65 72 6d 5b 69  j]==pA->aLTerm[i
21ae0 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ] ) break;.    }
21af0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 3e  .  }.  return j>
21b00 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  =0;.}../*.** Try
21b10 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63   to adjust the c
21b20 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ost of WhereLoop
21b30 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72   pTemplate upwar
21b40 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20  ds or downwards 
21b50 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a  so.** that:.**.*
21b60 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74  *   (1) pTemplat
21b70 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61  e costs less tha
21b80 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
21b90 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20  eLoops that are 
21ba0 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20  a proper.**     
21bb0 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d    subset of pTem
21bc0 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32  plate.**.**   (2
21bd0 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
21be0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20  s more than any 
21bf0 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
21c00 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70   for which pTemp
21c10 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73  late.**       is
21c20 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
21c30 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22  ..**.** To say "
21c40 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61  WhereLoop X is a
21c50 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
21c60 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20  f Y" means that 
21c70 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20  X uses fewer.** 
21c80 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
21c90 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68  ms than Y and th
21ca0 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63  at every WHERE c
21cb0 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20  lause term used 
21cc0 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20  by X is.** also 
21cd0 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74  used by Y..*/.st
21ce0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
21cf0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f  oopAdjustCost(co
21d00 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
21d10 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
21d20 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28  mplate){.  if( (
21d30 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
21d40 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
21d50 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ED)==0 ) return;
21d60 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d  .  for(; p; p=p-
21d70 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
21d80 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
21d90 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20  emplate->iTab ) 
21da0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
21db0 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
21dc0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
21dd0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
21de0 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c    if( p->nLTerm<
21df0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
21e00 6d 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 72 52  m.     && (p->rR
21e10 75 6e 3c 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  un<pTemplate->rR
21e20 75 6e 20 7c 7c 20 28 70 2d 3e 72 52 75 6e 3d 3d  un || (p->rRun==
21e30 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
21e40 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e60 20 20 20 20 20 20 20 20 70 2d 3e 6e 4f 75 74 3c          p->nOut<
21e70 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
21e80 29 29 0a 20 20 20 20 20 26 26 20 77 68 65 72 65  )).     && where
21e90 4c 6f 6f 70 50 72 6f 70 65 72 53 75 62 73 65 74  LoopProperSubset
21ea0 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 0a 20  (p, pTemplate). 
21eb0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 54 65 6d     ){.      pTem
21ec0 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
21ed0 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
21ee0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
21ef0 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20  ->nOut - 1;.    
21f00 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 2d  }else.    if( p-
21f10 3e 6e 4c 54 65 72 6d 3e 70 54 65 6d 70 6c 61 74  >nLTerm>pTemplat
21f20 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20 26  e->nLTerm.     &
21f30 26 20 28 70 2d 3e 72 52 75 6e 3e 70 54 65 6d 70  & (p->rRun>pTemp
21f40 6c 61 74 65 2d 3e 72 52 75 6e 20 7c 7c 20 28 70  late->rRun || (p
21f50 2d 3e 72 52 75 6e 3d 3d 70 54 65 6d 70 6c 61 74  ->rRun==pTemplat
21f60 65 2d 3e 72 52 75 6e 20 26 26 0a 20 20 20 20 20  e->rRun &&.     
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61  p->nOut>=pTempla
21fa0 74 65 2d 3e 6e 4f 75 74 29 29 0a 20 20 20 20 20  te->nOut)).     
21fb0 26 26 20 77 68 65 72 65 4c 6f 6f 70 50 72 6f 70  && whereLoopProp
21fc0 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
21fd0 74 65 2c 20 70 29 0a 20 20 20 20 29 7b 0a 20 20  te, p).    ){.  
21fe0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
21ff0 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
22000 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
22010 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b  nOut = p->nOut +
22020 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
22030 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
22040 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
22050 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20  oops in *ppPrev 
22060 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20  looking for one 
22070 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73  that can be.** s
22080 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65  upplanted by pTe
22090 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  mplate..**.** Re
220a0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
220b0 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20   WhereLoop list 
220c0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72  contains an entr
220d0 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c  y that can suppl
220e0 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65  ant.** pTemplate
220f0 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
22100 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f   if pTemplate do
22110 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e  es not belong on
22120 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
22130 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72   If pX is a Wher
22140 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70  eLoop that pTemp
22150 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e  late can supplan
22160 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  t, then return t
22170 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20  he.** link that 
22180 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a  points to pX..**
22190 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65  .** If pTemplate
221a0 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74   cannot supplant
221b0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c   any existing el
221c0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
221d0 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74  t but needs.** t
221e0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
221f0 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74  e list, then ret
22200 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22210 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
22220 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
22230 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65   WhereLoop **whe
22240 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
22250 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  (.  WhereLoop **
22260 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20  ppPrev,.  const 
22270 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
22280 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c  late.){.  WhereL
22290 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  oop *p;.  for(p=
222a0 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70  (*ppPrev); p; pp
222b0 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
222c0 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
222d0 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
222e0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
222f0 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
22300 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
22310 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
22320 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
22330 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
22340 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
22350 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
22360 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
22370 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
22380 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
22390 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
223a0 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
223b0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
223c0 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
223d0 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
223e0 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
223f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
22400 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
22410 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
22420 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
22430 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
22440 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
22450 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
22460 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
22470 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
22480 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
22490 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
224a0 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
224b0 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
224c0 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
224d0 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
224e0 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
224f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
22500 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
22510 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
22520 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
22530 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
22540 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
22550 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
22560 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
22570 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
22580 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
22590 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
225a0 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
225b0 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
225c0 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
225d0 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
225e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
225f0 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
22600 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
22610 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74  .    /* If exist
22620 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20  ing WhereLoop p 
22630 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  is better than p
22640 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c  Template, pTempl
22650 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ate can be.    *
22660 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 57 68  * discarded.  Wh
22670 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74  ereLoop p is bet
22680 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20  ter if:.    **  
22690 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d   (1)  p has no m
226a0 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ore dependencies
226b0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
226c0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
226d0 29 20 20 70 20 68 61 73 20 61 6e 20 65 71 75 61  )  p has an equa
226e0 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  l or lower cost 
226f0 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20  than pTemplate. 
22700 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
22710 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
22720 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
22730 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28  ->prereq    /* (
22740 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  1)  */.     && p
22750 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c  ->rSetup<=pTempl
22760 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20  ate->rSetup     
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22780 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2a) */.     && 
22790 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61  p->rRun<=pTempla
227a0 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20  te->rRun        
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
227c0 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2b) */.     &&
227d0 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c   p->nOut<=pTempl
227e0 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22800 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b  * (2c) */.    ){
22810 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
22820 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65    /* Discard pTe
22830 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a  mplate */.    }.
22840 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70  .    /* If pTemp
22850 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73 20 62  late is always b
22860 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68  etter than p, th
22870 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62 65  en cause p to be
22880 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20   overwritten.   
22890 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61   ** with pTempla
228a0 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69  te.  pTemplate i
228b0 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 20  s better than p 
228c0 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
228d0 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20    pTemplate has 
228e0 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e  no more dependen
228f0 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a  ces than p, and.
22900 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54      **   (2)  pT
22910 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65  emplate has an e
22920 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f  qual or lower co
22930 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a  st than p..    *
22940 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
22950 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
22960 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
22970 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f  late->prereq   /
22980 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26  * (1)  */.     &
22990 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70  & p->rRun>=pTemp
229a0 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20  late->rRun      
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229c0 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a         /* (2a) *
229d0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
229e0 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t>=pTemplate->nO
229f0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22a10 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b  * (2b) */.    ){
22a20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22a30 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c  ->rSetup>=pTempl
22a40 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f  ate->rSetup ); /
22a50 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  * SETUP-INVARIAN
22a60 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20  T above */.     
22a70 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75   break;   /* Cau
22a80 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77  se p to be overw
22a90 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c  ritten by pTempl
22aa0 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ate */.    }.  }
22ab0 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72 65 76  .  return ppPrev
22ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
22ad0 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57  t or replace a W
22ae0 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75  hereLoop entry u
22af0 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74  sing the templat
22b00 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a  e supplied..**.*
22b10 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68  * An existing Wh
22b20 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69  ereLoop entry mi
22b30 67 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74  ght be overwritt
22b40 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65  en if the new te
22b50 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74  mplate.** is bet
22b60 74 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65  ter and has fewe
22b70 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20  r dependencies. 
22b80 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65   Or the template
22b90 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
22ba0 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72  .** and no inser
22bb0 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20  t will occur if 
22bc0 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
22bd0 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20  eLoop is faster 
22be0 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72  and has.** fewer
22bf0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
22c00 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  an the template.
22c10 20 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65    Otherwise a ne
22c20 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a  w WhereLoop is.*
22c30 2a 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e  * added based on
22c40 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a   the template..*
22c50 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72  *.** If pBuilder
22c60 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20  ->pOrSet is not 
22c70 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72  NULL then we car
22c80 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65  e about only the
22c90 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65  .** prerequisite
22ca0 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e  s and rRun and n
22cb0 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65  Out costs of the
22cc0 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20   N best loops.  
22cd0 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  That.** informat
22ce0 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20  ion is gathered 
22cf0 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d  in the pBuilder-
22d00 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20  >pOrSet object. 
22d10 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a   This special.**
22d20 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65   processing mode
22d30 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f   is used only fo
22d40 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63  r OR clause proc
22d50 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68  essing..**.** Wh
22d60 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  en accumulating 
22d70 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28  multiple loops (
22d80 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70  when pBuilder->p
22d90 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77  OrSet is NULL) w
22da0 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74  e.** still might
22db0 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c   overwrite simil
22dc0 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68  ar loops with th
22dd0 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  e new template i
22de0 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d  f the.** new tem
22df0 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e  plate is better.
22e00 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f    Loops may be o
22e10 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
22e20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  e following .** 
22e30 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d  conditions are m
22e40 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  et:.**.**    (1)
22e50 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
22e60 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20  same iTab..**   
22e70 20 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20   (2)  They have 
22e80 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64  the same iSortId
22e90 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68  x..**    (3)  Th
22ea0 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73  e template has s
22eb0 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70  ame or fewer dep
22ec0 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
22ed0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
22ee0 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74  **    (4)  The t
22ef0 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20  emplate has the 
22f00 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f  same or lower co
22f10 73 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  st than the curr
22f20 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74  ent loop.*/.stat
22f30 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
22f40 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70  Insert(WhereLoop
22f50 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
22f60 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  r, WhereLoop *pT
22f70 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72  emplate){.  Wher
22f80 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20  eLoop **ppPrev, 
22f90 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  *p;.  WhereInfo 
22fa0 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
22fb0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71  er->pWInfo;.  sq
22fc0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
22fd0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
22fe0 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65  .  /* If pBuilde
22ff0 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66  r->pOrSet is def
23000 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ined, then only 
23010 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  keep track of th
23020 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64  e costs.  ** and
23030 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20   prereqs..  */. 
23040 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70   if( pBuilder->p
23050 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66 20  OrSet!=0 ){.#if 
23060 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
23070 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20 70  ED.    u16 n = p
23080 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d  Builder->pOrSet-
23090 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a  >n;.    int x =.
230a0 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65  #endif.    where
230b0 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  OrInsert(pBuilde
230c0 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70  r->pOrSet, pTemp
230d0 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54  late->prereq, pT
230e0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20  emplate->rRun,. 
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23110 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
23120 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52  ut);.#if WHERETR
23130 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
23140 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  x8 */.    if( sq
23150 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
23160 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73  & 0x8 ){.      s
23170 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23180 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20  f(x?"   or-%d:  
23190 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20  ":"   or-X:  ", 
231a0 6e 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  n);.      whereL
231b0 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
231c0 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
231d0 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
231e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
231f0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
23200 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69   Look for an exi
23210 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
23220 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68 20  to replace with 
23230 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20  pTemplate.  */. 
23240 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74   whereLoopAdjust
23250 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Cost(pWInfo->pLo
23260 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
23270 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68 65 72  .  ppPrev = wher
23280 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
23290 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  &pWInfo->pLoops,
232a0 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20   pTemplate);..  
232b0 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b  if( ppPrev==0 ){
232c0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c  .    /* There al
232d0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 57  ready exists a W
232e0 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20  hereLoop on the 
232f0 6c 69 73 74 20 74 68 61 74 20 69 73 20 62 65 74  list that is bet
23300 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
23310 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75  pTemplate, so ju
23320 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c  st ignore pTempl
23330 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ate */.#if WHERE
23340 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
23350 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20   0x8 */.    if( 
23360 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
23370 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
23380 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23390 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22  ntf("ins-noop: "
233a0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
233b0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
233c0 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
233d0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
233e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
233f0 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b  E_OK;  .  }else{
23400 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76  .    p = *ppPrev
23410 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
23420 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
23430 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  nt it means that
23440 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75   either p[] shou
23450 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ld be overwritte
23460 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d  n.  ** with pTem
23470 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65  plate[] if p[] e
23480 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d  xists, or if p==
23490 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  NULL then alloca
234a0 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68  te a new.  ** Wh
234b0 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65  ereLoop and inse
234c0 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20  rt it..  */.#if 
234d0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
234e0 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69  ED /* 0x8 */.  i
234f0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
23500 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
23510 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
23520 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23530 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a  Printf("ins-del:
23540 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72    ");.      wher
23550 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42  eLoopPrint(p, pB
23560 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
23570 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
23580 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
23590 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68  new:  ");.    wh
235a0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
235b0 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
235c0 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->pWC);.  }.#end
235d0 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  if.  if( p==0 ){
235e0 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
235f0 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
23600 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65   to add to the e
23610 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a  nd of the list *
23620 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20  /.    *ppPrev = 
23630 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
23640 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
23650 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
23660 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
23670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
23680 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  M;.    whereLoop
23690 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e  Init(p);.    p->
236a0 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20  pNextLoop = 0;. 
236b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57   }else{.    /* W
236c0 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  e will be overwr
236d0 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  iting WhereLoop 
236e0 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65  p[].  But before
236f0 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20   we do, first.  
23700 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20    ** go through 
23710 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
23720 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20  list and delete 
23730 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65  any other entrie
23740 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a  s besides.    **
23750 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c   p[] that are al
23760 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79 20  so supplated by 
23770 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
23780 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54   WhereLoop **ppT
23790 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c  ail = &p->pNextL
237a0 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  oop;.    WhereLo
237b0 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20  op *pToDel;.    
237c0 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29  while( *ppTail )
237d0 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d  {.      ppTail =
237e0 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65   whereLoopFindLe
237f0 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65  sser(ppTail, pTe
23800 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69  mplate);.      i
23810 66 28 20 4e 45 56 45 52 28 70 70 54 61 69 6c 3d  f( NEVER(ppTail=
23820 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
23830 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54     pToDel = *ppT
23840 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ail;.      if( p
23850 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b  ToDel==0 ) break
23860 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20  ;.      *ppTail 
23870 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c  = pToDel->pNextL
23880 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52  oop;.#if WHERETR
23890 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
238a0 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  x8 */.      if( 
238b0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
238c0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
238d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
238e0 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20  rintf("ins-del: 
238f0 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ");.        wher
23900 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65  eLoopPrint(pToDe
23910 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  l, pBuilder->pWC
23920 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
23930 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  f.      whereLoo
23940 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44  pDelete(db, pToD
23950 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  el);.    }.  }. 
23960 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
23970 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
23980 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
23990 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
239a0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
239b0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
239c0 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
239d0 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
239e0 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
239f0 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
23a00 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
23a10 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
23a20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
23a30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23a40 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65  Adjust the Where
23a50 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20  Loop.nOut value 
23a60 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f  downward to acco
23a70 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  unt for terms of
23a80 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
23a90 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65  ause that refere
23aa0 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74  nce the loop but
23ab0 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
23ac0 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64  sed by an.** ind
23ad0 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ex..**.** In the
23ae0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
23af0 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66 69 72  ntation, the fir
23b00 73 74 20 65 78 74 72 61 20 57 48 45 52 45 20 63  st extra WHERE c
23b10 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64 75 63  lause term reduc
23b20 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  es.** the number
23b30 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
23b40 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31  by a factor of 1
23b50 30 20 61 6e 64 20 65 61 63 68 20 61 64 64 69 74  0 and each addit
23b60 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20 72 65  ional term.** re
23b70 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
23b80 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
23b90 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f 0a 73  by sqrt(2)..*/.s
23ba0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
23bb0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
23bc0 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
23bd0 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  C, WhereLoop *pL
23be0 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65 54 65 72  oop){.  WhereTer
23bf0 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20  m *pTerm, *pX;. 
23c00 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f   Bitmask notAllo
23c10 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70  wed = ~(pLoop->p
23c20 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73  rereq|pLoop->mas
23c30 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c  kSelf);.  int i,
23c40 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70 74 69   j;..  if( !Opti
23c50 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
23c60 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
23c70 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
23c80 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20 29 7b  AdjustOutEst) ){
23c90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
23ca0 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
23cb0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
23cc0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
23cd0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
23ce0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
23cf0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
23d00 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
23d10 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
23d20 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
23d30 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
23d40 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
23d50 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
23d60 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
23d70 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
23d80 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
23d90 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
23da0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
23db0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
23dc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
23dd0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
23de0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
23df0 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
23e00 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
23e10 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
23e20 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
23e30 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
23e40 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
23e50 29 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d  ) pLoop->nOut +=
23e60 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
23e70 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b;.  }.}../*.** 
23e80 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d  We have so far m
23e90 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d  atched pBuilder-
23ea0 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
23eb0 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  Eq terms of the 
23ec0 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a  index pIndex..**
23ed0 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e   Try to match on
23ee0 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e more..**.** If
23ef0 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30   pProbe->tnum==0
23f00 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e  , that means pIn
23f10 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e  dex is a fake in
23f20 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65  dex used for the
23f30 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
23f40 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74  ARY KEY..*/.stat
23f50 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
23f60 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20  AddBtreeIndex(. 
23f70 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
23f80 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20  r *pBuilder,    
23f90 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
23fa0 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73  p factory */.  s
23fb0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23fc0 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f  em *pSrc,      /
23fd0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
23fe0 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
23ff0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
24000 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20  robe,           
24010 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
24020 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20  ex on pSrc */.  
24030 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20  LogEst nInMul   
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24050 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66  /* log(Number of
24060 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20   iterations due 
24070 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57  to IN) */.){.  W
24080 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
24090 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
240a0 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61  nfo;  /* WHERE a
240b0 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a  nalyse context *
240c0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
240d0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
240e0 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se;        /* Pa
240f0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
24100 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
24110 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
24120 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
24130 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63  onnection malloc
24140 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
24150 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24170 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
24180 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  oop under constr
24190 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  uction */.  Wher
241a0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
241b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
241c0 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72   WhereTerm under
241d0 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
241e0 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20  /.  int opMask; 
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24200 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65      /* Valid ope
24210 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74  rators for const
24220 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72  raints */.  Wher
24230 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20  eScan scan;     
24240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24250 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52  terator for WHER
24260 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  E terms */.  Bit
24270 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65  mask saved_prere
24280 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  q;           /* 
24290 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
242a0 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a  f pNew->prereq *
242b0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c  /.  u16 saved_nL
242c0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
242d0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
242e0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
242f0 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73  LTerm */.  u16 s
24300 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20  aved_nEq;       
24310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
24320 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
24330 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
24340 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
24350 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20  _nSkip;         
24360 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
24370 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
24380 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20  ->u.btree.nSkip 
24390 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
243a0 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
243b0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
243c0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
243d0 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67  wsFlags */.  Log
243e0 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  Est saved_nOut; 
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24400 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
24410 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
24420 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
24450 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
24460 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
24470 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
24480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24490 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c  turn code */.  L
244a0 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 3b 20 20  ogEst nRowEst;  
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
244c0 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64 65  * Estimated inde
244d0 78 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a 2f  x selectivity */
244e0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
244f0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
24500 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
24510 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
24520 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
24530 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
24540 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
24550 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
24560 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
24570 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
24580 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
24590 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
245a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
245b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  ;..  assert( (pN
245c0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
245d0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
245e0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
245f0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
24600 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
24610 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  IT)==0 );.  if( 
24620 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
24630 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
24640 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
24650 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
24660 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d  else if( pProbe-
24670 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72  >tnum<=0 || (pSr
24680 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
24690 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
246a0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
246b0 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
246c0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
246d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
246e0 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
246f0 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54  |WO_ISNULL|WO_GT
24700 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
24710 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  LE;.  }.  if( pP
24720 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
24730 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57   ) opMask &= ~(W
24740 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
24750 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65  |WO_LE);..  asse
24760 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  rt( pNew->u.btre
24770 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq<=pProbe->n
24780 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 69 66 28 20  KeyCol );.  if( 
24790 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
247a0 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q < pProbe->nKey
247b0 43 6f 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  Col ){.    iCol 
247c0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
247d0 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  mn[pNew->u.btree
247e0 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45  .nEq];.    nRowE
247f0 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
24800 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  st(pProbe->aiRow
24810 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  Est[pNew->u.btre
24820 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20 20 20 69  e.nEq+1]);.    i
24830 66 28 20 6e 52 6f 77 45 73 74 3d 3d 30 20 26 26  f( nRowEst==0 &&
24840 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72   pProbe->onError
24850 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 6e 52 6f 77  ==OE_None ) nRow
24860 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Est = 1;.  }else
24870 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b  {.    iCol = -1;
24880 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 30  .    nRowEst = 0
24890 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
248a0 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
248b0 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
248c0 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
248d0 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20  r, iCol,.       
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29   opMask, pProbe)
24900 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20  ;.  saved_nEq = 
24910 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
24920 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70  q;.  saved_nSkip
24930 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
24940 2e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f  .nSkip;.  saved_
24950 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e  nLTerm = pNew->n
24960 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77  LTerm;.  saved_w
24970 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77  sFlags = pNew->w
24980 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f  sFlags;.  saved_
24990 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70  prereq = pNew->p
249a0 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e  rereq;.  saved_n
249b0 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out = pNew->nOut
249c0 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
249d0 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65   = 0;.  rLogSize
249e0 20 3d 20 65 73 74 4c 6f 67 28 73 71 6c 69 74 65   = estLog(sqlite
249f0 33 4c 6f 67 45 73 74 28 70 50 72 6f 62 65 2d 3e  3LogEst(pProbe->
24a00 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 0a  aiRowEst[0]));..
24a10 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73    /* Consider us
24a20 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20  ing a skip-scan 
24a30 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
24a40 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
24a50 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76  straints.  ** av
24a60 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
24a70 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20  left-most terms 
24a80 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
24a90 64 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65  d if the average
24aa0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
24ab0 72 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c  repeats in the l
24ac0 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69  eft-most terms i
24ad0 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 20  s at least 18.  
24ae0 54 68 65 20 6d 61 67 69 63 0a 20 20 2a 2a 20 6e  The magic.  ** n
24af0 75 6d 62 65 72 20 31 38 20 77 61 73 20 66 6f 75  umber 18 was fou
24b00 6e 64 20 62 79 20 65 78 70 65 72 69 6d 65 6e 74  nd by experiment
24b10 61 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ation to be the 
24b20 70 61 79 6f 66 66 20 70 6f 69 6e 74 20 77 68 65  payoff point whe
24b30 72 65 0a 20 20 2a 2a 20 73 6b 69 70 2d 73 63 61  re.  ** skip-sca
24b40 6e 20 62 65 63 6f 6d 65 20 66 61 73 74 65 72 20  n become faster 
24b50 74 68 61 6e 20 61 20 66 75 6c 6c 2d 73 63 61 6e  than a full-scan
24b60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 65  ..  */.  if( pTe
24b70 72 6d 3d 3d 30 0a 20 20 20 26 26 20 73 61 76 65  rm==0.   && save
24b80 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b  d_nEq==saved_nSk
24b90 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  ip.   && saved_n
24ba0 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65  Eq+1<pProbe->nKe
24bb0 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62  yCol.   && pProb
24bc0 65 2d 3e 61 69 52 6f 77 45 73 74 5b 73 61 76 65  e->aiRowEst[save
24bd0 64 5f 6e 45 71 2b 31 5d 3e 3d 31 38 20 20 2f 2a  d_nEq+1]>=18  /*
24be0 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
24bf0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
24c00 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
24c10 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
24c20 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
24c30 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
24c40 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
24c50 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
24c60 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
24c70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ++;.    pNew->u.
24c80 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20  btree.nSkip++;. 
24c90 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
24ca0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
24cb0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
24cc0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
24cd0 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
24ce0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ter = sqlite3Log
24cf0 45 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  Est(pProbe->aiRo
24d00 77 45 73 74 5b 30 5d 2f 70 50 72 6f 62 65 2d 3e  wEst[0]/pProbe->
24d10 61 69 52 6f 77 45 73 74 5b 73 61 76 65 64 5f 6e  aiRowEst[saved_n
24d20 45 71 2b 31 5d 29 3b 0a 20 20 20 20 70 4e 65 77  Eq+1]);.    pNew
24d30 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a  ->rRun = rLogSiz
24d40 65 20 2b 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  e + nIter;.    p
24d50 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 74  New->nOut += nIt
24d60 65 72 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  er;.    whereLoo
24d70 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
24d80 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
24d90 50 72 6f 62 65 2c 20 6e 49 74 65 72 29 3b 0a 20  Probe, nIter);. 
24da0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
24db0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 7d 0a  saved_nOut;.  }.
24dc0 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
24dd0 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d  TE_OK && pTerm!=
24de0 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  0; pTerm = where
24df0 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29  ScanNext(&scan))
24e00 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20  {.    int nIn = 
24e10 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
24e20 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
24e30 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e  _STAT4.    int n
24e40 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
24e50 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
24e60 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
24e70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24e80 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28  ==WO_ISNULL || (
24e90 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54  pTerm->wtFlags&T
24ea0 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20  ERM_VNULL)!=0). 
24eb0 20 20 20 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c      && (iCol<0 |
24ec0 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43  | pSrc->pTab->aC
24ed0 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c  ol[iCol].notNull
24ee0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
24ef0 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f  ontinue; /* igno
24f00 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c  re IS [NOT] NULL
24f10 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
24f20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
24f30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
24f40 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
24f50 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
24f60 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
24f70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
24f80 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
24f90 5f 6e 4f 75 74 20 29 3b 0a 0a 20 20 20 20 70 4e  _nOut );..    pN
24fa0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
24fb0 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20  ved_wsFlags;.   
24fc0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
24fd0 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
24fe0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
24ff0 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
25000 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
25010 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
25020 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
25030 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f  1) ) break; /* O
25040 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  OM */.    pNew->
25050 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
25060 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm++] = pTerm;.
25070 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
25080 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65 71   = (saved_prereq
25090 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
250a0 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e  Right) & ~pNew->
250b0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e  maskSelf;.    pN
250c0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53  ew->rRun = rLogS
250d0 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65  ize; /* Baseline
250e0 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28 4e 29   cost is log2(N)
250f0 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73 20 62  .  Adjustments b
25100 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20  elow */.    if( 
25110 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
25120 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
25130 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
25140 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
25150 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
25160 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
25170 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
25180 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
25190 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
251a0 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
251b0 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
251c0 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
251d0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
251e0 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
251f0 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
25200 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
25210 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
25220 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
25230 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
25240 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
25250 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
25260 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
25270 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
25280 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
25290 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
252a0 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
252b0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
252c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
252d0 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29   assert( nIn>0 )
252e0 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73  ;  /* RHS always
252f0 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74   has 2 or more t
25300 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72  erms...  The par
25310 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ser.            
25320 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
25330 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29  hanges "x IN (?)
25340 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f  " into "x=?". */
25350 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
25360 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  n += nIn;.      
25370 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
25380 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  q++;.      pNew-
25390 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20  >nOut = nRowEst 
253a0 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  + nInMul + nIn;.
253b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
253c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
253d0 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20   (WO_EQ) ){.    
253e0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
253f0 20 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73    (pNew->wsFlags
25400 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
25410 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55  _NULL|WHERE_COLU
25420 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 53 4b 49 50  MN_IN|WHERE_SKIP
25430 53 43 41 4e 29 29 21 3d 30 0a 20 20 20 20 20 20  SCAN))!=0.      
25440 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20    || nInMul==0. 
25450 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 4e       );.      pN
25460 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
25470 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a  HERE_COLUMN_EQ;.
25480 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
25490 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26   || (nInMul==0 &
254a0 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
254b0 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq==pProbe->nKe
254c0 79 43 6f 6c 2d 31 29 29 7b 0a 20 20 20 20 20 20  yCol-1)){.      
254d0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
254e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
254f0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 7c  _COLUMN_IN)==0 |
25500 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20 20 20  | iCol<0 );.    
25510 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
25520 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  && pProbe->onErr
25530 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or==OE_None ){. 
25540 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
25550 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
25560 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20  UNQ_WANTED;.    
25570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25580 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
25590 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
255a0 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OW;.        }.  
255b0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
255c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
255d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
255e0 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
255f0 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nMul;.    }else 
25600 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
25610 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
25620 4c 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  L) ){.      pNew
25630 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
25640 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
25650 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
25660 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
25670 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 53 20 4e   /* TUNING: IS N
25680 55 4c 4c 20 73 65 6c 65 63 74 73 20 32 20 72 6f  ULL selects 2 ro
25690 77 73 20 2a 2f 0a 20 20 20 20 20 20 6e 49 6e 20  ws */.      nIn 
256a0 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28 20 31  = 10;  assert( 1
256b0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
256c0 28 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  (2) );.      pNe
256d0 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
256e0 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e  t + nInMul + nIn
256f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25700 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
25710 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
25720 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
25730 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
25740 61 74 6f 72 20 26 20 57 4f 5f 47 54 20 29 3b 0a  ator & WO_GT );.
25750 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25760 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
25770 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
25780 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
25790 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
257a0 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f  RANGE|WHERE_BTM_
257b0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74  LIMIT;.      pBt
257c0 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
257d0 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d   pTop = 0;.    }
257e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
257f0 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
25800 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
25810 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
25820 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
25830 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 54  Operator & WO_LT
25840 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
25850 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
25860 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
25870 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
25880 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
25890 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
258a0 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
258b0 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20   pTop = pTerm;. 
258c0 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65       pBtm = (pNe
258d0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
258e0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30  RE_BTM_LIMIT)!=0
258f0 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
25900 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
25910 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
25920 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a  m-2] : 0;.    }.
25930 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
25940 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
25950 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
25960 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
25970 75 74 20 61 6e 64 20 72 52 75 6e 20 66 6f 72 20  ut and rRun for 
25980 53 54 41 54 33 20 72 61 6e 67 65 20 76 61 6c 75  STAT3 range valu
25990 65 73 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  es */.      asse
259a0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
259b0 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
259c0 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63      whereRangeSc
259d0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
259e0 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54  uilder, pBtm, pT
259f0 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d  op, pNew);.    }
25a00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25a10 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
25a20 54 41 54 34 0a 20 20 20 20 69 66 28 20 6e 49 6e  TAT4.    if( nIn
25a30 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Mul==0 .     && 
25a40 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20  pProbe->nSample 
25a50 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75  .     && pNew->u
25a60 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
25a70 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20  be->nSampleCol. 
25a80 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
25a90 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
25aa0 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20  QLITE_Stat3) .  
25ab0 20 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20    ){.      Expr 
25ac0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
25ad0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 74 52 6f  pExpr;.      tRo
25ae0 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20  wcnt nOut = 0;. 
25af0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
25b00 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
25b10 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21  _EQ|WO_ISNULL))!
25b20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
25b30 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
25b40 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
25b50 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
25b60 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
25b70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
25b80 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  LL );.        rc
25b90 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
25ba0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
25bb0 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
25bc0 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
25bd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
25be0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
25bf0 26 20 57 4f 5f 49 4e 29 0a 20 20 20 20 20 20 20  & WO_IN).       
25c00 20 20 20 20 20 20 26 26 20 20 21 45 78 70 72 48        &&  !ExprH
25c10 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
25c20 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
25c30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25c40 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
25c50 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
25c60 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
25c70 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
25c80 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
25c90 6e 4f 75 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  nOut==0 || rc==S
25ca0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
25cb0 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
25cc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
25cd0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
25ce0 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
25cf0 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73  if( pNew->nOut>s
25d00 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77  aved_nOut ) pNew
25d10 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
25d20 4f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Out;.      }.   
25d30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
25d40 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
25d50 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
25d60 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d  LY|WHERE_IPK))==
25d70 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61  0 ){.      /* Ea
25d80 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20  ch row involves 
25d90 61 20 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e  a step of the in
25da0 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61  dex, then a bina
25db0 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20  ry search of.   
25dc0 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74     ** the main t
25dd0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e  able */.      pN
25de0 65 77 2d 3e 72 52 75 6e 20 3d 20 20 73 71 6c 69  ew->rRun =  sqli
25df0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
25e00 77 2d 3e 72 52 75 6e 2c 72 4c 6f 67 53 69 7a 65  w->rRun,rLogSize
25e10 3e 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31  >27 ? rLogSize-1
25e20 37 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20  7 : 10);.    }. 
25e30 20 20 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20     /* Step cost 
25e40 66 6f 72 20 65 61 63 68 20 6f 75 74 70 75 74 20  for each output 
25e50 72 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  row */.    pNew-
25e60 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
25e70 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
25e80 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 29  Run, pNew->nOut)
25e90 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f  ;.    whereLoopO
25ea0 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69  utputAdjust(pBui
25eb0 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 29  lder->pWC, pNew)
25ec0 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
25ed0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
25ee0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
25ef0 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
25f00 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
25f10 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26  IMIT)==0.     &&
25f20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
25f30 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq<(pProbe->nKey
25f40 43 6f 6c 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a  Col + (pProbe->z
25f50 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b  Name!=0)).    ){
25f60 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
25f70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
25f80 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
25f90 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e  robe, nInMul+nIn
25fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
25fb0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
25fc0 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  nOut;.#ifdef SQL
25fd0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
25fe0 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42  _OR_STAT4.    pB
25ff0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
26000 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23  d = nRecValid;.#
26010 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77  endif.  }.  pNew
26020 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64  ->prereq = saved
26030 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d  _prereq;.  pNew-
26040 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
26050 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77  aved_nEq;.  pNew
26060 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20  ->u.btree.nSkip 
26070 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
26080 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
26090 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
260a0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
260b0 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
260c0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
260d0 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75  d_nLTerm;.  retu
260e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
260f0 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
26100 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
26110 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
26120 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
26130 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
26140 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
26150 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
26160 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
26170 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
26180 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
26190 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
261a0 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
261b0 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
261c0 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
261d0 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
261e0 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
261f0 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
26200 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
26210 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
26220 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
26230 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
26240 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
26250 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
26260 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
26270 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  pOB;.  int ii, j
26280 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
26290 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
262a0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
262b0 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
262c0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
262d0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
262e0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
262f0 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
26300 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
26310 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
26320 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
26330 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
26340 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
26350 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
26360 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
26370 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
26380 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
26390 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e  for(jj=0; jj<pIn
263a0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a  dex->nKeyCol; jj
263b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
263c0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
263d0 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
263e0 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31  n[jj] ) return 1
263f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26400 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
26410 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
26420 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20  a bitmask where 
26430 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  1s indicate that
26440 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
26450 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  ng column of.** 
26460 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65  the table is use
26470 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20  d by an index.  
26480 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36  Only the first 6
26490 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f  3 columns are co
264a0 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  nsidered..*/.sta
264b0 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75  tic Bitmask colu
264c0 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78  mnsInIndex(Index
264d0 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61   *pIdx){.  Bitma
264e0 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sk m = 0;.  int 
264f0 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d  j;.  for(j=pIdx-
26500 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30  >nColumn-1; j>=0
26510 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; j--){.    int 
26520 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
26530 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78  mn[j];.    if( x
26540 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
26550 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20  tcase( x==BMS-1 
26560 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26570 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  e( x==BMS-2 );. 
26580 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31       if( x<BMS-1
26590 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28   ) m |= MASKBIT(
265a0 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
265b0 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20  return m;.}../* 
265c0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
265d0 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  a partial index 
265e0 77 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57  with pPartIndexW
265f0 68 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  here can be used
26600 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
26610 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  nt query.  Retur
26620 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e  n true if it can
26630 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66   be and false if
26640 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
26650 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50  int whereUsableP
26660 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20  artialIndex(int 
26670 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73  iTab, WhereClaus
26680 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57  e *pWC, Expr *pW
26690 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  here){.  int i;.
266a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
266b0 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  rm;.  for(i=0, p
266c0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
266d0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
266e0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
266f0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  ( sqlite3ExprImp
26700 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d 2d 3e  liesExpr(pTerm->
26710 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69  pExpr, pWhere, i
26720 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Tab) ) return 1;
26730 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
26740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
26750 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
26760 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  cts for a single
26770 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
26780 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62  in where the tab
26790 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65  le.** is idenfie
267a0 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
267b0 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
267c0 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
267d0 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  teed to be.** a 
267e0 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f  b-tree table, no
267f0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
26800 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26810 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
26820 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
26830 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
26840 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
26850 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
26860 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
26870 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a              /
26880 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
26890 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
268a0 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
268b0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
268c0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
268d0 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
268e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
268f0 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
26900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
26910 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
26920 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
26930 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
26940 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
26950 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
26960 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
26970 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  key */.  tRowcnt
26980 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
26990 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
269a0 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
269b0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
269c0 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e  /.  i16 aiColumn
269d0 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
269e0 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
269f0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
26a00 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72  Pk index */.  Sr
26a10 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
26a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26a30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
26a40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
26a50 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a  _item *pSrc;  /*
26a60 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
26a70 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61   btree term to a
26a80 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  dd */.  WhereLoo
26a90 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
26aa0 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
26ab0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
26ac0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
26ad0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
26ae0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
26af0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49   */.  int iSortI
26b00 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
26b10 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
26b20 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20  r */.  int b;   
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b40 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20     /* A boolean 
26b50 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  value */.  LogEs
26b60 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t rSize;        
26b70 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72         /* number
26b80 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
26b90 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73  table */.  LogEs
26ba0 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20  t rLogSize;     
26bb0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
26bc0 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  thm of the numbe
26bd0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
26be0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
26bf0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
26c00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
26c10 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61 75  arsed WHERE clau
26c20 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
26c30 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
26c40 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
26c50 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
26c60 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
26c70 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e  er->pNew;.  pWIn
26c80 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
26c90 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73  WInfo;.  pTabLis
26ca0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
26cb0 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70  List;.  pSrc = p
26cc0 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
26cd0 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62 20  w->iTab;.  pTab 
26ce0 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
26cf0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
26d00 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20 21  pWC;.  assert( !
26d10 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
26d20 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20  pTab) );..  if( 
26d30 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a  pSrc->pIndex ){.
26d40 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45      /* An INDEXE
26d50 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63  D BY clause spec
26d60 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c  ifies a particul
26d70 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  ar index to use 
26d80 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  */.    pProbe = 
26d90 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pSrc->pIndex;.  
26da0 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f  }else if( !HasRo
26db0 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
26dc0 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e   pProbe = pTab->
26dd0 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b  pIndex;.  }else{
26de0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
26df0 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
26e00 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
26e10 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
26e20 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20  ct in local.    
26e30 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20  ** variable sPk 
26e40 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
26e50 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
26e60 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  ey index.  Make 
26e70 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65  this.    ** fake
26e80 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74   index the first
26e90 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49   in a chain of I
26ea0 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74  ndex objects wit
26eb0 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61  h all of the rea
26ec0 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73  l.    ** indices
26ed0 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
26ee0 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b    Index *pFirst;
26ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f00 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65    /* First of re
26f10 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  al indices on th
26f20 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d  e table */.    m
26f30 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73  emset(&sPk, 0, s
26f40 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
26f50 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d     sPk.nKeyCol =
26f60 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f   1;.    sPk.aiCo
26f70 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e  lumn = &aiColumn
26f80 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f  Pk;.    sPk.aiRo
26f90 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  wEst = aiRowEstP
26fa0 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
26fb0 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
26fc0 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
26fd0 3d 20 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f  = pTab;.    aiRo
26fe0 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62  wEstPk[0] = pTab
26ff0 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61  ->nRowEst;.    a
27000 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31  iRowEstPk[1] = 1
27010 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20 70  ;.    pFirst = p
27020 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
27030 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  x;.    if( pSrc-
27040 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  >notIndexed==0 )
27050 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
27060 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74  eal indices of t
27070 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c  he table are onl
27080 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20  y considered if 
27090 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54  the.      ** NOT
270a0 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69   INDEXED qualifi
270b0 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  er is omitted fr
270c0 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  om the FROM clau
270d0 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e  se */.      sPk.
270e0 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
270f0 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65      }.    pProbe
27100 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72   = &sPk;.  }.  r
27110 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Size = sqlite3Lo
27120 67 45 73 74 28 70 54 61 62 2d 3e 6e 52 6f 77 45  gEst(pTab->nRowE
27130 73 74 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  st);.  rLogSize 
27140 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
27150 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
27160 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
27170 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d  INDEX.  /* Autom
27180 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a  atic indexes */.
27190 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d    if( !pBuilder-
271a0 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70  >pOrSet.   && (p
271b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
271c0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
271d0 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a  E_AutoIndex)!=0.
271e0 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64     && pSrc->pInd
271f0 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72  ex==0.   && !pSr
27200 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a  c->viaCoroutine.
27210 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74     && !pSrc->not
27220 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20 48 61  Indexed.   && Ha
27230 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20  sRowid(pTab).   
27240 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72  && !pSrc->isCorr
27250 65 6c 61 74 65 64 0a 20 20 20 26 26 20 21 70 53  elated.   && !pS
27260 72 63 2d 3e 69 73 52 65 63 75 72 73 69 76 65 0a  rc->isRecursive.
27270 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65    ){.    /* Gene
27280 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20  rate auto-index 
27290 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20  WhereLoops */.  
272a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
272b0 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  rm;.    WhereTer
272c0 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  m *pWCEnd = pWC-
272d0 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
272e0 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
272f0 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54  WC->a; rc==SQLIT
27300 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57  E_OK && pTerm<pW
27310 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
27320 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
27330 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
27340 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
27350 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27360 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
27370 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
27380 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 0) ){.       
27390 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
273a0 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  Eq = 1;.        
273b0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  pNew->u.btree.nS
273c0 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  kip = 0;.       
273d0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
273e0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
273f0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
27400 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
27410 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
27420 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Term;.        /*
27430 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d   TUNING: One-tim
27440 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75  e cost for compu
27450 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74  ting the automat
27460 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ic index is.    
27470 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61      ** approxima
27480 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29  tely 7*N*log2(N)
27490 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
274a0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
274b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
274c0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
274d0 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  exed. */.       
274e0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
274f0 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65  rLogSize + rSize
27500 20 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28 20   + 28;  assert( 
27510 32 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  28==sqlite3LogEs
27520 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(7) );.        
27530 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20  /* TUNING: Each 
27540 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65  index lookup yie
27550 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74  lds 20 rows in t
27560 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a  he table.  This.
27570 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f          ** is mo
27580 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61  re than the usua
27590 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f  l guess of 10 ro
275a0 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76  ws, since we hav
275b0 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20  e no way.       
275c0 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e 67 20   ** of knowning 
275d0 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74 68  how selective th
275e0 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74  e index will ult
275f0 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20  imately be.  It 
27600 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
27610 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e   not be unreason
27620 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69  able to make thi
27630 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72  s value much lar
27640 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ger. */.        
27650 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b  pNew->nOut = 43;
27660 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71    assert( 43==sq
27670 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20  lite3LogEst(20) 
27680 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
27690 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
276a0 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
276b0 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20  e,pNew->nOut);. 
276c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
276d0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54  lags = WHERE_AUT
276e0 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20  O_INDEX;.       
276f0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
27700 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e  mExtra | pTerm->
27710 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
27720 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
27730 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
27740 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
27750 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
27760 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
27770 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
27780 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  EX */..  /* Loop
27790 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65   over all indice
277a0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72  s.  */.  for(; r
277b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
277c0 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70  pProbe; pProbe=p
277d0 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53  Probe->pNext, iS
277e0 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69  ortIdx++){.    i
277f0 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  f( pProbe->pPart
27800 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20  IdxWhere!=0.    
27810 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65   && !whereUsable
27820 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e 65  PartialIndex(pNe
27830 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70 50  w->iTab, pWC, pP
27840 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
27850 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  ere) ){.      co
27860 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74  ntinue;  /* Part
27870 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72  ial index inappr
27880 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73  opriate for this
27890 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a   query */.    }.
278a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
278b0 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
278c0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  New->u.btree.nSk
278d0 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  ip = 0;.    pNew
278e0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
278f0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
27900 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
27910 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
27920 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
27930 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d  Extra;.    pNew-
27940 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
27950 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
27960 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65  .pIndex = pProbe
27970 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d  ;.    b = indexM
27980 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
27990 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50  rBy(pBuilder, pP
279a0 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72  robe, pSrc->iCur
279b0 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  sor);.    /* The
279c0 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44   ONEPASS_DESIRED
279d0 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63   flags never occ
279e0 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74  urs together wit
279f0 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  h ORDER BY */.  
27a00 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66    assert( (pWInf
27a10 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
27a20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
27a30 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d  SIRED)==0 || b==
27a40 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72  0 );.    if( pPr
27a50 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a  obe->tnum<=0 ){.
27a60 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
27a70 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
27a80 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ex */.      pNew
27a90 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
27aa0 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a  E_IPK;..      /*
27ab0 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   Full table scan
27ac0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
27ad0 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
27ae0 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20  SortIdx : 0;.   
27af0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
27b00 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65  st of full table
27b10 20 73 63 61 6e 20 69 73 20 33 2a 28 4e 20 2b 20   scan is 3*(N + 
27b20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20 20  log2(N))..      
27b30 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72 61  **  +  The extra
27b40 20 33 20 66 61 63 74 6f 72 20 69 73 20 74 6f 20   3 factor is to 
27b50 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20 75 73  encourage the us
27b60 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f  e of indexed loo
27b70 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a 20 20 20  kups.      **   
27b80 20 20 6f 76 65 72 20 66 75 6c 6c 20 73 63 61 6e    over full scan
27b90 73 2e 20 20 46 49 58 4d 45 20 2a 2f 0a 20 20 20  s.  FIXME */.   
27ba0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
27bb0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
27bc0 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29  (rSize,rLogSize)
27bd0 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 77 68 65   + 16;.      whe
27be0 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
27bf0 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20  st(pWC, pNew);. 
27c00 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
27c10 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
27c20 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
27c30 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
27c40 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ize;.      if( r
27c50 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
27c60 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
27c70 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28  ask m;.      if(
27c80 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72   pProbe->isCover
27c90 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
27ca0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
27cb0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
27cc0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
27cd0 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20         m = 0;.  
27ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27cf0 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c     m = pSrc->col
27d00 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
27d10 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
27d20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
27d30 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
27d40 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
27d50 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
27d60 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
27d70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
27d80 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61  /* Full scan via
27d90 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
27da0 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20  if( b.       || 
27db0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a  !HasRowid(pTab).
27dc0 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
27dd0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
27de0 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
27df0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
27e00 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
27e10 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
27e20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
27e30 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
27e40 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
27e50 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
27e60 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
27e70 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
27e80 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
27e90 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
27ea0 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
27eb0 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
27ec0 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
27ed0 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
27ee0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
27ef0 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
27f00 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
27f10 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
27f20 20 20 54 68 65 20 62 61 73 65 20 63 6f 73 74 20    The base cost 
27f30 6f 66 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e  of an index scan
27f40 20 69 73 20 4e 20 2b 20 6c 6f 67 32 28 4e 29 2e   is N + log2(N).
27f50 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
27f60 6c 6f 67 32 28 4e 29 20 69 73 20 66 6f 72 20 74  log2(N) is for t
27f70 68 65 20 69 6e 69 74 69 61 6c 20 73 65 65 6b 20  he initial seek 
27f80 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
27f90 20 61 6e 64 20 74 68 65 20 4e 0a 20 20 20 20 20   and the N.     
27fa0 20 20 20 2a 2a 20 69 73 20 66 6f 72 20 74 68 65     ** is for the
27fb0 20 73 63 61 6e 20 69 74 73 65 6c 66 2e 20 2a 2f   scan itself. */
27fc0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
27fd0 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
27fe0 45 73 74 41 64 64 28 72 53 69 7a 65 2c 20 72 4c  EstAdd(rSize, rL
27ff0 6f 67 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  ogSize);.       
28000 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
28010 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
28020 3a 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65  : Cost of a cove
28030 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
28040 69 73 20 4b 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e  is K*(N + log2(N
28050 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ))..          **
28060 20 20 2b 20 20 54 68 65 20 65 78 74 72 61 20 66    +  The extra f
28070 61 63 74 6f 72 20 4b 20 6f 66 20 62 65 74 77 65  actor K of betwe
28080 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20 74  en 1.1 and 3.0 t
28090 68 61 74 20 64 65 70 65 6e 64 73 0a 20 20 20 20  hat depends.    
280a0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 6e 20        **     on 
280b0 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a  the relative siz
280c0 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
280d0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 2e 20 20  and the index.  
280e0 4b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  K.          **  
280f0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f     is smaller fo
28100 72 20 73 6d 61 6c 6c 65 72 20 69 6e 64 69 63 65  r smaller indice
28110 73 2c 20 74 68 75 73 20 66 61 76 6f 72 69 6e 67  s, thus favoring
28120 20 74 68 65 6d 2e 0a 20 20 20 20 20 20 20 20 20   them..         
28130 20 2a 2a 20 20 20 20 20 54 68 65 20 75 70 70 65   **     The uppe
28140 72 20 62 6f 75 6e 64 20 6f 6e 20 4b 20 28 33 2e  r bound on K (3.
28150 30 29 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  0) matches the p
28160 65 6e 61 6c 74 79 20 66 61 63 74 6f 72 0a 20 20  enalty factor.  
28170 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f          **     o
28180 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  n a full table s
28190 63 61 6e 20 74 68 61 74 20 74 72 69 65 73 20 74  can that tries t
281a0 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20  o encourage the 
281b0 75 73 65 20 6f 66 0a 20 20 20 20 20 20 20 20 20  use of.         
281c0 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 65 64 20   **     indexed 
281d0 6c 6f 6f 6b 75 70 73 20 6f 76 65 72 20 66 75 6c  lookups over ful
281e0 6c 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20 20  l scans..       
281f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
28200 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 20 31  pNew->rRun +=  1
28210 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
28220 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73  zIdxRow)/pTab->s
28230 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20  zTabRow;.       
28240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28250 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65    /* TUNING: The
28260 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e   cost of scannin
28270 67 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  g a non-covering
28280 20 69 6e 64 65 78 20 69 73 20 6d 75 6c 74 69 70   index is multip
28290 6c 69 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  lied.          *
282a0 2a 20 62 79 20 6c 6f 67 32 28 4e 29 20 74 6f 20  * by log2(N) to 
282b0 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
282c0 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66  binary search of
282d0 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 0a   the main table.
282e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
282f0 74 20 6d 75 73 74 20 68 61 70 70 65 6e 20 66 6f  t must happen fo
28300 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68  r each row of th
28310 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
28320 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 53 68 6f 75     ** TODO: Shou
28330 6c 64 20 74 68 65 72 65 20 62 65 20 61 20 6d 75  ld there be a mu
28340 6c 74 69 70 6c 69 65 72 20 68 65 72 65 2c 20 61  ltiplier here, a
28350 6e 61 6c 6f 67 6f 75 73 20 74 6f 20 74 68 65 20  nalogous to the 
28360 33 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  3x.          ** 
28370 6d 75 6c 74 69 70 6c 69 65 72 20 66 6f 72 20 61  multiplier for a
28380 20 66 75 6c 6c 74 61 62 6c 65 20 73 63 61 6e 20   fulltable scan 
28390 6f 72 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  or covering inde
283a0 78 20 73 63 61 6e 2c 20 74 6f 0a 20 20 20 20 20  x scan, to.     
283b0 20 20 20 20 20 2a 2a 20 66 75 72 74 68 65 72 20       ** further 
283c0 64 69 73 63 6f 75 72 61 67 65 20 74 68 65 20 75  discourage the u
283d0 73 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 73  se of an index s
283e0 63 61 6e 3f 20 20 4f 72 20 69 73 20 74 68 65 20  can?  Or is the 
283f0 6c 6f 67 32 28 4e 29 0a 20 20 20 20 20 20 20 20  log2(N).        
28400 20 20 2a 2a 20 74 65 72 6d 20 73 75 66 66 69 63    ** term suffic
28410 69 65 6e 74 20 64 69 73 63 6f 75 72 61 67 65 6d  ient discouragem
28420 65 6e 74 3f 0a 20 20 20 20 20 20 20 20 20 20 2a  ent?.          *
28430 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
28440 73 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f 66 20 74  some or all of t
28450 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
28460 74 65 72 6d 73 20 63 61 6e 20 62 65 0a 20 20 20  terms can be.   
28470 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74         ** comput
28480 65 64 20 77 69 74 68 6f 75 74 20 72 65 66 65 72  ed without refer
28490 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 72 69 67  ence to the orig
284a0 69 6e 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  inal table.  The
284b0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
284c0 2a 2a 20 70 65 6e 61 6c 69 74 79 20 73 68 6f 75  ** penality shou
284d0 6c 64 20 72 65 64 75 63 65 20 74 6f 20 6c 6f 67  ld reduce to log
284e0 4b 20 77 68 65 72 65 20 4b 20 69 73 20 74 68 65  K where K is the
284f0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
28500 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  t.          ** r
28510 6f 77 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ows..          *
28520 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  /.          pNew
28530 2d 3e 72 52 75 6e 20 2b 3d 20 72 4c 6f 67 53 69  ->rRun += rLogSi
28540 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
28550 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
28560 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
28570 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
28580 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
28590 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
285a0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
285b0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
285c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
285d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
285e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
285f0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
28600 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
28610 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
28620 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
28630 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
28640 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  OR_STAT4.    sql
28650 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
28660 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
28670 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
28680 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
28690 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
286a0 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
286b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
286c0 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
286d0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
286e0 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
286f0 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
28700 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
28710 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
28720 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  x ) break;.  }. 
28730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
28740 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28750 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
28760 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
28770 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
28780 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74  for a table of t
28790 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69  he join identifi
287a0 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65  ed by.** pBuilde
287b0 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
287c0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
287d0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
287e0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
287f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
28800 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
28810 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
28820 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
28830 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
28840 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
28850 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
28860 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  a.){.  WhereInfo
28870 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
28880 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
28890 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
288a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
288b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
288c0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
288d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
288e0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
288f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28900 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
28910 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
28920 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
28930 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
28940 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
28950 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
28960 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
28970 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
28980 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
28990 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
289a0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
289b0 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
289c0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
289d0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
289e0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
289f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
28a00 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
28a10 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54    int iTerm, mxT
28a20 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  erm;.  int nCons
28a30 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65  traint;.  int se
28a40 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  enIn = 0;       
28a50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28a60 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
28a70 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
28a80 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20  t seenVar = 0;  
28a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
28aa0 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73  ue if a non-cons
28ab0 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  tant constraint 
28ac0 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
28ad0 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20   iPhase;        
28ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
28af0 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a  const w/o IN, 1:
28b00 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e   const, 2: no IN
28b10 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68  ,  2: IN */.  Wh
28b20 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
28b30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28b40 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d  _OK;..  pWInfo =
28b50 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
28b60 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
28b70 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
28b80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
28b90 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
28ba0 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d  r->pWC;.  pNew =
28bb0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
28bc0 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66  .  pSrc = &pWInf
28bd0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
28be0 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54  New->iTab];.  pT
28bf0 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
28c00 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
28c10 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20  tual(pTab) );.  
28c20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
28c30 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
28c40 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
28c50 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72  pBuilder->pOrder
28c60 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  By);.  if( pIdxI
28c70 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
28c80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28c90 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
28ca0 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
28cb0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
28cc0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
28cd0 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
28ce0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
28cf0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
28d00 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70  eedFree = 0;.  p
28d10 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
28d20 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
28d30 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e  ge;.  nConstrain
28d40 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
28d50 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
28d60 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
28d70 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73  (db, pNew, nCons
28d80 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73  traint) ){.    s
28d90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
28da0 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
28db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
28dc0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  MEM;.  }..  for(
28dd0 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65  iPhase=0; iPhase
28de0 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a  <=3; iPhase++){.
28df0 20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20      if( !seenIn 
28e00 26 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30  && (iPhase&1)!=0
28e10 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65   ){.      iPhase
28e20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ++;.      if( iP
28e30 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a  hase>3 ) break;.
28e40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
28e50 65 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65  eenVar && iPhase
28e60 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >1 ) break;.    
28e70 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
28e80 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
28e90 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
28ea0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
28eb0 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69  raint;.    for(i
28ec0 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
28ed0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
28ee0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
28ef0 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
28f00 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
28f10 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
28f20 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
28f30 73 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29  switch( iPhase )
28f40 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30  {.        case 0
28f50 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
28f60 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65  s without IN ope
28f70 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
28f80 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
28f90 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ble = 0;.       
28fa0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
28fb0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
28fc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28fd0 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a      seenIn = 1;.
28fe0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28ff0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
29000 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20  >prereqRight!=0 
29010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
29020 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20  eenVar = 1;.    
29030 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29040 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
29050 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b  r & WO_IN)==0 ){
29060 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
29070 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
29080 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
29090 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
290a0 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
290b0 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
290c0 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72  with IN operator
290d0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  s */.          a
290e0 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b  ssert( seenIn );
290f0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
29100 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
29110 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
29120 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t==0);.         
29130 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
29140 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61  case 2:    /* Va
29150 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20  riables without 
29160 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
29170 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
29180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
29190 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
291a0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
291b0 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20  r & WO_IN)==0;. 
291c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
291d0 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
291e0 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20     /* Variables 
291f0 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20  with IN */.     
29200 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
29210 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29  nVar && seenIn )
29220 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
29230 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
29240 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
29250 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
29260 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61  .    memset(pUsa
29270 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
29280 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
29290 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
292a0 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
292b0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
292c0 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
292d0 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
292e0 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e  Str);.    pIdxIn
292f0 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
29300 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
29310 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49  xNum = 0;.    pI
29320 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
29330 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
29340 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
29350 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
29360 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
29370 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
29380 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
29390 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70  (double)2;.    p
293a0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
293b0 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20  edRows = 25;.   
293c0 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e   rc = vtabBestIn
293d0 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62  dex(pParse, pTab
293e0 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20  , pIdxInfo);.   
293f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
29400 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
29410 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f  exit;.    pIdxCo
29420 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
29430 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
29440 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
29450 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
29460 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
29470 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
29480 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20  mxTerm = -1;.   
29490 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
294a0 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69  LSlot>=nConstrai
294b0 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt );.    for(i=
294c0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
294d0 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54  ; i++) pNew->aLT
294e0 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  erm[i] = 0;.    
294f0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
29500 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66  tMask = 0;.    f
29510 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
29520 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
29530 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Cons++){.      i
29540 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61  f( (iTerm = pUsa
29550 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
29560 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  - 1)>=0 ){.     
29570 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
29580 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
29590 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
295a0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  =nConstraint.   
295b0 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20        || j<0.   
295c0 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d        || j>=pWC-
295d0 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  >nTerm.         
295e0 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  || pNew->aLTerm[
295f0 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
29600 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
29610 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
29620 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
29630 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
29640 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64  se, "%s.xBestInd
29650 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ex() malfunction
29660 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
29670 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
29680 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
29690 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
296a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
296b0 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74  e( iTerm==nConst
296c0 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20  raint-1 );.     
296d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
296e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
296f0 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e  tcase( j==pWC->n
29700 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20  Term-1 );.      
29710 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
29720 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e  a[j];.        pN
29730 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54  ew->prereq |= pT
29740 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
29750 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
29760 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c  ( iTerm<pNew->nL
29770 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Slot );.        
29780 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
29790 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  rm] = pTerm;.   
297a0 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
297b0 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
297c0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
297d0 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
297e0 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74  =15 );.        t
297f0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
29800 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  16 );.        if
29810 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55  ( iTerm<16 && pU
29820 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70  sage[i].omit ) p
29830 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
29840 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d  Mask |= 1<<iTerm
29850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
29860 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
29870 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
29880 20 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73           if( pUs
29890 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29  age[i].omit==0 )
298a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
298b0 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
298c0 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e  to use an IN con
298d0 73 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76  straint if the v
298e0 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20  irtual table.   
298f0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73           ** says
29900 20 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61   that the equiva
29910 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69  lent EQ constrai
29920 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66  nt cannot be saf
29930 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20  ely omitted..   
29940 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77           ** If w
29950 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e do attempt to 
29960 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74  use such a const
29970 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73  raint, some rows
29980 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20   might be.      
29990 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65        ** repeate
299a0 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e  d in the output.
299b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
299c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
299d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
299e0 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
299f0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69  that is constrai
29a00 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61  ned by an IN cla
29a10 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20  use may not.    
29a20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65        ** consume
29a30 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
29a40 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29  ause because (1)
29a50 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
29a60 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20   terms.         
29a70 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   ** is not neces
29a80 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  sarily related t
29a90 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f  o the order of o
29aa0 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a  utput terms and.
29ab0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29            ** (2)
29ac0 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74   Multiple output
29ad0 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
29ae0 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f  IN value will no
29af0 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20  t merge.        
29b00 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20    ** together.  
29b10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
29b20 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
29b30 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
29b40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29b50 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e    }.    if( i>=n
29b60 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
29b70 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
29b80 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20   = mxTerm+1;.   
29b90 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
29ba0 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e  >nLTerm<=pNew->n
29bb0 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70  LSlot );.      p
29bc0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  New->u.vtab.idxN
29bd0 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  um = pIdxInfo->i
29be0 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65  dxNum;.      pNe
29bf0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
29c00 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  ee = pIdxInfo->n
29c10 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b  eedToFreeIdxStr;
29c20 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
29c30 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
29c40 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  r = 0;.      pNe
29c50 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
29c60 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
29c70 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Str;.      pNew-
29c80 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
29c90 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66  d = (i8)(pIdxInf
29ca0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
29cb0 65 64 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ed ?.           
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cd0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49             pIdxI
29ce0 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20  nfo->nOrderBy : 
29cf0 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
29d00 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
29d10 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
29d20 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d  qlite3LogEstFrom
29d30 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d  Double(pIdxInfo-
29d40 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
29d50 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
29d60 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
29d70 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  t(pIdxInfo->esti
29d80 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20 20  matedRows);.    
29d90 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72    whereLoopInser
29da0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
29db0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
29dc0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
29dd0 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ee ){.        sq
29de0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
29df0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
29e00 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
29e10 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
29e20 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
29e30 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f  }.  }  ..whereLo
29e40 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a  opAddVtab_exit:.
29e50 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
29e60 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
29e70 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
29e80 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
29e90 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
29ea0 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
29eb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
29ec0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
29ed0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
29ee0 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  BLE */../*.** Ad
29ef0 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  d WhereLoop entr
29f00 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52  ies to handle OR
29f10 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f   terms.  This wo
29f20 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a  rks for either.*
29f30 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74  * btrees or virt
29f40 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  ual tables..*/.s
29f50 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
29f60 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f  oopAddOr(WhereLo
29f70 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
29f80 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78  der, Bitmask mEx
29f90 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  tra){.  WhereInf
29fa0 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
29fb0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
29fc0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
29fd0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
29fe0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
29ff0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
2a000 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2a010 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
2a020 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
2a030 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
2a040 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
2a050 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
2a060 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 2c  rSet sSum, sCur,
2a070 20 73 50 72 65 76 3b 0a 20 20 73 74 72 75 63 74   sPrev;.  struct
2a080 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2a090 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
2a0a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
2a0b0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
2a0c0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a0d0 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75  _AND_ONLY ) retu
2a0e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2a0f0 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
2a100 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
2a110 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2a120 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28  >pNew;.  memset(
2a130 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSum, 0, sizeof
2a140 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d  (sSum));.  pItem
2a150 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2a160 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2a170 54 61 62 3b 0a 20 20 69 66 28 20 21 48 61 73 52  Tab;.  if( !HasR
2a180 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54 61 62  owid(pItem->pTab
2a190 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2a1a0 45 5f 4f 4b 3b 0a 20 20 69 43 75 72 20 3d 20 70  E_OK;.  iCur = p
2a1b0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a  Item->iCursor;..
2a1c0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
2a1d0 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
2a1e0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2a1f0 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  K; pTerm++){.   
2a200 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2a210 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
2a220 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
2a230 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
2a240 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e  dexable & pNew->
2a250 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20  maskSelf)!=0 .  
2a260 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65    ){.      Where
2a270 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70  Clause * const p
2a280 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWC = &pTerm->u
2a290 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
2a2a0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20      WhereTerm * 
2a2b0 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d  const pOrWCEnd =
2a2c0 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43   &pOrWC->a[pOrWC
2a2d0 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  ->nTerm];.      
2a2e0 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
2a2f0 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  rm;.      int on
2a300 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e  ce = 1;.      in
2a310 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20  t i, j;.    .   
2a320 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a     sSubBuild = *
2a330 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20  pBuilder;.      
2a340 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72  sSubBuild.pOrder
2a350 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53  By = 0;.      sS
2a360 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d  ubBuild.pOrSet =
2a370 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66   &sCur;..      f
2a380 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
2a390 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
2a3a0 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
2a3b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
2a3c0 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
2a3d0 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
2a3e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
2a3f0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f  bBuild.pWC = &pO
2a400 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
2a410 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d  o->wc;.        }
2a420 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
2a430 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
2a440 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
2a450 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20  tempWC.pWInfo = 
2a460 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20  pWC->pWInfo;.   
2a470 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f         tempWC.pO
2a480 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
2a490 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20        tempWC.op 
2a4a0 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
2a4b0 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
2a4c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2a4d0 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
2a4e0 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  rm;.          sS
2a4f0 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74  ubBuild.pWC = &t
2a500 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d  empWC;.        }
2a510 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a520 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2a530 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72    }.        sCur
2a540 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  .n = 0;.#ifndef 
2a550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2a560 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
2a570 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2a580 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2a590 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
2a5a0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
2a5b0 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  l(&sSubBuild, mE
2a5c0 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  xtra);.        }
2a5d0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2a5e0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2a5f0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2a600 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c  dBtree(&sSubBuil
2a610 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  d, mExtra);.    
2a620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2a630 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2a640 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
2a650 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2a660 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
2a670 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
2a680 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
2a690 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
2a6a0 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
2a6b0 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
2a6c0 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
2a6d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
2a6e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
2a6f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a700 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72  whereOrMove(&sPr
2a710 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20  ev, &sSum);.    
2a720 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
2a730 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2a740 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20  i=0; i<sPrev.n; 
2a750 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2a760 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75    for(j=0; j<sCu
2a770 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  r.n; j++){.     
2a780 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
2a790 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50  Insert(&sSum, sP
2a7a0 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20  rev.a[i].prereq 
2a7b0 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72  | sCur.a[j].prer
2a7c0 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2a7f0 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e  (sPrev.a[i].rRun
2a800 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e  , sCur.a[j].rRun
2a810 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2a830 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2a840 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c  sPrev.a[i].nOut,
2a850 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29   sCur.a[j].nOut)
2a860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2a870 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2a890 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
2a8a0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  m = 1;.      pNe
2a8b0 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
2a8c0 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  Term;.      pNew
2a8d0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2a8e0 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
2a8f0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
2a900 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
2a910 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
2a920 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
2a930 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
2a940 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
2a950 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
2a960 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d  ITE_OK && i<sSum
2a970 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
2a980 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 75 6c    /* TUNING: Mul
2a990 74 69 70 6c 65 20 62 79 20 33 2e 35 20 66 6f 72  tiple by 3.5 for
2a9a0 20 74 68 65 20 73 65 63 6f 6e 64 61 72 79 20 74   the secondary t
2a9b0 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  able lookup */. 
2a9c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2a9d0 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
2a9e0 75 6e 20 2b 20 31 38 3b 0a 20 20 20 20 20 20 20  un + 18;.       
2a9f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
2aa00 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
2aa10 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
2aa20 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
2aa30 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
2aa40 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2aa50 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2aa60 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2aa70 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2aa80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
2aa90 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2aaa0 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74  bjects for all t
2aab0 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63  ables .*/.static
2aac0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2aad0 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75  dAll(WhereLoopBu
2aae0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
2aaf0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2ab00 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2ab10 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d  ->pWInfo;.  Bitm
2ab20 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a  ask mExtra = 0;.
2ab30 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
2ab40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
2ab50 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2ab60 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2ab70 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
2ab80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2ab90 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
2aba0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2abb0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
2abc0 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49  t nTabList = pWI
2abd0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69  nfo->nLevel;.  i
2abe0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2abf0 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  K;.  u8 priorJoi
2ac00 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65  nType = 0;.  Whe
2ac10 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20  reLoop *pNew;.. 
2ac20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
2ac30 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2ac40 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
2ac50 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
2ac60 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2ac70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
2ac80 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
2ac90 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
2aca0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61  pTabList->a; iTa
2acb0 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62  b<nTabList; iTab
2acc0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2acd0 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
2ace0 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
2acf0 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
2ad00 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
2ad10 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
2ad20 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
2ad30 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c  pItem->jointype|
2ad40 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26  priorJoinType) &
2ad50 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
2ad60 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
2ad70 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
2ad80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
2ad90 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65  rJoinType = pIte
2ada0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
2adb0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2adc0 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2add0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2ade0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
2adf0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2ae00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ae10 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2ae20 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65  AddBtree(pBuilde
2ae30 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
2ae40 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2ae50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ae60 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2ae70 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d  ddOr(pBuilder, m
2ae80 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
2ae90 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77    mPrior |= pNew
2aea0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2aeb0 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61  if( rc || db->ma
2aec0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
2aed0 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c  ak;.  }.  whereL
2aee0 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
2aef0 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
2af00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
2af10 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
2af20 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
2af30 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
2af40 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
2af50 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
2af60 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
2af70 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
2af80 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
2af90 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
2afa0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
2afb0 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
2afc0 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
2afd0 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
2afe0 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
2aff0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
2b000 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
2b010 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
2b020 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
2b030 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
2b040 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
2b050 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
2b060 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
2b070 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
2b080 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
2b090 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
2b0a0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2b0b0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
2b0c0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
2b0d0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2b0e0 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
2b0f0 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
2b100 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
2b110 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
2b120 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
2b130 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
2b140 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
2b150 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
2b160 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
2b170 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
2b180 44 49 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72  DISTINT do not r
2b190 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61  equire rows to a
2b1a0 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72  ppear in any par
2b1b0 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73  ticular order as
2b1c0 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69   long.** as equi
2b1d0 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20  velent rows are 
2b1e0 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2b1f0 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55  .  Thus for GROU
2b200 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
2b210 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42  T.** the pOrderB
2b220 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d  y terms can be m
2b230 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72  atched in any or
2b240 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52  der.  With ORDER
2b250 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72   BY, the .** pOr
2b260 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74  derBy terms must
2b270 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73   be matched in s
2b280 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69  trict left-to-ri
2b290 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ght order..*/.st
2b2a0 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61 74  atic i8 wherePat
2b2b0 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
2b2c0 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  y(.  WhereInfo *
2b2d0 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68  pWInfo,    /* Th
2b2e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2b2f0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2b300 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44  rderBy,   /* ORD
2b310 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
2b320 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c  Y or DISTINCT cl
2b330 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  ause to check */
2b340 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50  .  WherePath *pP
2b350 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ath,     /* The 
2b360 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65  WherePath to che
2b370 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ck */.  u16 wctr
2b380 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
2b390 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57   Might contain W
2b3a0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20  HERE_GROUPBY or 
2b3b0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2b3c0 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b3e0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2b3f0 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
2b400 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
2b410 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
2b420 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
2b430 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
2b440 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
2b450 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
2b460 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
2b470 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
2b480 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
2b490 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
2b4a0 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
2b4b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2b4c0 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
2b4d0 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
2b4e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b4f0 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
2b500 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
2b510 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
2b520 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
2b530 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
2b540 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
2b550 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
2b560 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
2b570 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
2b580 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
2b590 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
2b5a0 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
2b5b0 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
2b5c0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
2b5d0 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
2b5e0 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
2b5f0 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
2b600 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2b610 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65  use */.  u16 nKe
2b620 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  yCol;          /
2b630 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
2b640 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
2b650 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75  x */.  u16 nColu
2b660 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2b670 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2b680 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20  ordered columns 
2b690 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
2b6a0 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20    u16 nOrderBy; 
2b6b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b6c0 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  r terms in the O
2b6d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2b6e0 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2b6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2b700 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ex of WhereLoop 
2b710 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70  in pPath being p
2b720 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
2b730 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2b740 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2b750 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
2b760 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
2b770 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2b780 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65   for current Whe
2b790 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  reLoop */.  int 
2b7a0 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
2b7b0 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75    /* A column nu
2b7c0 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c  mber within tabl
2b7d0 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72  e iCur */.  Wher
2b7e0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30  eLoop *pLoop = 0
2b7f0 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65  ; /* Current Whe
2b800 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f  reLoop being pro
2b810 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65  cessed. */.  Whe
2b820 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
2b830 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
2b840 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
2b850 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2b860 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20  r *pOBExpr;     
2b870 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
2b880 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ion from the ORD
2b890 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2b8a0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2b8b0 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41  ;       /* COLLA
2b8c0 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  TE function from
2b8d0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2b8e0 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e  use term */.  In
2b8f0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
2b900 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2b910 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2b920 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69   pLoop */.  sqli
2b930 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
2b940 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  ->pParse->db;  /
2b950 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2b960 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ction */.  Bitma
2b970 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20  sk obSat = 0;   
2b980 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
2b990 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
2b9a0 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  fied so far */. 
2b9b0 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b   Bitmask obDone;
2b9c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2b9d0 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
2b9e0 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
2b9f0 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  k orderDistinctM
2ba00 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ask;  /* Mask of
2ba10 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65   all well-ordere
2ba20 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74  d loops */.  Bit
2ba30 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20  mask ready;     
2ba40 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2ba50 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
2ba60 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  */..  /*.  ** We
2ba70 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2ba80 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
2ba90 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  if it generates 
2baa0 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
2bab0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74  .  ** row of out
2bac0 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f  put.  A WhereLoo
2bad0 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20  p is one-row if 
2bae0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
2baf0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
2bb00 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64   **  (a) All ind
2bb10 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68  ex columns match
2bb20 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55   with WHERE_COLU
2bb30 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29  MN_EQ..  **  (b)
2bb40 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   The index is un
2bb50 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68  ique.  ** Any Wh
2bb60 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
2bb70 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2bb80 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
2bb90 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72  e rowid is one-r
2bba0 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f  ow..  ** Every o
2bbb0 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2bbc0 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57   will have the W
2bbd0 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20  HERE_ONEROW bit 
2bbe0 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a  set in wsFlags..
2bbf0 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    **.  ** We say
2bc00 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2bc10 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  s "order-distinc
2bc20 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  t" if the set of
2bc30 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20   columns from.  
2bc40 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  ** that WhereLoo
2bc50 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  p that are in th
2bc60 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2bc70 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
2bc80 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  for every.  ** r
2bc90 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ow of the WhereL
2bca0 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d  oop.  Every one-
2bcb0 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  row WhereLoop is
2bcc0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
2bcd0 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   ** order-distin
2bce0 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f  ct.   A WhereLoo
2bcf0 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f  p that has no co
2bd00 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44  lumns in the ORD
2bd10 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
2bd20 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64  * is not order-d
2bd30 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f  istinct. To be o
2bd40 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73  rder-distinct is
2bd50 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73   not quite the s
2bd60 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a  ame as being.  *
2bd70 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61  * UNIQUE since a
2bd80 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f   UNIQUE column o
2bd90 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65  r index can have
2bda0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
2bdb0 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55  hat .  ** are NU
2bdc0 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75  LL and NULL valu
2bdd0 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  es are equivalen
2bde0 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  t for the purpos
2bdf0 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69  e of order-disti
2be00 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20  nct..  ** To be 
2be10 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20  order-distinct, 
2be20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  the columns must
2be30 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e   be UNIQUE and N
2be40 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  OT NULL..  **.  
2be50 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
2be60 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61   a table is alwa
2be70 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  ys UNIQUE and NO
2be80 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76  T NULL so whenev
2be90 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69  er the.  ** rowi
2bea0 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  d appears in the
2beb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2bec0 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2bed0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
2bee0 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
2bef0 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  lly order-distin
2bf00 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65  ct..  */..  asse
2bf10 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
2bf20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69  );..  /* Sortabi
2bf30 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20  lity of virtual 
2bf40 74 61 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d  tables is determ
2bf50 69 6e 65 64 20 62 79 20 74 68 65 20 78 42 65 73  ined by the xBes
2bf60 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20  tIndex method.  
2bf70 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ** of the virtua
2bf80 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a  l table itself *
2bf90 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77  /.  if( pLast->w
2bfa0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2bfb0 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
2bfc0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f     testcase( nLo
2bfd0 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65  op>0 );  /* True
2bfe0 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70   when outer loop
2bff0 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e  s are one-row an
2c000 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20  d match .       
2c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c020 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42     ** no ORDER B
2c030 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72  Y terms */.    r
2c040 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76  eturn pLast->u.v
2c050 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20  tab.isOrdered;. 
2c060 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26   }.  if( nLoop &
2c070 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  & OptimizationDi
2c080 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
2c090 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
2c0a0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
2c0b0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
2c0c0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74  erBy->nExpr;.  t
2c0d0 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42  estcase( nOrderB
2c0e0 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  y==BMS-1 );.  if
2c0f0 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31  ( nOrderBy>BMS-1
2c100 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2c110 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   Cannot optimize
2c120 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52   overly large OR
2c130 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f  DER BYs */.  isO
2c140 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
2c150 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53  ;.  obDone = MAS
2c160 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31  KBIT(nOrderBy)-1
2c170 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ;.  orderDistinc
2c180 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61  tMask = 0;.  rea
2c190 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c  dy = 0;.  for(iL
2c1a0 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69  oop=0; isOrderDi
2c1b0 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c  stinct && obSat<
2c1c0 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c  obDone && iLoop<
2c1d0 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  =nLoop; iLoop++)
2c1e0 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e  {.    if( iLoop>
2c1f0 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f  0 ) ready |= pLo
2c200 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2c210 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c    pLoop = iLoop<
2c220 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61  nLoop ? pPath->a
2c230 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c  Loop[iLoop] : pL
2c240 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ast;.    assert(
2c250 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2c260 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2c270 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20  TABLE)==0 );.   
2c280 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
2c290 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
2c2a0 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
2c2b0 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  ;..    /* Mark o
2c2c0 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20  ff any ORDER BY 
2c2d0 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61  term X that is a
2c2e0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
2c2f0 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
2c300 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20  he current loop 
2c310 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
2c320 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  is term in the W
2c330 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75  HERE.    ** clau
2c340 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  se of the form X
2c350 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20   IS NULL or X=? 
2c360 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f  that reference o
2c370 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  nly outer.    **
2c380 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20   loops..    */. 
2c390 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
2c3a0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
2c3b0 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2c3c0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2c3d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42  tinue;.      pOB
2c3e0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
2c3f0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
2c400 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2c410 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
2c420 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2c430 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2c440 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
2c450 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
2c460 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
2c470 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
2c480 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Term(&pWInfo->sW
2c490 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72  C, iCur, pOBExpr
2c4a0 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->iColumn,.     
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4c0 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c    ~ready, WO_EQ|
2c4d0 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20  WO_ISNULL, 0);. 
2c4e0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
2c4f0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2c500 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2c510 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29  eOperator&WO_EQ)
2c520 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e  !=0 && pOBExpr->
2c530 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
2c540 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2c550 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20   *z1, *z2;.     
2c560 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2c570 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2c580 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
2c590 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2c5a0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2c5b0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2c5c0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2c5d0 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43  .        z1 = pC
2c5e0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
2c5f0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2c600 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2c610 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2c620 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
2c630 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2c640 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2c650 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2c660 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z2 = pColl->zN
2c670 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2c680 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2c690 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e  z1, z2)!=0 ) con
2c6a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2c6b0 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2c6c0 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
2c6d0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
2c6e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2c6f0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
2c700 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
2c710 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c720 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
2c730 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
2c740 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a     nKeyCol = 0;.
2c750 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2c760 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
2c770 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
2c780 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2c790 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
2c7a0 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
2c7b0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2c7c0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2c7d0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
2c7e0 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   = pIndex->nKeyC
2c7f0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  ol;.        nCol
2c800 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43  umn = pIndex->nC
2c810 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61  olumn;.        a
2c820 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
2c830 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61  nKeyCol+1 || !Ha
2c840 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
2c850 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20  Table) );.      
2c860 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
2c870 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
2c880 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21  mn-1]==(-1) || !
2c890 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
2c8a0 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  >pTable));.     
2c8b0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2c8c0 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ct = pIndex->onE
2c8d0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
2c8e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2c8f0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
2c900 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
2c910 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20   index and deal 
2c920 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20  with the ones.  
2c930 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
2c940 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  not constrained 
2c950 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20  by == or IN..   
2c960 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20     */.      rev 
2c970 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20  = revSet = 0;.  
2c980 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
2c990 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  mns = 0;.      f
2c9a0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d  or(j=0; j<nColum
2c9b0 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2c9c0 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20   u8 bOnce;   /* 
2c9d0 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20  True to run the 
2c9e0 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20  ORDER BY search 
2c9f0 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20  loop */..       
2ca00 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
2ca10 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72   and IS NULL ter
2ca20 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ms */.        if
2ca30 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
2ca40 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2ca50 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
2ca60 65 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20  e.nSkip==0.     
2ca70 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f      && ((i = pLo
2ca80 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65  op->aLTerm[j]->e
2ca90 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f  Operator) & (WO_
2caa0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  EQ|WO_ISNULL))!=
2cab0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2cac0 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57         if( i & W
2cad0 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
2cae0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2caf0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2cb00 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
2cb10 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2cb20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2cb30 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
2cb40 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
2cb50 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
2cb60 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  t the column num
2cb70 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ber in the table
2cb80 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73   (iColumn) and s
2cb90 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ort order.      
2cba0 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f    ** (revIdx) fo
2cbb0 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  r the j-th colum
2cbc0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  n of the index..
2cbd0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2cbe0 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b     if( pIndex ){
2cbf0 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
2cc00 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
2cc10 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
2cc20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e      revIdx = pIn
2cc30 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
2cc40 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j];.          if
2cc50 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ( iColumn==pInde
2cc60 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
2cc70 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b   ) iColumn = -1;
2cc80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2cc90 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
2cca0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2ccb0 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
2ccc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2ccd0 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
2cce0 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
2ccf0 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
2cd00 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
2cd10 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
2cd20 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
2cd30 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  ordered.        
2cd40 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
2cd50 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
2cd60 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
2cd70 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
2cd80 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
2cd90 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
2cda0 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
2cdb0 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
2cdc0 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
2cdd0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2cde0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2cdf0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2ce00 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
2ce10 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
2ce20 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
2ce30 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
2ce40 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
2ce50 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
2ce60 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68 61  and and mark tha
2ce70 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  t ORDER BY term 
2ce80 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  off .        */.
2ce90 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20          bOnce = 
2cea0 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  1;.        isMat
2ceb0 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
2cec0 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
2ced0 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
2cee0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2cef0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2cf00 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2cf10 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
2cf20 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2cf30 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2cf40 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2cf50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
2cf60 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
2cf70 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
2cf80 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Y );.          t
2cf90 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
2cfa0 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
2cfb0 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20  INCTBY );.      
2cfc0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2cfd0 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f  ags & (WHERE_GRO
2cfe0 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49  UPBY|WHERE_DISTI
2cff0 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e  NCTBY))==0 ) bOn
2d000 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
2d010 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
2d020 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
2d030 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d040 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2d050 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2d060 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d070 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2d080 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
2d090 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d0a0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2d0b0 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2d0c0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2d0d0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2d0e0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2d0f0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2d100 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2d110 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2d120 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2d130 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
2d140 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2d150 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
2d160 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  me, pIndex->azCo
2d170 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74  ll[j])!=0 ) cont
2d180 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2d190 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61  }.          isMa
2d1a0 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
2d1b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2d1c0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2d1d0 69 73 4d 61 74 63 68 20 26 26 20 28 70 57 49 6e  isMatch && (pWIn
2d1e0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2d1f0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
2d200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2d210 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
2d220 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
2d230 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
2d240 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
2d250 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  .          ** So
2d260 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
2d270 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
2d280 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
2d290 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2d2a0 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
2d2b0 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
2d2c0 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42  revIdx)!=pOrderB
2d2d0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
2d2e0 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b  r ) isMatch = 0;
2d2f0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2d300 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2d310 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
2d320 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
2d330 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
2d340 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
2d350 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
2d360 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
2d370 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
2d380 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d3a0 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
2d3b0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2d3c0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
2d3d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d3e0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
2d3f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2d400 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
2d410 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
2d420 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
2d430 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
2d440 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d450 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
2d460 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   match found */.
2d470 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
2d480 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20  =0 || j<nKeyCol 
2d490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
2d4a0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
2d4b0 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
2d4c0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2d4d0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
2d4e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d4f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
2d510 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20  * end Loop over 
2d520 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  all index column
2d530 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  s */.      if( d
2d540 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29  istinctColumns )
2d550 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
2d560 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
2d570 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct==0 );.      
2d580 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2d590 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
2d5a0 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e     } /* end-if n
2d5b0 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20  ot one-row */.. 
2d5c0 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
2d5d0 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42  ny other ORDER B
2d5e0 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66  Y terms that ref
2d5f0 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a  erence pLoop */.
2d600 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
2d610 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2d620 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2d630 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sk |= pLoop->mas
2d640 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
2d650 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
2d660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2d670 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20  Expr *p;.       
2d680 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a   Bitmask mTerm;.
2d690 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
2d6a0 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
2d6b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2d6c0 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
2d6d0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
2d6e0 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 65 78 70       mTerm = exp
2d6f0 72 54 61 62 6c 65 55 73 61 67 65 28 26 70 57 49  rTableUsage(&pWI
2d700 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29  nfo->sMaskSet,p)
2d710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54  ;.        if( mT
2d720 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74  erm==0 && !sqlit
2d730 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
2d740 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (p) ) continue;.
2d750 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65          if( (mTe
2d760 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63  rm&~orderDistinc
2d770 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  tMask)==0 ){.   
2d780 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
2d790 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
2d7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d7b0 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74    }.  } /* End t
2d7c0 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  he loop over all
2d7d0 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d   WhereLoops from
2d7e0 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e   outer-most down
2d7f0 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a   to inner-most *
2d800 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f  /.  if( obSat==o
2d810 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28  bDone ) return (
2d820 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  i8)nOrderBy;.  i
2d830 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69  f( !isOrderDisti
2d840 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  nct ){.    for(i
2d850 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30  =nOrderBy-1; i>0
2d860 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  ; i--){.      Bi
2d870 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49  tmask m = MASKBI
2d880 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  T(i) - 1;.      
2d890 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d  if( (obSat&m)==m
2d8a0 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20   ) return i;.   
2d8b0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
2d8c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
2d8d0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52  ;.}..#ifdef WHER
2d8e0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
2d8f0 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20  * For debugging 
2d900 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61  use only: */.sta
2d910 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2d920 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68  wherePathName(Wh
2d930 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
2d940 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65  int nLoop, Where
2d950 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20  Loop *pLast){.  
2d960 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d  static char zNam
2d970 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  e[65];.  int i;.
2d980 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f    for(i=0; i<nLo
2d990 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b  op; i++){ zName[
2d9a0 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  i] = pPath->aLoo
2d9b0 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69  p[i]->cId; }.  i
2d9c0 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65  f( pLast ) zName
2d9d0 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63  [i++] = pLast->c
2d9e0 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d  Id;.  zName[i] =
2d9f0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61   0;.  return zNa
2da00 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  me;.}.#endif.../
2da10 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c  *.** Given the l
2da20 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
2da30 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e   objects at pWIn
2da40 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73  fo->pLoops, this
2da50 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65   routine.** atte
2da60 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65  mpts to find the
2da70 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
2da80 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61  h that visits ea
2da90 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20  ch WhereLoop.** 
2daa0 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68  once.  This path
2dab0 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20   is then loaded 
2dac0 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d  into the pWInfo-
2dad0 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c  >a[].pWLoop fiel
2dae0 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65  ds..**.** Assume
2daf0 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20   that the total 
2db00 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
2db10 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
2db20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65  need to be sorte
2db30 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f  d.** will be nRo
2db40 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a  wEst (in the 10*
2db50 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74  log2 representat
2db60 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72  ion).  Or, ignor
2db70 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73  e sorting.** cos
2db80 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30  ts if nRowEst==0
2db90 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
2dba0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
2dbb0 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  ess or SQLITE_NO
2dbc0 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  MEM of a memory 
2dbd0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72  allocation.** er
2dbe0 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
2dbf0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
2dc00 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49  athSolver(WhereI
2dc10 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67  nfo *pWInfo, Log
2dc20 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  Est nRowEst){.  
2dc30 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20  int mxChoice;   
2dc40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2dc50 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
2dc60 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
2dc70 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
2dc80 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
2dc90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2dca0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
2dcb0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72  he join */.  Par
2dcc0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
2dcd0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
2dce0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
2dcf0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2dd00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2dd10 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2dd20 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ion */.  int iLo
2dd30 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
2dd40 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2dd50 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d  er over the term
2dd60 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
2dd70 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20  .  int ii, jj;  
2dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dd90 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2dda0 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20  .  int mxI = 0; 
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ddc0 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e  Index of next en
2ddd0 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a  try to replace *
2dde0 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
2ddf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2de00 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
2de10 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
2de20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 43 6f   */.  LogEst rCo
2de30 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
2de40 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61 74  /* Cost of a pat
2de50 68 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f  h */.  LogEst nO
2de60 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
2de70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
2de80 74 70 75 74 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  tputs */.  LogEs
2de90 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20  t mxCost = 0;   
2dea0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2deb0 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66  cost of a set of
2dec0 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45   paths */.  LogE
2ded0 73 74 20 6d 78 4f 75 74 20 3d 20 30 3b 20 20 20  st mxOut = 0;   
2dee0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2def0 20 6e 4f 75 74 20 76 61 6c 75 65 20 6f 6e 20 74   nOut value on t
2df00 68 65 20 73 65 74 20 6f 66 20 70 61 74 68 73 20  he set of paths 
2df10 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46  */.  int nTo, nF
2df20 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rom;           /
2df30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
2df40 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f  d entries in aTo
2df50 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a  [] and aFrom[] *
2df60 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
2df70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
2df80 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73   All nFrom paths
2df90 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73   at the previous
2dfa0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
2dfb0 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20  ePath *aTo;     
2dfc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f        /* The nTo
2dfd0 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74   best paths at t
2dfe0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c  he current level
2dff0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2e000 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *pFrom;         
2e010 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
2e020 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65   aFrom[] that we
2e030 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
2e040 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2e050 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pTo;           /
2e060 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
2e070 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72  aTo[] that we ar
2e080 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
2e090 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c    WhereLoop *pWL
2e0a0 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  oop;        /* O
2e0b0 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ne of the WhereL
2e0c0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
2e0d0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b   WhereLoop **pX;
2e0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2e0f0 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68  ed to divy up th
2e100 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20  e pSpace memory 
2e110 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
2e120 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2e130 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f  * Temporary memo
2e140 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ry used by this 
2e150 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50  routine */..  pP
2e160 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2e170 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
2e180 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f  arse->db;.  nLoo
2e190 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  p = pWInfo->nLev
2e1a0 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  el;.  /* TUNING:
2e1b0 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72   For simple quer
2e1c0 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65  ies, only the be
2e1d0 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b  st path is track
2e1e0 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77  ed..  ** For 2-w
2e1f0 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20  ay joins, the 5 
2e200 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66  best paths are f
2e210 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f  ollowed..  ** Fo
2e220 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20  r joins of 3 or 
2e230 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61  more tables, tra
2e240 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70  ck the 10 best p
2e250 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69  aths */.  mxChoi
2e260 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20  ce = (nLoop==1) 
2e270 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20  ? 1 : (nLoop==2 
2e280 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73  ? 5 : 10);.  ass
2e290 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e  ert( nLoop<=pWIn
2e2a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
2e2b0 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41  rc );.  WHERETRA
2e2c0 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d  CE(0x002, ("----
2e2d0 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22   begin solver\n"
2e2e0 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  ));..  /* Alloca
2e2f0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
2e300 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20  e space for aTo 
2e310 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69  and aFrom */.  i
2e320 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72  i = (sizeof(Wher
2e330 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68  ePath)+sizeof(Wh
2e340 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29  ereLoop*)*nLoop)
2e350 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70  *mxChoice*2;.  p
2e360 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44  Space = sqlite3D
2e370 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69  bMallocRaw(db, i
2e380 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65  i);.  if( pSpace
2e390 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2e3a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f  ITE_NOMEM;.  aTo
2e3b0 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70   = (WherePath*)p
2e3c0 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d  Space;.  aFrom =
2e3d0 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20   aTo+mxChoice;. 
2e3e0 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30   memset(aFrom, 0
2e3f0 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30  , sizeof(aFrom[0
2e400 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65  ]));.  pX = (Whe
2e410 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b  reLoop**)(aFrom+
2e420 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72  mxChoice);.  for
2e430 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20  (ii=mxChoice*2, 
2e440 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b  pFrom=aTo; ii>0;
2e450 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20   ii--, pFrom++, 
2e460 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20  pX += nLoop){.  
2e470 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d    pFrom->aLoop =
2e480 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   pX;.  }..  /* S
2e490 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77  eed the search w
2e4a0 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65  ith a single Whe
2e4b0 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e  rePath containin
2e4c0 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70  g zero WhereLoop
2e4d0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e  s..  **.  ** TUN
2e4e0 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20  ING: Do not let 
2e4f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74  the number of it
2e500 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76  erations go abov
2e510 65 20 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f  e 25.  If the co
2e520 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75  st.  ** of compu
2e530 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ting an automati
2e540 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70  c index is not p
2e550 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20  aid back within 
2e560 74 68 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a  the first 25.  *
2e570 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20  * rows, then do 
2e580 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f  not use the auto
2e590 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a  matic index. */.
2e5a0 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20    aFrom[0].nRow 
2e5b0 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51  = MIN(pParse->nQ
2e5c0 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20  ueryLoop, 46);  
2e5d0 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69  assert( 46==sqli
2e5e0 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b  te3LogEst(25) );
2e5f0 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20  .  nFrom = 1;.. 
2e600 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74   /* Precompute t
2e610 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  he cost of sorti
2e620 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  ng the final res
2e630 75 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65 20  ult set, if the 
2e640 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73  caller.  ** to s
2e650 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2e660 28 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64  () was concerned
2e670 20 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a   about sorting *
2e680 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
2e690 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e  pOrderBy==0 || n
2e6a0 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  RowEst==0 ){.   
2e6b0 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
2e6c0 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 72  red = 0;.    nOr
2e6d0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  derBy = 0;.  }el
2e6e0 73 65 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d  se{.    aFrom[0]
2e6f0 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 2d 31 3b  .isOrdered = -1;
2e700 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
2e710 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2e720 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20  ->nExpr;.  }..  
2e730 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
2e740 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
2e750 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
2e760 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
2e770 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
2e780 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
2e790 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
2e7a0 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
2e7b0 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
2e7c0 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
2e7d0 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
2e7e0 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
2e7f0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
2e800 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
2e810 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
2e820 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
2e830 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
2e840 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
2e850 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
2e860 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
2e870 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
2e880 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
2e890 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  p){.        Bitm
2e8a0 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20  ask maskNew;.   
2e8b0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
2e8c0 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
2e8d0 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d    i8 isOrdered =
2e8e0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
2e8f0 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  d;.        if( (
2e900 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26  pWLoop->prereq &
2e910 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f   ~pFrom->maskLoo
2e920 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
2e930 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
2e940 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  WLoop->maskSelf 
2e950 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  & pFrom->maskLoo
2e960 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
2e970 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  ;.        /* At 
2e980 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f  this point, pWLo
2e990 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  op is a candidat
2e9a0 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74  e to be the next
2e9b0 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20   loop. .        
2e9c0 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63  ** Compute its c
2e9d0 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ost */.        r
2e9e0 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Cost = sqlite3Lo
2e9f0 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
2ea00 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
2ea10 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
2ea20 77 29 3b 0a 20 20 20 20 20 20 20 20 72 43 6f 73  w);.        rCos
2ea30 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
2ea40 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f  tAdd(rCost, pFro
2ea50 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20  m->rCost);.     
2ea60 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d     nOut = pFrom-
2ea70 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e  >nRow + pWLoop->
2ea80 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61  nOut;.        ma
2ea90 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
2eaa0 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
2eab0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2eac0 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65      if( isOrdere
2ead0 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d<0 ){.         
2eae0 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65   isOrdered = whe
2eaf0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
2eb00 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20  rderBy(pWInfo,. 
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
2eb30 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70  rderBy, pFrom, p
2eb40 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2eb50 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2eb60 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c            iLoop,
2eb70 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73   pWLoop, &revMas
2eb80 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
2eb90 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
2eba0 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
2ebb0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
2ebc0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45      /* TUNING: E
2ebd0 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66  stimated cost of
2ebe0 20 73 6f 72 74 69 6e 67 20 69 73 20 4e 2a 6c 6f   sorting is N*lo
2ebf0 67 28 4e 29 2e 0a 20 20 20 20 20 20 20 20 20 20  g(N)..          
2ec00 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 72 64 65    ** If the orde
2ec10 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20  r-by clause has 
2ec20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79  X terms but only
2ec30 20 74 68 65 20 6c 61 73 74 20 59 20 74 65 72 6d   the last Y term
2ec40 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
2ec50 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65   are out of orde
2ec60 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f  r, then block-so
2ec70 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63  rting will reduc
2ec80 65 20 74 68 65 20 73 6f 72 74 69 6e 67 0a 20 20  e the sorting.  
2ec90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 73            ** cos
2eca0 74 20 74 6f 20 4e 2a 6c 6f 67 28 4e 29 2a 6c 6f  t to N*log(N)*lo
2ecb0 67 28 59 2f 58 29 2e 20 20 54 68 65 20 6c 6f 67  g(Y/X).  The log
2ecc0 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20 63 6f  (Y/X) term is co
2ecd0 6d 70 75 74 65 64 0a 20 20 20 20 20 20 20 20 20  mputed.         
2ece0 20 20 20 2a 2a 20 62 79 20 72 53 63 61 6c 65 2e     ** by rScale.
2ecf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2ed00 54 4f 44 4f 3a 20 53 68 6f 75 6c 64 20 74 68 65  TODO: Should the
2ed10 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 67 65   sorting cost ge
2ed20 74 20 61 20 73 6d 61 6c 6c 20 6d 75 6c 74 69 70  t a small multip
2ed30 6c 69 65 72 20 74 6f 20 68 65 6c 70 0a 20 20 20  lier to help.   
2ed40 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 63           ** disc
2ed50 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f  ourage the use o
2ed60 66 20 73 6f 72 74 69 6e 67 20 61 6e 64 20 65 6e  f sorting and en
2ed70 63 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20  courage the use 
2ed80 6f 66 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  of index.       
2ed90 20 20 20 20 20 2a 2a 20 73 63 61 6e 73 20 69 6e       ** scans in
2eda0 73 74 65 61 64 3f 0a 20 20 20 20 20 20 20 20 20  stead?.         
2edb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2edc0 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c    LogEst rScale,
2edd0 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 20 20   rSortCost;.    
2ede0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2edf0 6e 4f 72 64 65 72 42 79 3e 30 20 29 3b 0a 20 20  nOrderBy>0 );.  
2ee00 20 20 20 20 20 20 20 20 20 20 72 53 63 61 6c 65            rScale
2ee10 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2ee20 28 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64  ((nOrderBy-isOrd
2ee30 65 72 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72  ered)*100/nOrder
2ee40 42 79 29 20 2d 20 36 36 3b 0a 20 20 20 20 20 20  By) - 66;.      
2ee50 20 20 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20        rSortCost 
2ee60 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73 74 4c  = nRowEst + estL
2ee70 6f 67 28 6e 52 6f 77 45 73 74 29 20 2b 20 72 53  og(nRowEst) + rS
2ee80 63 61 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  cale;.          
2ee90 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65    /* TUNING: The
2eea0 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65   cost of impleme
2eeb0 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20 75  nting DISTINCT u
2eec0 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69 73  sing a B-TREE is
2eed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2eee0 61 6c 73 6f 20 4e 2a 6c 6f 67 28 4e 29 20 62 75  also N*log(N) bu
2eef0 74 20 69 74 20 68 61 73 20 61 20 6c 61 72 67 65  t it has a large
2ef00 72 20 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72  r constant of pr
2ef10 6f 70 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 0a 20  oportionality.. 
2ef20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 75             ** Mu
2ef30 6c 74 69 70 6c 79 20 62 79 20 33 2e 30 2e 20 2a  ltiply by 3.0. *
2ef40 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
2ef50 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
2ef60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
2ef70 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 72 53 6f 72              rSor
2ef90 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 20  tCost += 16;.   
2efa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2efb0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
2efc0 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20  E(0x002,.       
2efd0 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73          ("---- s
2efe0 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25  ort cost=%-3d (%
2eff0 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20  d/%d) increases 
2f000 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64  cost %3d to %-3d
2f010 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2f020 20 20 20 20 20 72 53 6f 72 74 43 6f 73 74 2c 20       rSortCost, 
2f030 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65  (nOrderBy-isOrde
2f040 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20  red), nOrderBy, 
2f050 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20  rCost,.         
2f060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
2f070 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c 72 53  gEstAdd(rCost,rS
2f080 6f 72 74 43 6f 73 74 29 29 29 3b 0a 20 20 20 20  ortCost)));.    
2f090 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
2f0a0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2f0b0 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73  (rCost, rSortCos
2f0c0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
2f0d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2f0e0 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
2f0f0 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
2f100 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2f110 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
2f120 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73   see if pWLoop s
2f130 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74  hould be added t
2f140 6f 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62  o the mxChoice b
2f150 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
2f160 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
2f170 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
2f180 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
2f190 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
2f1a0 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
2f1b0 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  New.           &
2f1c0 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72  & ((pTo->isOrder
2f1d0 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 38 30  ed^isOrdered)&80
2f1e0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2f1f0 26 26 20 28 28 70 54 6f 2d 3e 72 43 6f 73 74 3c  && ((pTo->rCost<
2f200 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e  =rCost && pTo->n
2f210 52 6f 77 3c 3d 6e 4f 75 74 29 20 7c 7c 0a 20 20  Row<=nOut) ||.  
2f220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
2f230 54 6f 2d 3e 72 43 6f 73 74 3e 3d 72 43 6f 73 74  To->rCost>=rCost
2f240 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e   && pTo->nRow>=n
2f250 4f 75 74 29 29 0a 20 20 20 20 20 20 20 20 20 20  Out)).          
2f260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
2f270 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f  estcase( jj==nTo
2f280 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
2f290 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2f2a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2f2b0 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e         if( jj>=n
2f2c0 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  To ){.          
2f2d0 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
2f2e0 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f  e && rCost>=mxCo
2f2f0 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  st ){.#ifdef WHE
2f300 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
2f310 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
2f320 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2f330 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
2f340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2f350 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2f360 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
2f370 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
2f380 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
2f390 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2f3a0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
2f3b0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
2f3c0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3e0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
2f3f0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
2f400 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
2f410 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2f420 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2f430 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f440 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 6e        /* Add a n
2f450 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20 61  ew Path to the a
2f460 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20  To[] set */.    
2f470 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78        if( nTo<mx
2f480 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
2f490 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73        /* Increas
2f4a0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2f4b0 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65  e aTo set by one
2f4c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2f4d0 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20  jj = nTo++;.    
2f4e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
2f500 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68  path replaces th
2f510 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f  e prior worst to
2f520 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f   keep count belo
2f530 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20  w mxChoice */.  
2f540 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d            jj = m
2f550 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xI;.          }.
2f560 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20            pTo = 
2f570 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66  &aTo[jj];.#ifdef
2f580 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2f590 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
2f5a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2f5b0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
2f5c0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
2f5d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2f5e0 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63  ntf("New    %s c
2f5f0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
2f600 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
2f610 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
2f620 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
2f630 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
2f640 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
2f650 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2f660 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
2f670 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
2f680 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
2f690 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dif.        }els
2f6a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
2f6b0 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f   pTo->rCost<=rCo
2f6c0 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c  st && pTo->nRow<
2f6d0 3d 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65 66 20  =nOut ){.#ifdef 
2f6e0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2f6f0 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
2f700 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2f710 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
2f720 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
2f730 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2f740 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
2f750 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20            "Skip 
2f760 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
2f770 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
2f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f790 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
2f7a0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
2f7b0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
2f7c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f7d0 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
2f7e0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
2f7f0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
2f800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2f810 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73  bugPrintf("   vs
2f820 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64   %s cost=%-3d,%d
2f830 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
2f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f850 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
2f860 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
2f870 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
2f880 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
2f890 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
2f8a0 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f  Ordered>=0 ? pTo
2f8b0 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ->isOrdered+'0' 
2f8c0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
2f8d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2f8e0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2f8f0 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
2f900 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Cost );.        
2f910 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2f920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f930 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2f940 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b  o->rCost==rCost+
2f950 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 );.          /
2f960 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74  * A new and bett
2f970 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70  er score for a p
2f980 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65  reviously create
2f990 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74  d equivalent pat
2f9a0 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  h */.#ifdef WHER
2f9b0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
2f9c0 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
2f9d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2f9e0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
2f9f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2fa00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
2fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d  "Update %s cost=
2fa30 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
2fa40 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
2fa50 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2fa60 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
2fa70 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
2fa80 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
2fa90 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
2faa0 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
2fab0 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
2fac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2fad0 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73  bugPrintf("  was
2fae0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
2faf0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
2fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2fb10 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
2fb20 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
2fb30 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
2fb40 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
2fb50 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
2fb60 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
2fb70 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
2fb80 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
2fb90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2fba0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
2fbb0 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
2fbc0 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
2fbd0 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
2fbe0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
2fbf0 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
2fc00 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
2fc10 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
2fc20 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
2fc30 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
2fc40 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
2fc50 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
2fc60 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
2fc70 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
2fc80 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
2fc90 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
2fca0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
2fcb0 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
2fcc0 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
2fcd0 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
2fce0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
2fcf0 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
2fd00 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
2fd10 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
2fd20 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d  .          mxI =
2fd30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   0;.          mx
2fd40 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43  Cost = aTo[0].rC
2fd50 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  ost;.          m
2fd60 78 4f 75 74 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  xOut = aTo[0].nR
2fd70 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
2fd80 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
2fd90 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
2fda0 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2fdc0 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
2fdd0 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74  t || (pTo->rCost
2fde0 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d  ==mxCost && pTo-
2fdf0 3e 6e 52 6f 77 3e 6d 78 4f 75 74 29 20 29 7b 0a  >nRow>mxOut) ){.
2fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
2fe10 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73  Cost = pTo->rCos
2fe20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
2fe30 20 6d 78 4f 75 74 20 3d 20 70 54 6f 2d 3e 6e 52   mxOut = pTo->nR
2fe40 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow;.            
2fe50 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20    mxI = jj;.    
2fe60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fe70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2fe80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
2fe90 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2fea0 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32  _ENABLED  /* >=2
2feb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2fec0 74 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32  te3WhereTrace>=2
2fed0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2fee0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d  3DebugPrintf("--
2fef0 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25  -- after round %
2ff00 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70  d ----\n", iLoop
2ff10 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
2ff20 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e  0, pTo=aTo; ii<n
2ff30 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29  To; ii++, pTo++)
2ff40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2ff50 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
2ff60 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77  s cost=%-3d nrow
2ff70 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  =%-3d order=%c",
2ff80 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72  .           wher
2ff90 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
2ffa0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
2ffb0 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f  >rCost, pTo->nRo
2ffc0 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
2ffd0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
2ffe0 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
2fff0 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20  d+'0') : '?');. 
30000 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
30010 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20  isOrdered>0 ){. 
30020 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30030 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65  DebugPrintf(" re
30040 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f  v=0x%llx\n", pTo
30050 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->revLoop);.    
30060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30070 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
30080 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
30090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
300a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
300b0 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72     /* Swap the r
300c0 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e  oles of aFrom an
300d0 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65  d aTo for the ne
300e0 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  xt generation */
300f0 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f  .    pFrom = aTo
30100 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f  ;.    aTo = aFro
30110 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70  m;.    aFrom = p
30120 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20  From;.    nFrom 
30130 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66  = nTo;.  }..  if
30140 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20  ( nFrom==0 ){.  
30150 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
30160 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75  g(pParse, "no qu
30170 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a  ery solution");.
30180 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
30190 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  e(db, pSpace);. 
301a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
301b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20  _ERROR;.  }.  . 
301c0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77   /* Find the low
301d0 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20  est cost path.  
301e0 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65  pFrom will be le
301f0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
30200 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46  hat path */.  pF
30210 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66  rom = aFrom;.  f
30220 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f  or(ii=1; ii<nFro
30230 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
30240 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61  ( pFrom->rCost>a
30250 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29  From[ii].rCost )
30260 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b   pFrom = &aFrom[
30270 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ii];.  }.  asser
30280 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
30290 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a  l==nLoop );.  /*
302a0 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74   Load the lowest
302b0 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20   cost path into 
302c0 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28  pWInfo */.  for(
302d0 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
302e0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
302f0 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a      WhereLevel *
30300 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
30310 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20  >a + iLoop;.    
30320 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d  pLevel->pWLoop =
30330 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d   pWLoop = pFrom-
30340 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
30350 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d     pLevel->iFrom
30360 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b   = pWLoop->iTab;
30370 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
30380 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  bCur = pWInfo->p
30390 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
303a0 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  l->iFrom].iCurso
303b0 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57  r;.  }.  if( (pW
303c0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
303d0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
303e0 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26  STINCT)!=0.   &&
303f0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
30400 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
30410 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26  TINCTBY)==0.   &
30420 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  & pWInfo->eDisti
30430 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  nct==WHERE_DISTI
30440 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e  NCT_NOOP.   && n
30450 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20  RowEst.  ){.    
30460 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b  Bitmask notUsed;
30470 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68  .    int rc = wh
30480 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
30490 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
304a0 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
304b0 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  et, pFrom,.     
304c0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
304d0 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c  E_DISTINCTBY, nL
304e0 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
304f0 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e  oop[nLoop-1], &n
30500 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
30510 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65   rc==pWInfo->pRe
30520 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29  sultSet->nExpr )
30530 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
30540 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
30550 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
30560 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
30570 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
30580 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
30590 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
305a0 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
305b0 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69  NCTBY ){.      i
305c0 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
305d0 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  red==pWInfo->pOr
305e0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
305f0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
30600 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
30610 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
30620 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
30630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49  }else{.      pWI
30640 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46  nfo->nOBSat = pF
30650 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
30660 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
30670 2d 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49  ->nOBSat<0 ) pWI
30680 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b  nfo->nOBSat = 0;
30690 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
306a0 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
306b0 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20  revLoop;.    }. 
306c0 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f   }.  pWInfo->nRo
306d0 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  wOut = pFrom->nR
306e0 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  ow;..  /* Free t
306f0 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
30700 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65  and return succe
30710 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  ss */.  sqlite3D
30720 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
30730 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
30740 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
30750 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
30760 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
30770 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
30780 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
30790 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
307a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
307b0 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
307c0 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
307d0 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
307e0 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
307f0 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
30800 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
30810 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
30820 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
30830 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
30840 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
30850 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
30860 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
30870 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
30880 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
30890 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
308a0 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
308b0 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
308c0 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
308d0 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
308e0 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
308f0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
30900 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
30910 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
30920 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
30930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
30940 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
30950 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
30960 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
30970 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
30980 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
30990 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
309a0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
309b0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
309c0 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
309d0 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
309e0 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
309f0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
30a00 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20  ndex *pIdx;.  . 
30a10 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
30a20 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66  er->pWInfo;.  if
30a30 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
30a40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
30a50 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72  CE_TABLE ) retur
30a60 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
30a70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
30a80 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49  >nSrc>=1 );.  pI
30a90 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
30aa0 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61  abList->a;.  pTa
30ab0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
30ac0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
30ad0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
30ae0 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  0;.  if( pItem->
30af0 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20  zIndex ) return 
30b00 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
30b10 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
30b20 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
30b30 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
30b40 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
30b50 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
30b60 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
30b70 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  ee.nSkip = 0;.  
30b80 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
30b90 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
30ba0 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20  0, WO_EQ, 0);.  
30bb0 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
30bc0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
30bd0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
30be0 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52  Q|WHERE_IPK|WHER
30bf0 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c  E_ONEROW;.    pL
30c00 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  oop->aLTerm[0] =
30c10 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f   pTerm;.    pLoo
30c20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  p->nLTerm = 1;. 
30c30 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
30c40 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f  e.nEq = 1;.    /
30c50 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
30c60 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70  f a rowid lookup
30c70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c   is 10 */.    pL
30c80 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20  oop->rRun = 33; 
30c90 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c   /* 33==sqlite3L
30ca0 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d  ogEst(10) */.  }
30cb0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
30cc0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
30cd0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
30ce0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
30cf0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
30d00 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f  LTermSpace==pLoo
30d10 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20  p->aLTerm );.   
30d20 20 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79     assert( Array
30d30 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
30d40 72 6d 53 70 61 63 65 29 3d 3d 34 20 29 3b 0a 20  rmSpace)==4 );. 
30d50 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
30d60 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
30d70 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
30d80 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
30d90 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  0 .       || pId
30da0 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79  x->nKeyCol>Array
30db0 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
30dc0 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20  rmSpace) .      
30dd0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30de0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
30df0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
30e00 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
30e10 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
30e20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f  iCur, pIdx->aiCo
30e30 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45  lumn[j], 0, WO_E
30e40 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  Q, pIdx);.      
30e50 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
30e60 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
30e70 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
30e80 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
30e90 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70  }.      if( j!=p
30ea0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  Idx->nKeyCol ) c
30eb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
30ec0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
30ed0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
30ee0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45  WHERE_ONEROW|WHE
30ef0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
30f00 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f    if( pIdx->isCo
30f10 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d  vering || (pItem
30f20 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
30f30 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78  umnsInIndex(pIdx
30f40 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
30f50 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
30f60 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
30f70 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
30f80 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
30f90 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
30fa0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a  >u.btree.nEq = j
30fb0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
30fc0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
30fd0 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54  pIdx;.      /* T
30fe0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
30ff0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f   unique index lo
31000 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20  okup is 15 */.  
31010 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
31020 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71  = 39;  /* 39==sq
31030 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20  lite3LogEst(15) 
31040 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
31050 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
31060 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29  pLoop->wsFlags )
31070 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  {.    pLoop->nOu
31080 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20  t = (LogEst)1;. 
31090 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
310a0 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a  pWLoop = pLoop;.
310b0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53      pLoop->maskS
310c0 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
310d0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
310e0 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e   iCur);.    pWIn
310f0 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72  fo->a[0].iTabCur
31100 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49   = iCur;.    pWI
31110 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31  nfo->nRowOut = 1
31120 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
31130 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ->pOrderBy ) pWI
31140 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70  nfo->nOBSat =  p
31150 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
31160 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
31170 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
31180 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
31190 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
311a0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
311b0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
311c0 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
311d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
311e0 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70  _DEBUG.    pLoop
311f0 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e  ->cId = '0';.#en
31200 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31  dif.    return 1
31210 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
31220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
31230 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
31240 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
31250 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
31260 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
31270 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
31280 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
31290 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
312a0 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
312b0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
312c0 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
312d0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
312e0 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
312f0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
31300 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
31310 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
31320 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
31330 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
31340 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
31350 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
31360 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
31370 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
31380 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
31390 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
313a0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
313b0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
313c0 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
313d0 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
313e0 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
313f0 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
31400 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
31410 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
31420 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
31430 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
31440 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
31450 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
31460 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
31470 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
31480 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
31490 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
314a0 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
314b0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
314c0 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
314d0 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
314e0 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
314f0 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
31500 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
31510 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
31520 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
31530 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
31540 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
31550 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
31560 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
31570 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
31580 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
31590 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
315a0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
315b0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
315c0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
315d0 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315f0 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
31600 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
31610 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
31620 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
31630 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
31640 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31660 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
31670 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
31680 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
31690 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
316a0 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
316b0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
316c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
316d0 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
316e0 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
316f0 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
31700 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
31710 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
31720 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
31730 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
31740 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
31750 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
31760 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
31770 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
31780 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
31790 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
317a0 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
317b0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
317c0 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
317d0 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
317e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
317f0 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
31800 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
31810 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
31820 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
31830 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
31840 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
31850 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
31860 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
31870 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
31880 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
31890 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
318a0 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
318b0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
318c0 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
318d0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
318e0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
318f0 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
31900 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
31910 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
31920 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
31930 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
31940 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
31950 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
31960 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
31970 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
31980 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
31990 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
319a0 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
319b0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
319c0 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
319d0 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
319e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
319f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
31a00 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
31a10 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
31a20 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
31a30 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
31a40 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
31a50 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
31a60 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
31a70 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
31a80 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
31a90 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
31aa0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
31ab0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
31ac0 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
31ad0 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
31ae0 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
31af0 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
31b00 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
31b10 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
31b20 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
31b30 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
31b40 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
31b50 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
31b60 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
31b70 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
31b80 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
31b90 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
31ba0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
31bb0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
31bc0 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
31bd0 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
31be0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
31bf0 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
31c00 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
31c10 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
31c20 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
31c30 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
31c40 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
31c50 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
31c60 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
31c70 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
31c80 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
31c90 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
31ca0 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
31cb0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
31cc0 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
31cd0 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
31ce0 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
31cf0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
31d00 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
31d10 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
31d20 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
31d30 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
31d40 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
31d50 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
31d60 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
31d70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
31d80 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
31d90 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
31da0 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
31db0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
31dc0 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
31dd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
31de0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
31df0 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
31e00 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
31e10 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
31e20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
31e30 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
31e40 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
31e50 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
31e60 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
31e70 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
31e80 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
31e90 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
31ea0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
31eb0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
31ec0 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f  ause (or the GRO
31ed0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  UP BY clause.** 
31ee0 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  if the WHERE_GRO
31ef0 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
31f00 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20   in wctrlFlags) 
31f10 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
31f20 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72  ement.** if ther
31f30 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
31f40 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
31f50 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
31f60 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
31f70 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
31f80 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
31f90 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
31fa0 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
31fb0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ULL..**.** The i
31fc0 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72  IdxCur parameter
31fd0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
31fe0 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
31ff0 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45  x.  If .** WHERE
32000 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
32010 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69  s set, iIdxCur i
32020 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
32030 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ber of an index.
32040 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52  ** to use for OR
32050 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
32060 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63  ng.  The WHERE c
32070 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65  lause should use
32080 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69   this.** specifi
32090 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48  c cursor.  If WH
320a0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
320b0 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e  RED is set, then
320c0 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74   iIdxCur is.** t
320d0 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
320e0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63  in an array of c
320f0 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69  ursors for all i
32100 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72  ndices.  iIdxCur
32110 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73   should.** be us
32120 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
32130 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75  e appropriate cu
32140 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f  rsor depending o
32150 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73  n which index is
32160 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65  .** used..*/.Whe
32170 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
32180 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
32190 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
321a0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
321b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
321c0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
321d0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
321e0 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
321f0 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
32200 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
32210 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
32220 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
32230 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
32240 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
32250 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
32260 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
32270 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
32280 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65  .  ExprList *pRe
32290 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75  sultSet, /* Resu
322a0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75  lt set of the qu
322b0 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ery */.  u16 wct
322c0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
322d0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
322e0 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
322f0 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
32300 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  h */.  int iIdxC
32310 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur           /* 
32320 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  If WHERE_ONETABL
32330 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
32340 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
32350 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  er */.){.  int n
32360 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
32370 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
32380 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
32390 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
323a0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
323b0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
323c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
323d0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
323e0 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
323f0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
32400 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
32410 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
32420 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
32430 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
32440 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
32450 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
32460 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
32470 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
32480 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
32490 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
324a0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
324b0 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
324c0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
324d0 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54  r sWLB;     /* T
324e0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69  he WhereLoop bui
324f0 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d  lder */.  WhereM
32500 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
32510 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  ;    /* The expr
32520 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
32530 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
32540 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
32550 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
32560 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l in pWInfo->a[]
32570 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
32580 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
32590 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
325a0 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f   single WhereLoo
325b0 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
325c0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
325d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
325e0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71   counter */.  sq
325f0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
32600 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
32610 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
32620 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
32630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32640 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
32650 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  /...  /* Variabl
32660 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
32670 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
32680 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28  e->db;.  memset(
32690 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWLB, 0, sizeof
326a0 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41  (sWLB));..  /* A
326b0 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59  n ORDER/GROUP BY
326c0 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20   clause of more 
326d0 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61  than 63 terms ca
326e0 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
326f0 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  d */.  testcase(
32700 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
32710 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d  derBy->nExpr==BM
32720 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  S-1 );.  if( pOr
32730 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42  derBy && pOrderB
32740 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20  y->nExpr>=BMS ) 
32750 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
32760 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20  sWLB.pOrderBy = 
32770 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
32780 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54  Disable the DIST
32790 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f  INCT optimizatio
327a0 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74  n if SQLITE_Dist
327b0 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76  inctOpt is set v
327c0 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ia.  ** sqlite3_
327d0 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45  test_ctrl(SQLITE
327e0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
327f0 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a  ZATIONS,...) */.
32800 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
32810 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
32820 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
32830 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46  t) ){.    wctrlF
32840 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57  lags &= ~WHERE_W
32850 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20  ANT_DISTINCT;.  
32860 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  }..  /* The numb
32870 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
32880 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
32890 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
328a0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
328b0 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
328c0 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  sk .  */.  testc
328d0 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ase( pTabList->n
328e0 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66  Src==BMS );.  if
328f0 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
32900 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
32910 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
32920 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
32930 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
32940 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
32950 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
32960 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
32970 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
32980 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
32990 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
329a0 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
329b0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
329c0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
329d0 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  Y flag is set, t
329e0 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
329f0 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
32a00 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
32a10 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
32a20 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
32a30 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
32a40 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
32a50 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
32a60 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
32a70 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
32a80 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
32a90 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
32aa0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
32ab0 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
32ac0 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
32ad0 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
32ae0 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
32af0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
32b00 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
32b10 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
32b20 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
32b30 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
32b40 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
32b50 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
32b60 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
32b70 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
32b80 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
32b90 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
32ba0 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
32bb0 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
32bc0 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
32bd0 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
32be0 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
32bf0 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
32c00 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
32c10 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
32c20 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
32c30 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
32c40 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
32c50 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
32c60 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
32c70 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
32c80 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
32c90 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
32ca0 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
32cb0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
32cc0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
32cd0 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
32ce0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
32cf0 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
32d00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
32d10 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
32d20 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
32d30 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
32d40 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
32d50 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
32d60 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
32d70 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  s[0] = pWInfo->a
32d80 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
32d90 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   -1;.  pWInfo->n
32da0 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
32db0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
32dc0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
32dd0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
32de0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
32df0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
32e00 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
32e10 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  nfo->pResultSet 
32e20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
32e30 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
32e40 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
32e50 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
32e60 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
32e70 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
32e80 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b  gs = wctrlFlags;
32e90 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
32ea0 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
32eb0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
32ec0 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
32ed0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
32ee0 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d  .  sWLB.pWInfo =
32ef0 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e   pWInfo;.  sWLB.
32f00 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
32f10 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20  WC;.  sWLB.pNew 
32f20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28  = (WhereLoop*)((
32f30 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e  (char*)pWInfo)+n
32f40 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73  ByteWInfo);.  as
32f50 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
32f60 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e  _ALIGNMENT(sWLB.
32f70 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65  pNew) );.  where
32f80 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e  LoopInit(sWLB.pN
32f90 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ew);.#ifdef SQLI
32fa0 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e  TE_DEBUG.  sWLB.
32fb0 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b  pNew->cId = '*';
32fc0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70  .#endif..  /* Sp
32fd0 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
32fe0 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
32ff0 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
33000 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
33010 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
33020 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
33030 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
33040 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
33050 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
33060 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
33070 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
33080 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53  WInfo);.  whereS
33090 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  plit(&pWInfo->sW
330a0 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  C, pWhere, TK_AN
330b0 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70  D);.    .  /* Sp
330c0 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
330d0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
330e0 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
330f0 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
33100 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
33110 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
33120 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
33130 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
33140 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
33150 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  i<sWLB.pWC->nTer
33160 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
33170 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c  ( nTabList==0 ||
33180 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
33190 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57  nstantNotJoin(sW
331a0 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45  LB.pWC->a[ii].pE
331b0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
331c0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
331d0 28 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57  (pParse, sWLB.pW
331e0 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  C->a[ii].pExpr, 
331f0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a  pWInfo->iBreak,.
33200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33210 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
33220 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
33230 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69     sWLB.pWC->a[i
33240 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  i].wtFlags |= TE
33250 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
33260 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
33270 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20  l case: No FROM 
33280 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
33290 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b  ( nTabList==0 ){
332a0 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
332b0 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
332c0 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
332d0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63  Expr;.    if( wc
332e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
332f0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
33300 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
33310 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
33320 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
33330 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
33340 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
33350 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
33360 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
33370 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
33380 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  e..  **.  ** Whe
33390 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d  n assigning bitm
333a0 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52  ask values to FR
333b0 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72  OM clause cursor
333c0 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20  s, it must be.  
333d0 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74  ** the case that
333e0 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74   if X is the bit
333f0 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74  mask for the N-t
33400 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  h FROM clause te
33410 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  rm then.  ** the
33420 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
33430 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
33440 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ms to the left o
33450 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a  f the N-th term.
33460 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20    ** is (X-1).  
33470 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
33480 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
33490 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
334a0 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74   can use.  ** it
334b0 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  s Expr.iRightJoi
334c0 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20  nTable value to 
334d0 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b  find the bitmask
334e0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
334f0 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ble.  ** of the 
33500 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69  join.  Subtracti
33510 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20  ng one from the 
33520 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d  right table bitm
33530 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a  ask gives a.  **
33540 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
33550 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
33560 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
33570 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69    Knowing the bi
33580 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61  tmask.  ** for a
33590 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
335a0 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
335b0 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e  join is importan
335c0 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
335d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
335e0 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
335f0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
33600 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
33610 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a  c tables in.  **
33620 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
33630 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
33640 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
33650 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
33660 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20  ally.  ** equal 
33670 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
33680 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
33690 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
336a0 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f   the.  ** WHERE_
336b0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
336c0 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  ag is set..  */.
336d0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
336e0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
336f0 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
33700 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
33710 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69  TabList->a[ii].i
33720 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66  Cursor);.  }.#if
33730 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a  ndef NDEBUG.  {.
33740 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68      Bitmask toTh
33750 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66  eLeft = 0;.    f
33760 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
33770 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
33780 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
33790 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
337a0 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
337b0 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
337c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
337d0 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20  m-1)==toTheLeft 
337e0 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65  );.      toTheLe
337f0 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20  ft |= m;.    }. 
33800 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
33810 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
33820 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
33830 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78  s.  Note that ex
33840 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68  prAnalyze() migh
33850 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76  t.  ** add new v
33860 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74  irtual terms ont
33870 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
33880 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
33890 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77  We do not.  ** w
338a0 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74  ant to analyze t
338b0 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72  hese virtual ter
338c0 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61  ms, so start ana
338d0 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e  lyzing at the en
338e0 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20  d.  ** and work 
338f0 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20  forward so that 
33900 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61  the added virtua
33910 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65  l terms are neve
33920 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  r processed..  *
33930 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  /.  exprAnalyzeA
33940 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57  ll(pTabList, &pW
33950 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66  Info->sWC);.  if
33960 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
33970 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
33980 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
33990 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c    }..  if( wctrl
339a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
339b0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
339c0 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
339d0 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
339e0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
339f0 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75  Info->sWC, pResu
33a00 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ltSet) ){.      
33a10 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
33a20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
33a30 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
33a40 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
33a50 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
33a60 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
33a70 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
33a80 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
33a90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
33aa0 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
33ab0 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
33ac0 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
33ad0 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
33ae0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
33af0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
33b00 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
33b10 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
33b20 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53  derBy = pResultS
33b30 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  et;.    }.  }.. 
33b40 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
33b50 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
33b60 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52  cts */.  WHERETR
33b70 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
33b80 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
33b90 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20   ***\n"));.  /* 
33ba0 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d  Display all term
33bb0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
33bc0 6c 61 75 73 65 20 2a 2f 0a 23 69 66 20 64 65 66  lause */.#if def
33bd0 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
33be0 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66 69  ENABLED) && defi
33bf0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
33c00 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
33c10 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
33c20 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20  reTrace & 0x100 
33c30 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
33c40 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
33c50 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73  se->pVdbe;.    s
33c60 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67  qlite3ExplainBeg
33c70 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69  in(v);.    for(i
33c80 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  =0; i<sWLB.pWC->
33c90 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
33ca0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
33cb0 6e 50 72 69 6e 74 66 28 76 2c 20 22 23 25 2d 32  nPrintf(v, "#%-2
33cc0 64 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73  d ", i);.      s
33cd0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73  qlite3ExplainPus
33ce0 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72  h(v);.      wher
33cf0 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20  eExplainTerm(v, 
33d00 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 29  &sWLB.pWC->a[i])
33d10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
33d20 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20  xplainPop(v);.  
33d30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
33d40 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  inNL(v);.    }. 
33d50 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
33d60 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20 20  nFinish(v);.    
33d70 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
33d80 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
33d90 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28  VdbeExplanation(
33da0 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  v));.  }.#endif.
33db0 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
33dc0 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
33dd0 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
33de0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
33df0 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
33e00 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
33e10 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
33e20 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69  or;.  .    /* Di
33e30 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65  splay all of the
33e40 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
33e50 74 73 20 69 66 20 77 68 65 72 65 74 72 61 63 65  ts if wheretrace
33e60 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23   is enabled */.#
33e70 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
33e80 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20  _ENABLED /* !=0 
33e90 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
33ea0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
33eb0 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
33ec0 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  *p;.      int i;
33ed0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 68  .      static ch
33ee0 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30  ar zLabel[] = "0
33ef0 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67  123456789abcdefg
33f00 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
33f10 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20  yxz".           
33f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f30 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42 43              "ABC
33f40 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
33f50 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20  TUVWYXZ";.      
33f60 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  for(p=pWInfo->pL
33f70 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d  oops, i=0; p; p=
33f80 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b  p->pNextLoop, i+
33f90 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63  +){.        p->c
33fa0 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69  Id = zLabel[i%si
33fb0 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20  zeof(zLabel)];. 
33fc0 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
33fd0 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57  Print(p, sWLB.pW
33fe0 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
33ff0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20  }.#endif.  .    
34000 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
34010 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20  pWInfo, 0);.    
34020 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
34030 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
34040 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
34050 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
34060 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
34070 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
34080 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
34090 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20  nRowOut+1);.    
340a0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
340b0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
340c0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
340d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
340e0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
340f0 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  ==0 && (db->flag
34100 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72  s & SQLITE_Rever
34110 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20  seOrder)!=0 ){. 
34120 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
34130 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28  ask = (Bitmask)(
34140 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  -1);.  }.  if( p
34150 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e  Parse->nErr || N
34160 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EVER(db->mallocF
34170 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f  ailed) ){.    go
34180 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
34190 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57  or;.  }.#ifdef W
341a0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
341b0 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 69 66  D /* !=0 */.  if
341c0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
341d0 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ace ){.    int i
341e0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  i;.    sqlite3De
341f0 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
34200 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
34210 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
34220 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
34230 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b  nfo->nOBSat>0 ){
34240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
34250 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45  bugPrintf(" ORDE
34260 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20  RBY=%d,0x%llx", 
34270 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20  pWInfo->nOBSat, 
34280 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29  pWInfo->revMask)
34290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
342a0 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  ch( pWInfo->eDis
342b0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63  tinct ){.      c
342c0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
342d0 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
342e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
342f0 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
34300 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20  NCT=unique");.  
34310 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
34320 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
34330 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
34340 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
34350 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
34360 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
34370 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  =ordered");.    
34380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
34390 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
343a0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
343b0 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
343c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
343d0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
343e0 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  =unordered");.  
343f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
34400 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
34410 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
34420 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  f("\n");.    for
34430 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f  (ii=0; ii<pWInfo
34440 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b  ->nLevel; ii++){
34450 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
34460 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b  Print(pWInfo->a[
34470 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42  ii].pWLoop, sWLB
34480 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pWC);.    }.  }
34490 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74  .#endif.  /* Att
344a0 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62  empt to omit tab
344b0 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69  les from the joi
344c0 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66  n that do not ef
344d0 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 20  fect the result 
344e0 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  */.  if( pWInfo-
344f0 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26  >nLevel>=2.   &&
34500 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20   pResultSet!=0. 
34510 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
34520 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
34530 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e  ITE_OmitNoopJoin
34540 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  ).  ){.    Bitma
34550 73 6b 20 74 61 62 55 73 65 64 20 3d 20 65 78 70  sk tabUsed = exp
34560 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
34570 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c  pMaskSet, pResul
34580 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tSet);.    if( s
34590 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 20 74  WLB.pOrderBy ) t
345a0 61 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c 69  abUsed |= exprLi
345b0 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
345c0 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64  skSet, sWLB.pOrd
345d0 65 72 42 79 29 3b 0a 20 20 20 20 77 68 69 6c 65  erBy);.    while
345e0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
345f0 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=2 ){.      Whe
34600 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
34610 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  pEnd;.      pLoo
34620 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57  p = pWInfo->a[pW
34630 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e  Info->nLevel-1].
34640 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66  pWLoop;.      if
34650 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  ( (pWInfo->pTabL
34660 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
34670 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ab].jointype & J
34680 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65  T_LEFT)==0 ) bre
34690 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ak;.      if( (w
346a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
346b0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
346c0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
346d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
346e0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
346f0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
34700 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
34710 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55  .      if( (tabU
34720 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sed & pLoop->mas
34730 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61  kSelf)!=0 ) brea
34740 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  k;.      pEnd = 
34750 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57  sWLB.pWC->a + sW
34760 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  LB.pWC->nTerm;. 
34770 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
34780 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
34790 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
347a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
347b0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
347c0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
347d0 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  f)!=0.         &
347e0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
347f0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
34800 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
34810 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
34820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
34830 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34840 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64    if( pTerm<pEnd
34850 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
34860 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
34870 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f  f, ("-> drop loo
34880 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22  p %c not used\n"
34890 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a  , pLoop->cId));.
348a0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c        pWInfo->nL
348b0 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54  evel--;.      nT
348c0 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a  abList--;.    }.
348d0 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
348e0 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
348f0 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
34900 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49   ***\n"));.  pWI
34910 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75  nfo->pParse->nQu
34920 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66  eryLoop += pWInf
34930 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f  o->nRowOut;..  /
34940 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
34950 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
34960 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
34970 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
34980 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
34990 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
349a0 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
349b0 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
349c0 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65  priate..  ** The
349d0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
349e0 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  thm only works i
349f0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
34a00 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20  se constrains.  
34a10 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
34a20 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e   to update a sin
34a30 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  gle row..  */.  
34a40 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
34a50 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
34a60 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
34a70 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  || pWInfo->nLeve
34a80 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77  l==1 );.  if( (w
34a90 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
34aa0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
34ab0 44 29 21 3d 30 20 0a 20 20 20 26 26 20 28 70 57  D)!=0 .   && (pW
34ac0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
34ad0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
34ae0 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b  RE_ONEROW)!=0 ){
34af0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  .    pWInfo->okO
34b00 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20  nePass = 1;.    
34b10 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
34b20 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
34b30 29 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  ) ){.      pWInf
34b40 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
34b50 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
34b60 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
34b70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  }.  }..  /* Open
34b80 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
34b90 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  he pTabList and 
34ba0 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65  any indices sele
34bb0 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65  cted for.  ** se
34bc0 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61  arching those ta
34bd0 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  bles..  */.  not
34be0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
34bf0 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c  k)0;.  for(ii=0,
34c00 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
34c10 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  a; ii<nTabList; 
34c20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  ii++, pLevel++){
34c30 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
34c40 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
34c50 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
34c60 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
34c70 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
34c80 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
34c90 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
34ca0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
34cb0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
34cc0 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ..    pTabItem =
34cd0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
34ce0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
34cf0 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
34d00 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
34d10 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
34d20 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
34d30 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
34d40 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
34d50 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
34d60 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
34d70 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
34d80 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  =0 || pTab->pSel
34d90 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ect ){.      /* 
34da0 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
34db0 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20    }else.#ifndef 
34dc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
34dd0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
34de0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
34df0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
34e00 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
34e10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
34e20 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  VTab = (const ch
34e30 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
34e40 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
34e50 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20  .      int iCur 
34e60 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
34e70 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sor;.      sqlit
34e80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
34e90 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20  OP_VOpen, iCur, 
34ea0 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f  0, 0, pVTab, P4_
34eb0 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65  VTAB);.    }else
34ec0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
34ed0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
34ee0 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c   noop */.    }el
34ef0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
34f00 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
34f10 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
34f20 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
34f30 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
34f40 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
34f50 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20  _CLOSE)==0 ){.  
34f60 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
34f70 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
34f80 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  if( pWInfo->okOn
34f90 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 20  ePass ){.       
34fa0 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69   op = OP_OpenWri
34fb0 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  te;.        pWIn
34fc0 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
34fd0 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  [0] = pTabItem->
34fe0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d  iCursor;.      }
34ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
35000 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
35010 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
35020 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
35030 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  p);.      assert
35040 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  ( pTabItem->iCur
35050 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  sor==pLevel->iTa
35060 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  bCur );.      te
35070 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d  stcase( !pWInfo-
35080 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
35090 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
350a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
350b0 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  e( !pWInfo->okOn
350c0 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
350d0 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
350e0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
350f0 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
35100 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61  ->nCol<BMS && Ha
35110 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
35120 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
35130 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
35140 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
35150 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
35160 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
35170 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
35180 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
35190 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
351a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
351b0 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
351c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351d0 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
351e0 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
351f0 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
35200 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
35210 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
35220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
35230 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
35240 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
35250 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
35260 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
35270 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
35280 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
35290 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49  DEXED ){.      I
352a0 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f  ndex *pIx = pLoo
352b0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
352c0 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e  x;.      int iIn
352d0 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e  dexCur;.      in
352e0 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
352f0 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 49 64  ad;.      /* iId
35300 78 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 73  xCur is always s
35310 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69 74  et if to a posit
35320 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45  ive value if ONE
35330 50 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65  PASS is possible
35340 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
35350 28 20 69 49 64 78 43 75 72 21 3d 30 20 7c 7c 20  ( iIdxCur!=0 || 
35360 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
35370 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
35380 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
35390 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
353a0 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 29  nfo->okOnePass )
353b0 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  {.        Index 
353c0 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  *pJ = pTabItem->
353d0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
353e0 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
353f0 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
35400 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c     assert( wctrl
35410 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
35420 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b  EPASS_DESIRED );
35430 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
35440 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a  ALWAYS(pJ) && pJ
35450 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20  !=pIx ){.       
35460 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a     iIndexCur++;.
35470 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70            pJ = p
35480 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  J->pNext;.      
35490 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d    }.        op =
354a0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
354b0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
354c0 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
354d0 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
354e0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 49 64 78    }else if( iIdx
354f0 43 75 72 20 26 26 20 28 77 63 74 72 6c 46 6c 61  Cur && (wctrlFla
35500 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
35510 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  BLE_ONLY)!=0 ){.
35520 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
35530 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  r = iIdxCur;.   
35540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35550 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50    iIndexCur = pP
35560 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
35570 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
35580 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49  el->iIdxCur = iI
35590 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61  ndexCur;.      a
355a0 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
355b0 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
355c0 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
355d0 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30  rt( iIndexCur>=0
355e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
355f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
35600 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  p, iIndexCur, pI
35610 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
35620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35630 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
35640 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20  rse, pIx);.     
35650 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
35660 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
35670 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e));.    }.    i
35680 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69  f( iDb>=0 ) sqli
35690 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
356a0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
356b0 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26  ;.    notReady &
356c0 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  = ~getMask(&pWIn
356d0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54  fo->sMaskSet, pT
356e0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
356f0 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
35700 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
35710 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
35720 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
35730 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
35740 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
35750 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
35760 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
35770 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
35780 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
35790 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
357a0 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
357b0 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
357c0 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
357d0 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
357e0 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
357f0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
35800 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
35810 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
35820 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ++){.    pLevel 
35830 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  = &pWInfo->a[ii]
35840 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
35850 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
35860 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70  INDEX.    if( (p
35870 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
35880 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
35890 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
358a0 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74  .      construct
358b0 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
358c0 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e  Parse, &pWInfo->
358d0 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sWC,.           
358e0 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e       &pTabList->
358f0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
35900 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
35910 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  el);.      if( d
35920 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
35930 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
35940 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65  nError;.    }.#e
35950 6e 64 69 66 0a 20 20 20 20 65 78 70 6c 61 69 6e  ndif.    explain
35960 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20  OneScan(pParse, 
35970 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
35980 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  , ii, pLevel->iF
35990 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29  rom, wctrlFlags)
359a0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
359b0 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  drBody = sqlite3
359c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
359d0 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  v);.    notReady
359e0 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74   = codeOneLoopSt
359f0 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20  art(pWInfo, ii, 
35a00 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
35a10 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
35a20 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
35a30 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ont;.  }..  /* D
35a40 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f  one. */.  VdbeMo
35a50 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
35a60 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72  "Begin WHERE-cor
35a70 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e"));.  return p
35a80 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
35a90 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
35aa0 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
35ab0 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
35ac0 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
35ad0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
35ae0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
35af0 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
35b00 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
35b10 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
35b20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
35b30 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
35b40 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
35b50 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
35b60 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
35b70 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
35b80 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
35b90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
35ba0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
35bb0 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
35bc0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
35bd0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
35be0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
35bf0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
35c00 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
35c10 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
35c20 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  evel;.  WhereLoo
35c30 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c  p *pLoop;.  SrcL
35c40 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
35c50 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
35c60 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
35c70 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
35c80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
35c90 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
35ca0 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d  de..  */.  VdbeM
35cb0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
35cc0 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65   "End WHERE-core
35cd0 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  "));.  sqlite3Ex
35ce0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
35cf0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
35d00 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
35d10 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
35d20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c  int addr;.    pL
35d30 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
35d40 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  a[i];.    pLoop 
35d50 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
35d60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
35d70 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
35d80 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
35d90 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
35da0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
35db0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
35dc0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c  VdbeAddOp3(v, pL
35dd0 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
35de0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
35df0 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20  , pLevel->p3);. 
35e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35e10 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
35e20 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56  el->p5);.      V
35e30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
35e40 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
35e50 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
35e60 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20  op==OP_Next);.  
35e70 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
35e80 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
35e90 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
35ea0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
35eb0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
35ec0 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d  OP_VNext);.    }
35ed0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
35ee0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
35ef0 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65  IN_ABLE && pLeve
35f00 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b  l->u.in.nIn>0 ){
35f10 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
35f20 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
35f30 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
35f40 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
35f50 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
35f60 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20  >addrNxt);.     
35f70 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75   for(j=pLevel->u
35f80 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  .in.nIn, pIn=&pL
35f90 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
35fa0 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
35fb0 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
35fc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
35fd0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
35fe0 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20  ddrInTop+1);.   
35ff0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36000 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65  AddOp2(v, pIn->e
36010 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e  EndLoopOp, pIn->
36020 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
36030 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  nTop);.        V
36040 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
36050 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
36060 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65  rageIf(v, pIn->e
36070 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72  EndLoopOp==OP_Pr
36080 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20  evIfOpen);.     
36090 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
360a0 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
360b0 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f  opOp==OP_NextIfO
360c0 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pen);.        sq
360d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
360e0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
360f0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
36100 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
36110 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
36120 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
36130 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
36140 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
36150 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
36160 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Brk);.    if( pL
36170 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29  evel->addrSkip )
36180 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
36190 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
361a0 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
361b0 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20  >addrSkip);.    
361c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
361d0 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61  , "next skip-sca
361e0 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d  n on %s", pLoop-
361f0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
36200 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
36210 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
36220 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
36230 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
36240 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
36250 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
36260 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20  ddrSkip-2);.    
36270 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
36280 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
36290 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
362a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
362b0 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65   OP_IfPos, pLeve
362c0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56  l->iLeftJoin); V
362d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
362e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
362f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
36300 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
36310 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
36320 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
36330 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
36340 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
36350 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
36360 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
36370 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
36380 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36390 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
363a0 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  w, pTabList->a[i
363b0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
363c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
363d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
363e0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
363f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36400 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
36410 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
36420 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
36430 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
36440 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
36450 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
36460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
36470 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
36480 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
36490 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
364a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
364b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
364c0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
364d0 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  0, pLevel->addrF
364e0 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  irst);.      }. 
364f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36500 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
36510 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62  );.    }.    Vdb
36520 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
36530 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f  v, "End WHERE-lo
36540 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20  op%d: %s", i,.  
36550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36560 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c     pWInfo->pTabL
36570 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
36580 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d  From].pTab->zNam
36590 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  e));.  }..  /* T
365a0 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74  he "break" point
365b0 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70   is here, just p
365c0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
365d0 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20  he outer loop.. 
365e0 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f   ** Set it..  */
365f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
36600 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57  solveLabel(v, pW
36610 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
36620 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
36630 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69  ->nLevel<=pTabLi
36640 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f  st->nSrc );.  fo
36650 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
36660 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66  Info->a; i<pWInf
36670 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20  o->nLevel; i++, 
36680 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69  pLevel++){.    i
36690 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20  nt k, last;.    
366a0 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
366b0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30   Index *pIdx = 0
366c0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
366d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
366e0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
366f0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
36700 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
36710 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
36720 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
36730 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
36740 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
36750 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20  pWLoop;..    /* 
36760 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  For a co-routine
36770 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f  , change all OP_
36780 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  Column reference
36790 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  s to the table o
367a0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d  f.    ** the co-
367b0 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f  routine into OP_
367c0 53 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20  SCopy of result 
367d0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72  contained in a r
367e0 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20  egister..    ** 
367f0 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73  OP_Rowid becomes
36800 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f   OP_Null..    */
36810 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65  .    if( pTabIte
36820 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  m->viaCoroutine 
36830 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
36840 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 6c 61  iled ){.      la
36850 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
36860 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
36870 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c        k = pLevel
36880 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20  ->addrBody;.    
36890 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
368a0 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a  dbeGetOp(v, k);.
368b0 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61        for(; k<la
368c0 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
368d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
368e0 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
368f0 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
36900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
36910 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
36920 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
36930 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
36940 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 20 20 20 20  OP_SCopy;.      
36950 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f      pOp->p1 = pO
36960 70 2d 3e 70 32 20 2b 20 70 54 61 62 49 74 65 6d  p->p2 + pTabItem
36970 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20  ->regResult;.   
36980 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
36990 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
369a0 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
369b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
369c0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
369d0 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  OP_Rowid ){.    
369e0 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
369f0 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20  e = OP_Null;.   
36a00 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
36a10 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   0;.          pO
36a20 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20  p->p3 = 0;.     
36a30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36a40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
36a50 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65   }..    /* Close
36a60 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
36a70 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
36a80 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
36a90 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 20 20 2a  hereBegin..    *
36aa0 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74  * Except, do not
36ab0 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 74   close cursors t
36ac0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 75 73  hat will be reus
36ad0 65 64 20 62 79 20 74 68 65 20 4f 52 20 6f 70 74  ed by the OR opt
36ae0 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
36af0 20 28 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45   (WHERE_OMIT_OPE
36b00 4e 5f 43 4c 4f 53 45 29 2e 20 20 41 6e 64 20 64  N_CLOSE).  And d
36b10 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65 20  o not close the 
36b20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 63 75 72  OP_OpenWrite cur
36b30 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72 65 61  sors.    ** crea
36b40 74 65 64 20 66 6f 72 20 74 68 65 20 4f 4e 45 50  ted for the ONEP
36b50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ASS optimization
36b60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36b70 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
36b80 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
36b90 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62  ==0.     && pTab
36ba0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20  ->pSelect==0.   
36bb0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
36bc0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
36bd0 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
36be0 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
36bf0 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70    int ws = pLoop
36c00 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20  ->wsFlags;.     
36c10 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
36c20 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26  OnePass && (ws &
36c30 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
36c40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
36c50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
36c60 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
36c70 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
36c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36c90 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  if( (ws & WHERE_
36ca0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
36cb0 20 20 20 26 26 20 28 77 73 20 26 20 28 57 48 45     && (ws & (WHE
36cc0 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54  RE_IPK|WHERE_AUT
36cd0 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20  O_INDEX))==0 .  
36ce0 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e       && pLevel->
36cf0 69 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d  iIdxCur!=pWInfo-
36d00 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
36d10 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
36d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36d30 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
36d40 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
36d50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36d60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
36d70 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
36d80 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63  dex, make VDBE c
36d90 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
36da0 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
36db0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
36dc0 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
36dd0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77  from the table w
36de0 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20  here possible.  
36df0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20  In some cases.  
36e00 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69    ** this optimi
36e10 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20  zation prevents 
36e20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65  the table from e
36e30 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20  ver being read, 
36e40 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a  which can.    **
36e50 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69   yield a signifi
36e60 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  cant performance
36e70 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a   boost..    ** .
36e80 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
36e90 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
36ea0 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
36eb0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
36ec0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
36ed0 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
36ee0 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
36ef0 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
36f00 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
36f10 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
36f20 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
36f30 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
36f40 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
36f50 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
36f60 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
36f70 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
36f80 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
36f90 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
36fa0 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
36fb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
36fc0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
36fd0 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
36fe0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
36ff0 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
37000 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
37010 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ndex;.    }else 
37020 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
37030 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
37040 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64  _OR ){.      pId
37050 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43  x = pLevel->u.pC
37060 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  ovidx;.    }.   
37070 20 69 66 28 20 70 49 64 78 20 26 26 20 21 64 62   if( pIdx && !db
37080 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
37090 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  {.      last = s
370a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
370b0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
370c0 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
370d0 42 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20  Body;.      pOp 
370e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
370f0 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20  Op(v, k);.      
37100 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  for(; k<last; k+
37110 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
37120 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
37130 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
37140 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
37150 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
37160 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
37170 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
37180 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  x = pOp->p2;.   
37190 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
371a0 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61  Idx->pTable==pTa
371b0 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  b );.          i
371c0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
371d0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
371e0 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
371f0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
37200 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
37210 20 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b           x = pPk
37220 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20  ->aiColumn[x];. 
37230 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
37240 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
37250 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
37260 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  dx, x);.        
37270 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
37280 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
37290 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20  2 = x;.         
372a0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
372b0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
372c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
372d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
372e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
372f0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
37300 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20   || x>=0 );.    
37310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
37320 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f  p->opcode==OP_Ro
37330 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
37340 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
37350 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
37360 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
37370 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b  e = OP_IdxRowid;
37380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37390 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
373a0 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
373b0 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  .  */.  pParse->
373c0 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
373d0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
373e0 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66  Loop;.  whereInf
373f0 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
37400 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.