/ Hex Artifact Content
Login

Artifact 4f8dce8f4e50b3b3675e8af7811e48526d6b4be2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
2c90: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
2ca0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
2cb0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
2cc0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
2cd0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
2ce0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
2cf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d00: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
2d10: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
2d20: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
2d30: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
2d40: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
2d50: 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65 6e  t/right preceden
2d60: 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e  ce rules come in
2d70: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74  to play when det
2d80: 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ermining the.** 
2d90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2da0: 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45  ce, then COLLATE
2db0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 61   operators are a
2dc0: 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72  djusted to ensur
2dd0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  e.** that the co
2de0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2df0: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2e00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e10: 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "Y collate NO
2e20: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
2e30: 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63 61  es "X op Y" beca
2e40: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
2e50: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
2e60: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
2e70: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
2e80: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
2e90: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2ea0: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
2eb0: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
2ec0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
2ed0: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
2ee0: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
2ef0: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
2f00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
2f10: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
2f20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2f30: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
2f40: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
2f50: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2f60: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
2f70: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
2f80: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
2f90: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2fa0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
2fb0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2fc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
2fd0: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
2fe0: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
2ff0: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
3000: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
3010: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3020: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
3030: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
3040: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
3050: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
3060: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3070: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
3080: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
3090: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
30a0: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
30b0: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
30c0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
30d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
30e0: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
3100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3110: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
3120: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
3130: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
3140: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
3150: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
3160: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
3170: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
3180: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
3190: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
31a0: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
31b0: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
31c0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
31d0: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
31e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
31f0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
3200: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3210: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
3220: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3230: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3240: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3250: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3260: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3270: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
3280: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3290: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
32a0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
32b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32c0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
32d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
32e0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
32f0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3300: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3310: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3320: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3340: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3350: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3360: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3370: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
3380: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
3390: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
33a0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
33b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
33c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
33d0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
33e0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
33f0: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3400: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3410: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3420: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3430: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3440: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3450: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3460: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
3470: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
3480: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
3490: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34a0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34b0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34c0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
34d0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34e0: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
34f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3500: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3510: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3520: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3530: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3540: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3550: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3560: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
3570: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3580: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
3590: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35a0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35b0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35c0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
35d0: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
35e0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
35f0: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3600: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3610: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3620: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3630: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3640: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3650: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3660: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
3670: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
3680: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
3690: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36a0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36b0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
36d0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
36e0: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
36f0: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3700: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3710: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3720: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3740: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3750: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3760: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
3770: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
3780: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
3790: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37a0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37c0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
37d0: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
37e0: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
37f0: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3800: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3810: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3820: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3830: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3840: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3850: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3860: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
3870: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
3880: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
3890: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38a0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38b0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38c0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
38d0: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
38e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
38f0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3900: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3910: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3920: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3930: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3940: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3950: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3960: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3970: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
3990: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39a0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39b0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
39d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
39e0: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
39f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a10: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a20: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a40: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a50: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a60: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3a70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3a80: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3a90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ab0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3ac0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b40: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b50: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b60: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3b70: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3b80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3b90: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3ba0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3bd0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3be0: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3bf0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c00: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c10: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c30: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c50: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c60: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c70: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3c90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3ca0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3cb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3cc0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3cd0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3ce0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3cf0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d00: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d10: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d20: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d30: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d40: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3d70: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3d90: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3da0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3db0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3df0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e10: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e20: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e30: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e40: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e60: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3e70: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3e80: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3e90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3ed0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3ee0: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3ef0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f10: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f20: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f30: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f40: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f50: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f60: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3f70: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3f80: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fc0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
3fd0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
3fe0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
3ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4010: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4020: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4030: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4040: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4050: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4060: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
4070: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
4080: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
4090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40c0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
40d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
40e0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
40f0: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4100: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4110: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4120: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4130: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4140: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4150: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4160: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
4170: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4180: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
4190: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41a0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41b0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41c0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
41d0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
41e0: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
41f0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4200: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4210: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4220: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4230: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4240: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4250: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4260: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
4270: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
4280: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
4290: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42a0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42b0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42c0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
42d0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
42e0: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
42f0: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4300: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4310: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4320: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4330: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4340: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4350: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4360: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4370: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
4380: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
4390: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43a0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43b0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43c0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
43d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
43e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
43f0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4400: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4410: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4430: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4440: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4460: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
4470: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
4490: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44a0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44b0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
44d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
44e0: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
44f0: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4500: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4510: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4520: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4530: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4540: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4550: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4560: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
4570: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
4580: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
4590: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45a0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45c0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
45d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
45e0: 45 52 28 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75  ER(j>pIdx->nColu
45f0: 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mn) ) return 0;.
4600: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4610: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
4620: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
4630: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e  }else{.    pScan
4640: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
4650: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
4660: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  me = 0;.  }.  pS
4670: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70  can->opMask = op
4680: 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b  Mask;.  pScan->k
4690: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61   = 0;.  pScan->a
46a0: 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b  Equiv[0] = iCur;
46b0: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
46c0: 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  [1] = iColumn;. 
46d0: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d   pScan->nEquiv =
46e0: 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71   2;.  pScan->iEq
46f0: 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72  uiv = 2;.  retur
4700: 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  n whereScanNext(
4710: 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pScan);.}../*.**
4720: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
4730: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
4740: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
4750: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
4760: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
4770: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
4780: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
4790: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
47a0: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
47b0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
47c0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
47d0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
47e0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
47f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
4800: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
4810: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
4820: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  t found..**.** T
4830: 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64  he term returned
4840: 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70   might by Y=<exp
4850: 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61  r> if there is a
4860: 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e  nother constrain
4870: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  t in.** the WHER
4880: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70  E clause that sp
4890: 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59  ecifies that X=Y
48a0: 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73  .  Any such cons
48b0: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a  traints will be.
48c0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
48d0: 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69   the WO_EQUIV bi
48e0: 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e  t in the pTerm->
48f0: 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e  eOperator field.
4900: 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b    The.** aEquiv[
4910: 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20  ] array holds X 
4920: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
4930: 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61  valents, with ea
4940: 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a  ch SQL variable.
4950: 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f  ** taking up two
4960: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
4970: 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73  [].  The first s
4980: 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63  lot is for the c
4990: 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20  ursor number.** 
49a0: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69  and the second i
49b0: 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  s for the column
49c0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20   number.  There 
49d0: 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20  are 22 slots in 
49e0: 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74  aEquiv[].** so t
49f0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
4a00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
4a10: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
4a20: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
4a30: 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65  s..** Hence a se
4a40: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
4a50: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
4a60: 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20   X=A1 and A1=A2 
4a70: 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64  and A2=A3.** and
4a80: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
4a90: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
4aa0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
4ab0: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
4ac0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
4ad0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
4ae0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
4af0: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
4b00: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
4b10: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
4b20: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
4b30: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
4b40: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
4b50: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
4b60: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
4b70: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
4b80: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
4b90: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
4ba0: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
4bb0: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
4bc0: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
4bd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4be0: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
4bf0: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
4c00: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
4c10: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
4c20: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
4c30: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
4c40: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
4c50: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61  WO_EQUIV..*/.sta
4c60: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
4c70: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
4c80: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
4c90: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
4ca0: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
4cb0: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
4cc0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
4cd0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
4ce0: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
4cf0: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
4d00: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
4d10: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
4d20: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
4d30: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
4d40: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
4d50: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
4d60: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
4d70: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4d80: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
4d90: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
4da0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
4db0: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
4dc0: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
4dd0: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
4de0: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
4df0: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
4e00: 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  rm *pResult = 0;
4e10: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b  .  WhereTerm *p;
4e20: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
4e30: 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53  n;..  p = whereS
4e40: 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
4e50: 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d  WC, iCur, iColum
4e60: 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20  n, op, pIdx);.  
4e70: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
4e80: 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69  if( (p->prereqRi
4e90: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
4ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
4eb0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  p->prereqRight==
4ec0: 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74  0 && (p->eOperat
4ed0: 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a  or&WO_EQ)!=0 ){.
4ee0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
4ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4f00: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
4f10: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
4f20: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
4f30: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
4f40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4f50: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Result;.}../* Fo
4f60: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
4f70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
4f80: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
4f90: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
4fa0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
4fb0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
4fc0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
4fd0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
4fe0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
4ff0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
5000: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
5010: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
5020: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
5030: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5040: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
5050: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5060: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
5070: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5080: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
5090: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
50a0: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
50b0: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
50c0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
50d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
50e0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
50f0: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
5100: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5110: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5120: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
5130: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
5140: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
5150: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
5160: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
5170: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
5180: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
5190: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
51a0: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
51b0: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
51c0: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
51d0: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
51e0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
51f0: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
5200: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
5210: 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74  ildcard.  .*/.st
5220: 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f  atic int isLikeO
5230: 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a  rGlob(.  Parse *
5240: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
5250: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5260: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5270: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
5280: 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74  pr,      /* Test
5290: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
52a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 50   */.  Expr **ppP
52b0: 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74  refix,  /* Point
52c0: 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20  er to TK_STRING 
52d0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
52e0: 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20 2a  pattern prefix *
52f0: 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70  /.  int *pisComp
5300: 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66  lete, /* True if
5310: 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61   the only wildca
5320: 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c  rd is % in the l
5330: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f  ast character */
5340: 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20  .  int *pnoCase 
5350: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5360: 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71 75  uppercase is equ
5370: 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72  ivalent to lower
5380: 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  case */.){.  con
5390: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20  st char *z = 0; 
53a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
53b0: 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45  g on RHS of LIKE
53c0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45   operator */.  E
53d0: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
53e0: 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67  eft;      /* Rig
53f0: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65  ht and left size
5400: 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f   of LIKE operato
5410: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
5420: 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
5430: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65    /* List of ope
5440: 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b  rands to the LIK
5450: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
5460: 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20  int c;          
5470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
5480: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  e character in z
5490: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  [] */.  int cnt;
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
54c0: 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65  non-wildcard pre
54d0: 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a  fix characters *
54e0: 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20  /.  char wc[3]; 
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5500: 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72 61  * Wildcard chara
5510: 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  cters */.  sqlit
5520: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5530: 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
5540: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
5550: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
5560: 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pVal = 0;.  int
5570: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
5580: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
5590: 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a  e of pRight */..
55a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
55b0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c  LikeFunction(db,
55c0: 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c   pExpr, pnoCase,
55d0: 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   wc) ){.    retu
55e0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rn 0;.  }.#ifdef
55f0: 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20   SQLITE_EBCDIC. 
5600: 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20   if( *pnoCase ) 
5610: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
5620: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
5630: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65  ->x.pList;.  pLe
5640: 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  ft = pList->a[1]
5650: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c  .pExpr;.  if( pL
5660: 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  eft->op!=TK_COLU
5670: 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  MN .   || sqlite
5680: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
5690: 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46  eft)!=SQLITE_AFF
56a0: 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73 56  _TEXT .   || IsV
56b0: 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54  irtual(pLeft->pT
56c0: 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ab).  ){.    /* 
56d0: 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34  IMP: R-02065-494
56e0: 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  65 The left-hand
56f0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b   side of the LIK
5700: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
5710: 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  or must.    ** b
5720: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  e the name of an
5730: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
5740: 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69  with TEXT affini
5750: 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ty. */.    retur
5760: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 0;.  }.  asser
5770: 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  t( pLeft->iColum
5780: 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65  n!=(-1) ); /* Be
5790: 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20  cause IPK never 
57a0: 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a  has AFF_TEXT */.
57b0: 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69  .  pRight = sqli
57c0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
57d0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  te(pList->a[0].p
57e0: 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70 52  Expr);.  op = pR
57f0: 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  ight->op;.  if( 
5800: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
5810: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65  ){.    Vdbe *pRe
5820: 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65  prepare = pParse
5830: 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20  ->pReprepare;.  
5840: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69    int iCol = pRi
5850: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ght->iColumn;.  
5860: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
5870: 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
5880: 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43  e(pReprepare, iC
5890: 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ol, SQLITE_AFF_N
58a0: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ONE);.    if( pV
58b0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
58c0: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
58d0: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
58e0: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a       z = (char *
58f0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5900: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  ext(pVal);.    }
5910: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5920: 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
5930: 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b  e->pVdbe, iCol);
5940: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69  .    assert( pRi
5950: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ght->op==TK_VARI
5960: 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e  ABLE || pRight->
5970: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
5980: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
5990: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
59a0: 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e      z = pRight->
59b0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  u.zToken;.  }.  
59c0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74  if( z ){.    cnt
59d0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
59e0: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
59f0: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
5a00: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
5a10: 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  2] ){.      cnt+
5a20: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
5a30: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d   cnt!=0 && 255!=
5a40: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a  (u8)z[cnt-1] ){.
5a50: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65        Expr *pPre
5a60: 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43  fix;.      *pisC
5a70: 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b  omplete = c==wc[
5a80: 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d  0] && z[cnt+1]==
5a90: 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78  0;.      pPrefix
5aa0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
5ab0: 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29  b, TK_STRING, z)
5ac0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
5ad0: 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75  fix ) pPrefix->u
5ae0: 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30  .zToken[cnt] = 0
5af0: 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69  ;.      *ppPrefi
5b00: 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20  x = pPrefix;.   
5b10: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41     if( op==TK_VA
5b20: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  RIABLE ){.      
5b30: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5b40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20  se->pVdbe;.     
5b50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5b60: 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67  tVarmask(v, pRig
5b70: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ht->iColumn);.  
5b80: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
5b90: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
5ba0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
5bb0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
5bc0: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
5bd0: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
5be0: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
5bf0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
5c00: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
5c10: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
5c20: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
5c30: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
5c40: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
5c50: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
5c60: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
5c70: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
5c80: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
5c90: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
5ca0: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
5cb0: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
5cc0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
5cd0: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
5ce0: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
5cf0: 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65  o workaround the
5d00: 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f  m, add a dummy O
5d10: 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e  P_Variable here.
5d20: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  .          */ . 
5d30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
5d40: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5d50: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5d60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5d70: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
5d80: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29  rse, pRight, r1)
5d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
5da0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
5db0: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
5dc0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
5dd0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
5de0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5df0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5e00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5e10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5e20: 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d      z = 0;.    }
5e30: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
5e40: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
5e50: 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b    return (z!=0);
5e60: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
5e70: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
5e80: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a  TIMIZATION */...
5e90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5ea0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
5eb0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
5ec0: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
5ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
5ee0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
5ef0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
5f00: 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a  MATCH expr.**.**
5f10: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72   If it is then r
5f20: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
5f30: 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  not, return FALS
5f40: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
5f50: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
5f60: 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  (.  Expr *pExpr 
5f70: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
5f80: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
5f90: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
5fa0: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78  List;..  if( pEx
5fb0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
5fc0: 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ION ){.    retur
5fd0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
5fe0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
5ff0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
6000: 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20  atch")!=0 ){.   
6010: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6020: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
6030: 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
6040: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
6050: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6060: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
6070: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
6080: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
6090: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
60a0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
60b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
60c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
60d0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
60e0: 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73  the pBase expres
60f0: 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20  sion originated 
6100: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
6110: 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20  NG clause of.** 
6120: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61  a join, then tra
6130: 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70  nsfer the approp
6140: 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f  riate markings o
6150: 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a  ver to derived..
6160: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
6170: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
6180: 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76  ngs(Expr *pDeriv
6190: 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29  ed, Expr *pBase)
61a0: 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65 64  {.  if( pDerived
61b0: 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65 64   ){.    pDerived
61c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65  ->flags |= pBase
61d0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f  ->flags & EP_Fro
61e0: 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72 69  mJoin;.    pDeri
61f0: 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ved->iRightJoinT
6200: 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52  able = pBase->iR
6210: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20  ightJoinTable;. 
6220: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
6230: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
6240: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
6250: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6260: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6270: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
6280: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
6290: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
62a0: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
62b0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
62c0: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
62d0: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
62e0: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
62f0: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
6300: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
6340: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
6350: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
6360: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
6370: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
6380: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
6390: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
63a0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
63b0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
63c0: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
63d0: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
63e0: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
63f0: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
6400: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
6410: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
6420: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
6430: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
6440: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
6450: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
6460: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
6470: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
6480: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
6490: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
64a0: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
64b0: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
64c0: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
64d0: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
64e0: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
64f0: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
6500: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
6510: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
6520: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
6530: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
6540: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
6550: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
6560: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
6570: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
6580: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
6590: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
65a0: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
65b0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
65c0: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
65d0: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
65e0: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
65f0: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
6600: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
6610: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
6620: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
6630: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
6640: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
6650: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
6660: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
6670: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
6680: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
6690: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
66a0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
66b0: 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a  column of C and.
66c0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ** a single tabl
66d0: 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e  e T (as shown in
66e0: 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65   example B above
66f0: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  ) then create a 
6700: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
6710: 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65  erm that is an e
6720: 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70  quivalent IN exp
6730: 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  ression.  In oth
6740: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
6750: 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61   term.** being a
6760: 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a  nalyzed is:.**.*
6770: 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31  *      x = expr1
6780: 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20    OR  expr2 = x 
6790: 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a   OR  x = expr3.*
67a0: 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65  *.** then create
67b0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
67c0: 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  erm like this:.*
67d0: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
67e0: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
67f0: 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a  3).**.** CASE 2:
6800: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
6810: 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78  bterms are index
6820: 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65  able by a single
6830: 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73   table T, then s
6840: 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  et.**.**     Whe
6850: 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72  reTerm.eOperator
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
6870: 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68   WO_OR.**     Wh
6880: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
6890: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d  o->indexable  |=
68a0: 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    the cursor num
68b0: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a  ber for table T.
68c0: 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  **.** A subterm 
68d0: 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69  is "indexable" i
68e0: 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20 66  f it is of the f
68f0: 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e  orm.** "T.C <op>
6900: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 43   <expr>" where C
6910: 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   is any column o
6920: 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a  f table T and .*
6930: 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  * <op> is one of
6940: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c   "=", "<", "<=",
6950: 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20   ">", ">=", "IS 
6960: 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a  NULL", or "IN"..
6970: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
6980: 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69  also indexable i
6990: 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f  f it is an AND o
69a0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  f two or more.**
69b0: 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74 20   subsubterms at 
69c0: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69  least one of whi
69d0: 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e  ch is indexable.
69e0: 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20    Indexable AND 
69f0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76  .** subterms hav
6a00: 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f  e their eOperato
6a10: 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20  r set to WO_AND 
6a20: 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a  and they have.**
6a30: 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20   u.pAndInfo set 
6a40: 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  to a dynamically
6a50: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
6a60: 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a  AndTerm object..
6a70: 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68  **.** From anoth
6a80: 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77  er point of view
6a90: 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65  , "indexable" me
6aa0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
6ab0: 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f  term could.** po
6ac0: 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65  tentially be use
6ad0: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
6ae0: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
6af0: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a  e index exists..
6b00: 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  ** This analysis
6b10: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64   does not consid
6b20: 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  er whether or no
6b30: 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69 73  t the index exis
6b40: 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64  ts; that.** is d
6b50: 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72 65  ecided elsewhere
6b60: 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  .  This analysis
6b70: 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77   only looks at w
6b80: 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a  hether subterms.
6b90: 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
6ba0: 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73  or indexing exis
6bb0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61  t..**.** All exa
6bc0: 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20  mples A through 
6bd0: 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79 20  E above satisfy 
6be0: 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20  case 2.  But if 
6bf0: 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73  a term.** also s
6c00: 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31  tatisfies case 1
6c10: 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20   (such as B) we 
6c20: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70  know that the op
6c30: 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20  timizer will.** 
6c40: 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61  always prefer ca
6c50: 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74  se 1, so in that
6c60: 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64   case we pretend
6c70: 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20   that case 2 is 
6c80: 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64  not.** satisfied
6c90: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74  ..**.** It might
6ca0: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
6cb0: 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65  t multiple table
6cc0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e  s are indexable.
6cd0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a    For example,.*
6ce0: 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69  * (E) above is i
6cf0: 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c  ndexable on tabl
6d00: 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a  es P, Q, and R..
6d10: 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74  **.** Terms that
6d20: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20   satisfy case 2 
6d30: 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
6d40: 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69  or lookup by usi
6d50: 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69  ng.** separate i
6d60: 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72  ndices to find r
6d70: 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73  owids for each s
6d80: 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f  ubterm and compo
6d90: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f  sing.** the unio
6da0: 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20  n of all rowids 
6db0: 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f  using a RowSet o
6dc0: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20  bject.  This is 
6dd0: 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62  similar.** to "b
6de0: 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69  itmap indices" i
6df0: 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  n other database
6e00: 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20   engines..**.** 
6e10: 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a  OTHERWISE:.**.**
6e20: 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65   If neither case
6e30: 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70   1 nor case 2 ap
6e40: 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20  ply, then leave 
6e50: 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65  the eOperator se
6e60: 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54  t to.** zero.  T
6e70: 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
6e80: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63  useful for searc
6e90: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
6ea0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  d exprAnalyzeOrT
6eb0: 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  erm(.  SrcList *
6ec0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
6ed0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
6ee0: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
6ef0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
6f00: 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65     /* the comple
6f10: 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
6f20: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6f40: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  * Index of the O
6f50: 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  R-term to be ana
6f60: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
6f70: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
6f80: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20  = pWC->pWInfo;  
6f90: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
6fa0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
6fb0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
6fc0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
6fd0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
6fe0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
6ff0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
7000: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7010: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
7020: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7030: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
7040: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7050: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
7060: 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20  erm];    /* The 
7070: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
7080: 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  zed */.  Expr *p
7090: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
70a0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
70b0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
70c0: 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a  on of the term *
70d0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7100: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
7110: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
7120: 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42  OrWc;       /* B
7130: 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20  reakup of pTerm 
7140: 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
7150: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f  .  WhereTerm *pO
7160: 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20  rTerm;       /* 
7170: 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69  A Sub-term withi
7180: 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20  n the pOrWc */. 
7190: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f   WhereOrInfo *pO
71a0: 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64  rInfo;     /* Ad
71b0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
71c0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
71d0: 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20  with pTerm */.  
71e0: 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e  Bitmask chngToIN
71f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
7200: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7210: 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f  atisfy case 1 */
7220: 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78  .  Bitmask index
7230: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
7240: 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  Tables that are 
7250: 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73  indexable, satis
7260: 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a  fying case 2 */.
7270: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b  .  /*.  ** Break
7280: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
7290: 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65  nto its separate
72a0: 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20   subterms.  The 
72b0: 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a  subterms are.  *
72c0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68  * stored in a Wh
72d0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
72e0: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77  ure containing w
72f0: 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f  ithin the WhereO
7300: 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63  rInfo.  ** objec
7310: 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68  t that is attach
7320: 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ed to the origin
7330: 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72  al OR clause ter
7340: 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  m..  */.  assert
7350: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
7360: 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49  s & (TERM_DYNAMI
7370: 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45  C|TERM_ORINFO|TE
7380: 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20  RM_ANDINFO))==0 
7390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
73a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
73b0: 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  .  pTerm->u.pOrI
73c0: 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20  nfo = pOrInfo = 
73d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
73e0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
73f0: 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28  pOrInfo));.  if(
7400: 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65   pOrInfo==0 ) re
7410: 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  turn;.  pTerm->w
7420: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
7430: 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d  RINFO;.  pOrWc =
7440: 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20   &pOrInfo->wc;. 
7450: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
7460: 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b  (pOrWc, pWInfo);
7470: 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f  .  whereSplit(pO
7480: 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  rWc, pExpr, TK_O
7490: 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a  R);.  exprAnalyz
74a0: 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63  eAll(pSrc, pOrWc
74b0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
74c0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
74d0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  rn;.  assert( pO
74e0: 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b  rWc->nTerm>=2 );
74f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70  ..  /*.  ** Comp
7500: 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74  ute the set of t
7510: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
7520: 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31   satisfy cases 1
7530: 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e   or 2..  */.  in
7540: 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d  dexable = ~(Bitm
7550: 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49  ask)0;.  chngToI
7560: 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  N = ~(Bitmask)0;
7570: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
7580: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
7590: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
75a0: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
75b0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
75c0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
75d0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
75e0: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
75f0: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
7600: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
7610: 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65    assert( (pOrTe
7620: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
7630: 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d  ERM_ANDINFO|TERM
7640: 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  _ORINFO))==0 );.
7650: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
7660: 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e   0;.      pAndIn
7670: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
7680: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
7690: 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a  of(*pAndInfo));.
76a0: 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e        if( pAndIn
76b0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  fo ){.        Wh
76c0: 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57  ereClause *pAndW
76d0: 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  C;.        Where
76e0: 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a  Term *pAndTerm;.
76f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
7700: 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
7710: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
7720: 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
7730: 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  o = pAndInfo;.  
7740: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
7750: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41  tFlags |= TERM_A
7760: 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20  NDINFO;.        
7770: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
7780: 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20  or = WO_AND;.   
7790: 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70       pAndWC = &p
77a0: 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
77b0: 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65       whereClause
77c0: 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43  Init(pAndWC, pWC
77d0: 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  ->pWInfo);.     
77e0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41     whereSplit(pA
77f0: 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  ndWC, pOrTerm->p
7800: 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  Expr, TK_AND);. 
7810: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
7820: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64  zeAll(pSrc, pAnd
7830: 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  WC);.        pAn
7840: 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57  dWC->pOuter = pW
7850: 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  C;.        testc
7860: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
7870: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
7880: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
7890: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
78a0: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
78b0: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
78c0: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
78d0: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
78e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
78f0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
7900: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
7910: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
7920: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
7930: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
7940: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
7950: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
7960: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54  >sMaskSet, pAndT
7970: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
7980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7990: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
79a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
79b0: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
79c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
79d0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
79e0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
79f0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ED ){.      /* S
7a00: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f  kip this term fo
7a10: 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73  r now.  We revis
7a20: 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72  it it when we pr
7a30: 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20  ocess the.      
7a40: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
7a50: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65   TERM_VIRTUAL te
7a60: 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  rm */.    }else{
7a70: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62  .      Bitmask b
7a80: 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d  ;.      b = getM
7a90: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
7aa0: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
7ab0: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
7ac0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
7ad0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
7ae0: 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20  IRTUAL ){.      
7af0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
7b00: 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  her = &pOrWc->a[
7b10: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
7b20: 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20  ];.        b |= 
7b30: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
7b40: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65  >sMaskSet, pOthe
7b50: 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  r->leftCursor);.
7b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
7b70: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
7b80: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
7b90: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7ba0: 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)==0 ){.     
7bb0: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
7bc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7bd0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
7be0: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
7bf0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
7c00: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
7c10: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
7c20: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
7c30: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
7c40: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
7c50: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
7c60: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
7c70: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
7c80: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
7c90: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
7ca0: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
7cb0: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
7cc0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7cd0: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
7ce0: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
7cf0: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
7d00: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
7d10: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
7d20: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
7d30: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
7d40: 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sfied..  **.  **
7d50: 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68   chngToIN will h
7d60: 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c  old either 0, 1,
7d70: 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65   or 2 bits.  The
7d80: 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e   0-bit case mean
7d90: 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72  s.  ** that ther
7da0: 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c  e is no possibil
7db0: 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ity of transform
7dc0: 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73  ing the OR claus
7dd0: 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49  e into an.  ** I
7de0: 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75  N operator becau
7df0: 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  se one or more t
7e00: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63  erms in the OR c
7e10: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20  lause contain.  
7e20: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ** something oth
7e30: 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20  er than == on a 
7e40: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69  column in the si
7e50: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
7e60: 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65   1-bit.  ** case
7e70: 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72   means that ever
7e80: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
7e90: 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68   clause is of th
7ea0: 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62  e form.  ** "tab
7eb0: 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20  le.column=expr" 
7ec0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
7ed0: 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20  table.  The one 
7ee0: 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a  bit that is set.
7ef0: 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73    ** will corres
7f00: 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d  pond to the comm
7f10: 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74  on table.  We st
7f20: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63  ill need to chec
7f30: 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  k to make.  ** s
7f40: 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ure the same col
7f50: 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61  umn is used on a
7f60: 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32  ll terms.  The 2
7f70: 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65  -bit case is whe
7f80: 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74  n.  ** the all t
7f90: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
7fa0: 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c  form "table1.col
7fb0: 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d  umn=table2.colum
7fc0: 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67  n".  It.  ** mig
7fd0: 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ht be possible t
7fe0: 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65  o form an IN ope
7ff0: 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65  rator with eithe
8000: 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a  r table1.column.
8010: 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63    ** or table2.c
8020: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53  olumn as the LHS
8030: 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f   if either is co
8040: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
8050: 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f  rm of.  ** the O
8060: 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  R clause..  **. 
8070: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65   ** Note that te
8080: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
8090: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74  "table.column1=t
80a0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74  able.column2" (t
80b0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
80c0: 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73  le on both sizes
80d0: 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e   of the ==) cann
80e0: 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e  ot be optimized.
80f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  .  */.  if( chng
8100: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ToIN ){.    int 
8110: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8120: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
8130: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
8140: 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a  to IN is valid *
8150: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
8160: 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  n = -1;         
8170: 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  /* Column index 
8180: 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65  on lhs of IN ope
8190: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  rator */.    int
81a0: 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20   iCursor = -1;  
81b0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
81c0: 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f  cursor common to
81d0: 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20   all terms */.  
81e0: 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20    int j = 0;    
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8200: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8210: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
8220: 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  r a table and co
8230: 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72  lumn that appear
8240: 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72  s on one side or
8250: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
8260: 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72  r of the == oper
8270: 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75  ator in every su
8280: 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62  bterm.  That tab
8290: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20  le and column.  
82a0: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63    ** will be rec
82b0: 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72  orded in iCursor
82c0: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54   and iColumn.  T
82d0: 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  here might not b
82e0: 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  e any.    ** suc
82f0: 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  h table and colu
8300: 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e  mn.  Set okToChn
8310: 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72  gToIN if an appr
8320: 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20  opriate table.  
8330: 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    ** and column 
8340: 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61  is found but lea
8350: 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  ve okToChngToIN 
8360: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
8370: 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nd..    */.    f
8380: 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21  or(j=0; j<2 && !
8390: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b  okToChngToIN; j+
83a0: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72  +){.      pOrTer
83b0: 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20  m = pOrWc->a;.  
83c0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
83d0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
83e0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
83f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8400: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
8410: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
8420: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8430: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
8440: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
8450: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
8460: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
8470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
8480: 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62   This is the 2-b
8490: 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61  it case and we a
84a0: 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  re on the second
84b0: 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20   iteration and. 
84c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
84d0: 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d  ent term is from
84e0: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
84f0: 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74  tion.  So skip t
8500: 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  his term. */.   
8510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
8520: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
8530: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8540: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8550: 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74   (chngToIN & get
8560: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
8570: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
8580: 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30  >leftCursor))==0
8590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
85a0: 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20   This term must 
85b0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74  be of the form t
85c0: 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20  1.a==t2.b where 
85d0: 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20  t2 is in the.   
85e0: 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f         ** chngTo
85f0: 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73  IN set but t1 is
8600: 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d   not.  This term
8610: 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20   will be either 
8620: 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20  preceeded.      
8630: 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65      ** or follwe
8640: 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64  d by an inverted
8650: 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e   copy (t2.b==t1.
8660: 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74  a).  Skip this t
8670: 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a  erm .          *
8680: 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e  * and use its in
8690: 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  version. */.    
86a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
86b0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
86c0: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29   & TERM_COPIED )
86d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
86e0: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
86f0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
8700: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
8710: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
8720: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
8730: 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f  ERM_COPIED|TERM_
8740: 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20  VIRTUAL) );.    
8750: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8760: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8770: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54    iColumn = pOrT
8780: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
8790: 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73  n;.        iCurs
87a0: 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  or = pOrTerm->le
87b0: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
87c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
87d0: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29  .      if( i<0 )
87e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
87f0: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b  candidate table+
8800: 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64  column was found
8810: 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
8820: 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a   occur.        *
8830: 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  * on the second 
8840: 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  iteration */.   
8850: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
8860: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
8870: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
8880: 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20  o(chngToIN) );. 
8890: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
88a0: 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b  hngToIN==getMask
88b0: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
88c0: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
88d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
88e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
88f0: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
8900: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
8910: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
8920: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
8930: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
8940: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
8950: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
8960: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
8970: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
8980: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
8990: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
89a0: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
89b0: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
89c0: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
89d0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
89e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
89f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8a00: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
8a10: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
8a20: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73  eftCursor!=iCurs
8a30: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
8a40: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8a50: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
8a60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
8a70: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  f( pOrTerm->u.le
8a80: 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  ftColumn!=iColum
8a90: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  n ){.          o
8aa0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8ab0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8ac0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66            int af
8ad0: 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b  fLeft, affRight;
8ae0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
8af0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
8b00: 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63  side is also a c
8b10: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
8b20: 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20  affinities.     
8b30: 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20       ** of both 
8b40: 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  right and left s
8b50: 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63  ides must be suc
8b60: 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20  h that no type. 
8b70: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76           ** conv
8b80: 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75  ersions are requ
8b90: 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68  ired on the righ
8ba0: 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34  t.  (Ticket #224
8bb0: 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  9).          */.
8bc0: 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67            affRig
8bd0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
8be0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
8bf0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
8c00: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c  ;.          affL
8c10: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
8c20: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
8c30: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
8c40: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
8c50: 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61  affRight!=0 && a
8c60: 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74  ffRight!=affLeft
8c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8c80: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8c90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8ca0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
8cb0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8cc0: 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  |= TERM_OR_OK;. 
8cd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8ce0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8cf0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
8d00: 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68  is point, okToCh
8d10: 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69  ngToIN is true i
8d20: 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d  f original pTerm
8d30: 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a   satisfies.    *
8d40: 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68  * case 1.  In th
8d50: 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75  at case, constru
8d60: 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  ct a new virtual
8d70: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20   term that is . 
8d80: 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76     ** pTerm conv
8d90: 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e  erted into an IN
8da0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
8db0: 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68  /.    if( okToCh
8dc0: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20  ngToIN ){.      
8dd0: 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20  Expr *pDup;     
8de0: 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e         /* A tran
8df0: 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20  sient duplicate 
8e00: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
8e10: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
8e20: 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ist = 0;   /* Th
8e30: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
8e40: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
8e50: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
8e60: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  0;       /* The 
8e70: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
8e80: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
8e90: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
8ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
8eb0: 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74  mplete IN operat
8ec0: 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  or */..      for
8ed0: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
8ee0: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
8ef0: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
8f00: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
8f10: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
8f20: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8f30: 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e  _OR_OK)==0 ) con
8f40: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
8f50: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
8f60: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
8f70: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Q );.        ass
8f80: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  ert( pOrTerm->le
8f90: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8fa0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  r );.        ass
8fb0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  ert( pOrTerm->u.
8fc0: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
8fd0: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
8fe0: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
8ff0: 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d  rDup(db, pOrTerm
9000: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
9010: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69   0);.        pLi
9020: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
9030: 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66  ListAppend(pWInf
9040: 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74  o->pParse, pList
9050: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
9060: 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d   pLeft = pOrTerm
9070: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  ->pExpr->pLeft;.
9080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
9090: 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
90a0: 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73  ;.      pDup = s
90b0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
90c0: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
90d0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
90e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
90f0: 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30  K_IN, pDup, 0, 0
9100: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
9110: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  w ){.        int
9120: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
9130: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
9140: 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70  kings(pNew, pExp
9150: 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
9160: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9170: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
9180: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
9190: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73      pNew->x.pLis
91a0: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  t = pList;.     
91b0: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
91c0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
91d0: 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49  C, pNew, TERM_VI
91e0: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
91f0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  IC);.        tes
9200: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
9210: 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72   );.        expr
9220: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
9230: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
9240: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
9250: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
9260: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
9270: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
9280: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
9290: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
92a0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
92b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
92c0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
92d0: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  , pList);.      
92e0: 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65  }.      pTerm->e
92f0: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f  Operator = WO_NO
9300: 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74  OP;  /* case 1 t
9310: 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a  rumps case 2 */.
9320: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
9330: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
9340: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
9350: 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d  ON && !SQLITE_OM
9360: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
9380: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
9390: 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20  is an WhereTerm 
93a0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f  structure with o
93b0: 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70  nly the.** "pExp
93c0: 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20  r" field filled 
93d0: 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  in.  The job of 
93e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
93f0: 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a  to analyze the.*
9400: 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
9410: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c  and populate all
9420: 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64   the other field
9430: 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65  s of the WhereTe
9440: 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  rm.** structure.
9450: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
9460: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
9470: 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20  he form "<expr> 
9480: 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20  <op> X" it gets 
9490: 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74  commuted.** to t
94a0: 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d  he standard form
94b0: 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   of "X <op> <exp
94c0: 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  r>"..**.** If th
94d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
94e0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
94f0: 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74  op> Y" where bot
9500: 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a  h X and Y are.**
9510: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74   columns, then t
9520: 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72  he original expr
9530: 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e  ession is unchan
9540: 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69  ged and a new vi
9550: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66  rtual.** term of
9560: 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70   the form "Y <op
9570: 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f  > X" is added to
9580: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9590: 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65  e and.** analyze
95a0: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54  d separately.  T
95b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
95c0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
95d0: 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61  TERM_COPIED.** a
95e0: 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20  nd the new term 
95f0: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
9600: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63  ERM_DYNAMIC (bec
9610: 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a  ause it's pExpr.
9620: 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  ** needs to be f
9630: 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68  reed with the Wh
9640: 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54  ereClause) and T
9650: 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63  ERM_VIRTUAL (bec
9660: 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20  ause it.** is a 
9670: 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66  commuted copy of
9680: 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20   a prior term.) 
9690: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
96a0: 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a  rm has nChild=1.
96b0: 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20  ** and the copy 
96c0: 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65  has idxParent se
96d0: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
96e0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  f the original t
96f0: 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  erm..*/.static v
9700: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
9710: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
9720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
9730: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
9740: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
9750: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
9760: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
9770: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
9780: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
9790: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
97a0: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
97b0: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
97c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
97d0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f  = pWC->pWInfo; /
97e0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  * WHERE clause p
97f0: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
9800: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
9810: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
9820: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
9830: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
9840: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  ed */.  WhereMas
9850: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
9860: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
9870: 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d  of table index m
9880: 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a  asks */.  Expr *
9890: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
98b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
98c0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
98d0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c   Bitmask prereqL
98e0: 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
98f0: 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74    /* Prerequesit
9900: 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d  es of the pExpr-
9910: 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d  >pLeft */.  Bitm
9920: 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ask prereqAll;  
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9940: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
9950: 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d   pExpr */.  Bitm
9960: 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d  ask extraRight =
9970: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
9980: 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69  Extra dependenci
9990: 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20  es on LEFT JOIN 
99a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31  */.  Expr *pStr1
99b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
99c0: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
99d0: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
99e0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  or */.  int isCo
99f0: 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20  mplete = 0;     
9a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
9a10: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64  of LIKE/GLOB end
9a20: 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64 20  s with wildcard 
9a30: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20  */.  int noCase 
9a40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9a50: 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c        /* LIKE/GL
9a60: 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65 73  OB distinguishes
9a70: 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
9a80: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9aa0: 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f  op-level operato
9ab0: 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f  r.  pExpr->op */
9ac0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9ad0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
9ae0: 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63  e;  /* Parsing c
9af0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
9b00: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9b10: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  ->db;        /* 
9b20: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
9b30: 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62  ion */..  if( db
9b40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9b50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
9b60: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
9b70: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
9b80: 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e  pMaskSet = &pWIn
9b90: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20  fo->sMaskSet;.  
9ba0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
9bb0: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
9bc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53  pExpr->op!=TK_AS
9bd0: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
9be0: 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70  K_COLLATE );.  p
9bf0: 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72  rereqLeft = expr
9c00: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9c10: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Set, pExpr->pLef
9c20: 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  t);.  op = pExpr
9c30: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
9c40: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73  TK_IN ){.    ass
9c50: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
9c60: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ht==0 );.    if(
9c70: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
9c80: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
9c90: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70  lect) ){.      p
9ca0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9cb0: 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61  t = exprSelectTa
9cc0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
9cd0: 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
9ce0: 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ect);.    }else{
9cf0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
9d00: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9d10: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
9d20: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9d30: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
9d40: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
9d50: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
9d60: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
9d70: 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ght = 0;.  }else
9d80: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
9d90: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54  reqRight = exprT
9da0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9db0: 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  et, pExpr->pRigh
9dc0: 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71  t);.  }.  prereq
9dd0: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
9de0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
9df0: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70  Expr);.  if( Exp
9e00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
9e10: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
9e20: 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
9e30: 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  x = getMask(pMas
9e40: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69  kSet, pExpr->iRi
9e50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20  ghtJoinTable);. 
9e60: 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20     prereqAll |= 
9e70: 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68  x;.    extraRigh
9e80: 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20  t = x-1;  /* ON 
9e90: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79  clause terms may
9ea0: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
9eb0: 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20  h an index.     
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62    ** on left tab
9ee0: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
9ef0: 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  N.  Ticket #3015
9f00: 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d   */.  }.  pTerm-
9f10: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
9f20: 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d  reqAll;.  pTerm-
9f30: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31  >leftCursor = -1
9f40: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
9f50: 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  nt = -1;.  pTerm
9f60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b  ->eOperator = 0;
9f70: 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70  .  if( allowedOp
9f80: 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72  (op) ){.    Expr
9f90: 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65   *pLeft = sqlite
9fa0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
9fb0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
9fc0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
9fd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
9fe0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
9ff0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31  >pRight);.    u1
a000: 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72  6 opMask = (pTer
a010: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
a020: 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20   prereqLeft)==0 
a030: 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51  ? WO_ALL : WO_EQ
a040: 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  UIV;.    if( pLe
a050: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
a060: 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  N ){.      pTerm
a070: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
a080: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
a090: 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66      pTerm->u.lef
a0a0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
a0b0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
a0c0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
a0d0: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
a0e0: 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20  op) & opMask;.  
a0f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67    }.    if( pRig
a100: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70  ht && pRight->op
a110: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
a120: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
a130: 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
a140: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31   *pDup;.      u1
a150: 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20  6 eExtraOp = 0; 
a160: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
a170: 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65  bits for pNew->e
a180: 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Operator */.    
a190: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
a1a0: 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20  tCursor>=0 ){.  
a1b0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
a1c0: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
a1d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a1e0: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
a1f0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
a200: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
a210: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a220: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
a230: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
a240: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
a250: 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  }.        idxNew
a260: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
a270: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
a280: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
a290: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
a2a0: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
a2b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
a2c0: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
a2d0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
a2e0: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
a2f0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
a300: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
a310: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
a320: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
a330: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
a340: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
a350: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
a360: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
a370: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20  pr->op==TK_EQ.  
a380: 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48         && !ExprH
a390: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
a3a0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
a3b0: 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
a3c0: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
a3d0: 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69  b, SQLITE_Transi
a3e0: 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b  tive).        ){
a3f0: 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
a400: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57  ->eOperator |= W
a410: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
a420: 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f     eExtraOp = WO
a430: 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20  _EQUIV;.        
a440: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
a450: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
a460: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
a470: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
a480: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
a490: 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75  mute(pParse, pDu
a4a0: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
a4b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
a4c0: 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70  pCollate(pDup->p
a4d0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65  Left);.      pNe
a4e0: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
a4f0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
a500: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66       pNew->u.lef
a510: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
a520: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
a530: 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65  testcase( (prere
a540: 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67  qLeft | extraRig
a550: 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66  ht) != prereqLef
a560: 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
a570: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
a580: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
a590: 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e  aRight;.      pN
a5a0: 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  ew->prereqAll = 
a5b0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20  prereqAll;.     
a5c0: 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72   pNew->eOperator
a5d0: 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b   = (operatorMask
a5e0: 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78  (pDup->op) + eEx
a5f0: 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b  traOp) & opMask;
a600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
a610: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a620: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
a630: 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74  TION.  /* If a t
a640: 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45  erm is the BETWE
a650: 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65  EN operator, cre
a660: 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74  ate two new virt
a670: 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74  ual terms.  ** t
a680: 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72  hat define the r
a690: 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45  ange that the BE
a6a0: 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73  TWEEN implements
a6b0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
a6c0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61    **.  **      a
a6d0: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
a6e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f  .  **.  ** is co
a6f0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20  nverted into:.  
a700: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20  **.  **      (a 
a710: 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29  BETWEEN b AND c)
a720: 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20   AND (a>=b) AND 
a730: 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a  (a<=c).  **.  **
a740: 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72   The two new ter
a750: 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74  ms are added ont
a760: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
a770: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
a780: 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65  ect..  ** The ne
a790: 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e  w terms are "dyn
a7a0: 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63 68  amic" and are ch
a7b0: 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72  ildren of the or
a7c0: 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20  iginal BETWEEN. 
a7d0: 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20   ** term.  That 
a7e0: 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
a7f0: 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69  e BETWEEN term i
a800: 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69  s coded, the chi
a810: 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73  ldren are.  ** s
a820: 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20  kipped.  Or, if 
a830: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
a840: 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61 6e   satisfied by an
a850: 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67   index, the orig
a860: 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45  inal.  ** BETWEE
a870: 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65  N term is skippe
a880: 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
a890: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
a8a0: 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d  _BETWEEN && pWC-
a8b0: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
a8c0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
a8d0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
a8e0: 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ist;.    int i;.
a8f0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
a900: 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f   u8 ops[] = {TK_
a910: 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20  GE, TK_LE};.    
a920: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
a930: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a940: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20  pList->nExpr==2 
a950: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
a960: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
a970: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
a980: 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65  .      int idxNe
a990: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  w;.      pNewExp
a9a0: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
a9b0: 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c  (pParse, ops[i],
a9c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
a9e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a9f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
aa00: 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
aa30: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
aa40: 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20  pExpr, 0), 0);. 
aa50: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
aa60: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
aa70: 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
aa80: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
aa90: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
aaa0: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
aab0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
aac0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
aad0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
aae0: 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  0 );.      exprA
aaf0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
ab00: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
ab10: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
ab20: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
ab30: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
ab40: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
ab50: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65  m;.    }.    pTe
ab60: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
ab70: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
ab80: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
ab90: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
aba0: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
abb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
abc0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
abd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
abe0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
abf0: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65   /* Analyze a te
ac00: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f  rm that is compo
ac10: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sed of two or mo
ac20: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
ac30: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e  ected by.  ** an
ac40: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   OR operator..  
ac50: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
ac60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
ac70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
ac80: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  C->op==TK_AND );
ac90: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
aca0: 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43  OrTerm(pSrc, pWC
acb0: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
acc0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
acd0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65  idxTerm];.  }.#e
ace0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
acf0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
ad00: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
ad10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
ad20: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
ad30: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
ad40: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
ad50: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
ad60: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
ad70: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
ad80: 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20   **.  ** A like 
ad90: 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66  pattern of the f
ada0: 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63  orm "x LIKE 'abc
adb0: 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69  %'" is changed i
adc0: 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nto constraints.
add0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
ade0: 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20     x>='abc' AND 
adf0: 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49  x<'abd' AND x LI
ae00: 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20  KE 'abc%'.  **. 
ae10: 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61   ** The last cha
ae20: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72  racter of the pr
ae30: 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e  efix "abc" is in
ae40: 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72  cremented to for
ae50: 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69  m the.  ** termi
ae60: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
ae70: 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69   "abd"..  */.  i
ae80: 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  f( pWC->op==TK_A
ae90: 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65  ND .   && isLike
aea0: 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70  OrGlob(pParse, p
aeb0: 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69  Expr, &pStr1, &i
aec0: 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61  sComplete, &noCa
aed0: 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70  se).  ){.    Exp
aee0: 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
aef0: 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* LHS of LIKE/G
af00: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
af10: 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b      Expr *pStr2;
af20: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
af30: 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66  f pStr1 - RHS of
af40: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
af50: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
af60: 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20  *pNewExpr1;.    
af70: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b  Expr *pNewExpr2;
af80: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31  .    int idxNew1
af90: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
afa0: 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f  2;.    Token sCo
afb0: 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e  llSeqName;  /* N
afc0: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67  ame of collating
afd0: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
afe0: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
aff0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
b000: 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20  Expr;.    pStr2 
b010: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b020: 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  (db, pStr1, 0);.
b030: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
b040: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b050: 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20     u8 c, *pC;   
b060: 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72      /* Last char
b070: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
b080: 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20   first wildcard 
b090: 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75  */.      pC = (u
b0a0: 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f  8*)&pStr2->u.zTo
b0b0: 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ken[sqlite3Strle
b0c0: 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f  n30(pStr2->u.zTo
b0d0: 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63  ken)-1];.      c
b0e0: 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66   = *pC;.      if
b0f0: 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20  ( noCase ){.    
b100: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
b110: 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74   is to increment
b120: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
b130: 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  ter before the f
b140: 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  irst.        ** 
b150: 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69  wildcard.  But i
b160: 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27  f we increment '
b170: 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75  @', that will pu
b180: 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20  sh it into the. 
b190: 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62         ** alphab
b1a0: 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72 65  etic range where
b1b0: 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e   case conversion
b1c0: 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74  s will mess up t
b1d0: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  he .        ** i
b1e0: 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61  nequality.  To a
b1f0: 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20  void this, make 
b200: 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e  sure to also run
b210: 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20   the full.      
b220: 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c    ** LIKE on all
b230: 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65   candidate expre
b240: 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69  ssions by cleari
b250: 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74  ng the isComplet
b260: 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a  e flag.        *
b270: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  /.        if( c=
b280: 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c  ='A'-1 ) isCompl
b290: 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ete = 0;.       
b2a0: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65   c = sqlite3Uppe
b2b0: 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20  rToLower[c];.   
b2c0: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d     }.      *pC =
b2d0: 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20   c + 1;.    }.  
b2e0: 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a    sCollSeqName.z
b2f0: 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43   = noCase ? "NOC
b300: 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b  ASE" : "BINARY";
b310: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
b320: 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65  e.n = 6;.    pNe
b330: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
b340: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
b350: 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  t, 0);.    pNewE
b360: 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr1 = sqlite3PE
b370: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47  xpr(pParse, TK_G
b380: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 73  E, .           s
b390: 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
b3a0: 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65  lateToken(pParse
b3b0: 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c  ,pNewExpr1,&sCol
b3c0: 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20  lSeqName),.     
b3d0: 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b        pStr1, 0);
b3e0: 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69  .    transferJoi
b3f0: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
b400: 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pr1, pExpr);.   
b410: 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65   idxNew1 = where
b420: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
b430: 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52  , pNewExpr1, TER
b440: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
b450: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
b460: 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d  tcase( idxNew1==
b470: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
b480: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
b490: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
b4a0: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
b4b0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
b4c0: 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
b4d0: 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50  Expr2 = sqlite3P
b4e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b4f0: 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  LT,.           s
b500: 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
b510: 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65  lateToken(pParse
b520: 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f 6c  ,pNewExpr2,&sCol
b530: 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20  lSeqName),.     
b540: 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b        pStr2, 0);
b550: 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69  .    transferJoi
b560: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
b570: 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pr2, pExpr);.   
b580: 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
b590: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
b5a0: 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
b5b0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
b5c0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
b5d0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d  tcase( idxNew2==
b5e0: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
b5f0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
b600: 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
b610: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
b620: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
b630: 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
b640: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
b650: 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
b660: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
b670: 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
b680: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
b690: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
b6a0: 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
b6b0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b6c0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
b6d0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
b6e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b6f0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
b700: 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41    /* Add a WO_MA
b710: 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65  TCH auxiliary te
b720: 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72  rm to the constr
b730: 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a  aint set if the.
b740: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70    ** current exp
b750: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
b760: 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20  e form:  column 
b770: 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a  MATCH expr..  **
b780: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
b790: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
b7a0: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
b7b0: 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74  ods of.  ** virt
b7c0: 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ual tables.  The
b7d0: 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70   native query op
b7e0: 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74  timizer does not
b7f0: 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
b800: 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74   do anything wit
b810: 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e  h MATCH function
b820: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  s..  */.  if( is
b830: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45  MatchOfColumn(pE
b840: 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
b850: 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72  idxNew;.    Expr
b860: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
b870: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
b880: 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42  *pNewTerm;.    B
b890: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c  itmask prereqCol
b8a0: 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b  umn, prereqExpr;
b8b0: 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ..    pRight = p
b8c0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
b8d0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [0].pExpr;.    p
b8e0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Left = pExpr->x.
b8f0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
b900: 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
b910: 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
b920: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
b930: 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
b940: 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
b950: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
b960: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
b970: 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
b980: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
b990: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
b9a0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
b9b0: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
b9c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b9d0: 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20  TK_MATCH, .     
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
ba00: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ba10: 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20  Right, 0), 0);. 
ba20: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
ba30: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
ba40: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
ba50: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
ba60: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
ba70: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
ba80: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  w==0 );.      pN
ba90: 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
baa0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
bab0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
bac0: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78  Right = prereqEx
bad0: 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  pr;.      pNewTe
bae0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
baf0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
bb00: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb10: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
bb20: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
bb30: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
bb40: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41  Operator = WO_MA
bb50: 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  TCH;.      pNewT
bb60: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
bb70: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
bb80: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
bb90: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
bba0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
bbb0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
bbc0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
bbd0: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
bbe0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
bbf0: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
bc00: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
bc10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
bc20: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
bc30: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
bc40: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
bc50: 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57 68  OR_STAT4.  /* Wh
bc60: 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  en sqlite_stat3 
bc70: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
bc80: 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f  s available an o
bc90: 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20  perator of the. 
bca0: 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e   ** form "x IS N
bcb0: 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d  OT NULL" can som
bcc0: 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61  etimes be evalua
bcd0: 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65  ted more efficie
bce0: 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e  ntly.  ** as "x>
bcf0: 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f  NULL" if x is no
bd00: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
bd10: 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f  MARY KEY.  So co
bd20: 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76  nstruct a.  ** v
bd30: 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74  irtual term of t
bd40: 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20  hat form..  **. 
bd50: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
bd60: 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d  e virtual term m
bd70: 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69  ust be tagged wi
bd80: 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20  th TERM_VNULL.  
bd90: 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56  This.  ** TERM_V
bda0: 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75  NULL tag will su
bdb0: 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e  ppress the not-n
bdc0: 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65  ull check at the
bdd0: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
bde0: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69  of the loop.  Wi
bdf0: 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56  thout the TERM_V
be00: 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e  NULL flag, the n
be10: 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
be20: 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20  .  ** the start 
be30: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  of the loop will
be40: 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73   prevent any res
be50: 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20  ults from being 
be60: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20  returned..  */. 
be70: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
be80: 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
be90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
bea0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
beb0: 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
bec0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26  >iColumn>=0.   &
bed0: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
bee0: 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
bef0: 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20 20  _Stat3).  ){.   
bf00: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
bf10: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
bf20: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
bf30: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
bf40: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
bf50: 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
bf60: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
bf70: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
bf80: 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
bfb0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
bfe0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
bff0: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
c000: 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
c010: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
c020: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
c030: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
c060: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
c070: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
c080: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
c090: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
c0a0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c0b0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c0c0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
c0d0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c0e0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c0f0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c100: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
c110: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
c120: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
c130: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
c140: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
c150: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
c160: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
c170: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
c180: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
c190: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
c1a0: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
c1b0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
c1c0: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
c1d0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c1e0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
c1f0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
c200: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c210: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
c220: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
c230: 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
c240: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
c250: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
c260: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
c270: 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
c280: 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
c290: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
c2a0: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
c2b0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
c2c0: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
c2d0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
c2e0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
c2f0: 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20 65  es pList for a e
c300: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 65  ntry that matche
c310: 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  s the iCol-th co
c320: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78  lumn.** of index
c330: 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pIdx..**.** If 
c340: 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69  such an expressi
c350: 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73  on is found, its
c360: 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d   index in pList-
c370: 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64  >a[] is returned
c380: 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65  . If.** no expre
c390: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
c3a0: 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
c3b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
c3c0: 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61  ndIndexCol(.  Pa
c3d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3f0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
c400: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
c410: 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
c420: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c430: 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68  n list to search
c440: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c   */.  int iBase,
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
c470: 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69  for table associ
c480: 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a  ated with pIdx *
c490: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
c4c0: 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  match column of 
c4d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f       /* Column o
c500: 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  f index to match
c510: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
c520: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
c530: 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
c540: 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72  ll[iCol];..  for
c550: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
c560: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
c570: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
c580: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
c590: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
c5a0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  pr);.    if( p->
c5b0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
c5c0: 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e     && p->iColumn
c5d0: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
c5e0: 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70  [iCol].     && p
c5f0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a  ->iTable==iBase.
c600: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c      ){.      Col
c610: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
c620: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
c630: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
c640: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
c650: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43     if( ALWAYS(pC
c660: 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74  oll) && 0==sqlit
c670: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
c680: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
c690: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
c6a0: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
c6b0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c6c0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
c6d0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
c6e0: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
c6f0: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
c700: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
c710: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
c720: 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
c730: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
c740: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68 65  redundant if the
c750: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
c760: 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20 6f  ns some subset o
c770: 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61  f.** columns tha
c780: 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e 64  t are unique and
c790: 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74   non-null..*/.st
c7a0: 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69  atic int isDisti
c7b0: 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20  nctRedundant(.  
c7c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c7e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c7f0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
c800: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ist,        /* T
c810: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
c820: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
c830: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
c840: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
c850: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
c860: 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20 20  *pDistinct      
c870: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
c880: 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  et that needs to
c890: 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a   be DISTINCT */.
c8a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
c8b0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
c8c0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b     .  int iBase;
c8f0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
c900: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
c910: 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65   table or sub-se
c920: 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d  lect in the FROM
c930: 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20   clause of.  ** 
c940: 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
c950: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
c960: 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77  possible to show
c970: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
c980: 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20  CT .  ** clause 
c990: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
c9a0: 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
c9b0: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
c9c0: 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70  n 0;.  iBase = p
c9d0: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
c9e0: 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20  ursor;.  pTab = 
c9f0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
ca00: 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  Tab;..  /* If an
ca10: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
ca20: 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63  ions is an IPK c
ca30: 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69  olumn on table i
ca40: 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72  Base, then retur
ca50: 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f  n .  ** true. No
ca60: 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62  te: The (p->iTab
ca70: 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20  le==iBase) part 
ca80: 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61 79  of this test may
ca90: 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68 65   be false if the
caa0: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45  .  ** current SE
cab0: 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c  LECT is a correl
cac0: 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ated sub-query..
cad0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
cae0: 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78  i<pDistinct->nEx
caf0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
cb00: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
cb10: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
cb20: 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70  Distinct->a[i].p
cb30: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
cb40: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
cb50: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
cb60: 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ase && p->iColum
cb70: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  n<0 ) return 1;.
cb80: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74    }..  /* Loop t
cb90: 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63  hrough all indic
cba0: 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c  es on the table,
cbb0: 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74   checking each t
cbc0: 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65  o see if it make
cbd0: 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49  s.  ** the DISTI
cbe0: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65  NCT qualifier re
cbf0: 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73  dundant. It does
cc00: 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a   so if:.  **.  *
cc10: 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78  *   1. The index
cc20: 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55   is itself UNIQU
cc30: 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a  E, and.  **.  **
cc40: 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65     2. All of the
cc50: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
cc60: 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72  index are either
cc70: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69   part of the pDi
cc80: 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20  stinct.  **     
cc90: 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74   list, or else t
cca0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
ccb0: 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20  contains a term 
ccc0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c  of the form "col
ccd0: 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77  =X",.  **      w
cce0: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73  here X is a cons
ccf0: 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20  tant value. The 
cd00: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
cd10: 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ces of the.  ** 
cd20: 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20       comparison 
cd30: 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  and select-list 
cd40: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
cd50: 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20   match those of 
cd60: 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
cd70: 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66    **   3. All of
cd80: 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c   those index col
cd90: 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74  umns for which t
cda0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
cdb0: 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20  does not.  **   
cdc0: 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f     contain a "co
cdd0: 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75  l=X" term are su
cde0: 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e  bject to a NOT N
cdf0: 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  ULL constraint..
ce00: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
ce10: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ce20: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
ce30: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
ce40: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
ce50: 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  _None ) continue
ce60: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ce70: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
ce80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36 20  i++){.      i16 
ce90: 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  iCol = pIdx->aiC
cea0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
ceb0: 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28  if( 0==findTerm(
cec0: 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c  pWC, iBase, iCol
ced0: 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57  , ~(Bitmask)0, W
cee0: 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20  O_EQ, pIdx) ){. 
cef0: 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43         int iIdxC
cf00: 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  ol = findIndexCo
cf10: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
cf20: 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
cf30: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
cf40: 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70  ( iIdxCol<0 || p
cf50: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
cf60: 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  notNull==0 ){.  
cf70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cf80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cf90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
cfa0: 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
cfb0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
cfc0: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
cfd0: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
cfe0: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
cff0: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
d000: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
d010: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
d020: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  0;.}.../*.** Est
d030: 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
d040: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
d050: 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
d060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
d070: 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74  st estLog(LogEst
d080: 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c   N){.  return N<
d090: 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  =10 ? 0 : sqlite
d0a0: 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b  3LogEst(N) - 33;
d0b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
d0c0: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
d0d0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
d0e0: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
d0f0: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
d100: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
d110: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
d120: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
d130: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
d140: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
d150: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
d160: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
d170: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
d180: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
d190: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d1a0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d1b0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45  ) && defined(WHE
d1c0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
d1d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
d1e0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
d1f0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d200: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d210: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
d220: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
d230: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d240: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d250: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d260: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
d270: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
d280: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
d290: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
d2a0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
d2b0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d2c0: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
d2d0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2e0: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
d2f0: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
d300: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d310: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
d320: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
d330: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
d340: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
d350: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
d360: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d370: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
d380: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
d390: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
d3a0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
d3b0: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
d3c0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
d3d0: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
d3e0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
d3f0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
d400: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d410: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d420: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
d430: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
d440: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d450: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d460: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d470: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
d480: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
d490: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
d4a0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
d4b0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
d4c0: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
d4d0: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
d4e0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
d4f0: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
d500: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d510: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
d520: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
d530: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d540: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
d550: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
d560: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
d570: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
d580: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
d590: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
d5a0: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
d5b0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
d5c0: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
d5d0: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
d5e0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
d5f0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
d600: 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c  imatedRows=%lld\
d610: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
d620: 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Rows);.}.#else.#
d630: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
d640: 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
d650: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
d660: 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
d670: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d680: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
d690: 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
d6a0: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
d6b0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
d6c0: 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
d6d0: 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
d6e0: 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
d6f0: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
d700: 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
d710: 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
d720: 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
d730: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d740: 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
d750: 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
d760: 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
d770: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
d780: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
d790: 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
d7a0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
d7b0: 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
d7c0: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
d7d0: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
d7e0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d800: 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
d810: 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
d820: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
d830: 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
d840: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
d850: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
d860: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
d870: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
d880: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74   WO_EQ)==0 ) ret
d890: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
d8a0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
d8b0: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
d8c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d8d0: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
d8e0: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
d8f0: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
d900: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
d910: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
d920: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
d930: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
d940: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
d950: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
d960: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
d970: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 1;.}.#endif...
d980: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d990: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
d9a0: 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  DEX./*.** Genera
d9b0: 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74  te code to const
d9c0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
d9d0: 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74  bject for an aut
d9e0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20  omatic index.** 
d9f0: 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68  and to set up th
da00: 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a  e WhereLevel obj
da10: 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68  ect pLevel so th
da20: 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  at the code gene
da30: 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75  rator.** makes u
da40: 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61  se of the automa
da50: 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  tic index..*/.st
da60: 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72  atic void constr
da70: 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
da80: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
da90: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
daa0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
dab0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
dac0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
dad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dae0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
daf0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
db00: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
db10: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
db20: 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65   term to get the
db30: 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20   next index */. 
db40: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
db50: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
db60: 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
db70: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
db80: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72  ilable */.  Wher
db90: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
dba0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
dbb0: 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20   new index here 
dbc0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79  */.){.  int nKey
dbd0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dbe0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dbf0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
dc00: 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65  constructed inde
dc10: 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
dc20: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
dc30: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
dc40: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
dc50: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
dc60: 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20  reTerm *pWCEnd; 
dc70: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
dc80: 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
dc90: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcb0: 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e  Object describin
dcc0: 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  g the transient 
dcd0: 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
dce0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
dcf0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72         /* Prepar
dd00: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
dd10: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
dd20: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69  */.  int addrIni
dd30: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
dd40: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
dd50: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
dd60: 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f  n bypass jump */
dd70: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
dd80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
dd90: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
dda0: 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  g indexed */.  i
ddb0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
ddc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
ddd0: 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66  p of the index f
dde0: 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ill loop */.  in
ddf0: 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
de00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
de10: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e  ister holding an
de20: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
de30: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de50: 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72  * Column counter
de60: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
de90: 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74  r */.  int mxBit
dea0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
deb0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
dec0: 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f  lumn in pSrc->co
ded0: 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lUsed */.  CollS
dee0: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
def0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
df00: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
df10: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  on a column */. 
df20: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
df30: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
df40: 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  The Loop object 
df50: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55  */.  char *zNotU
df60: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  sed;            
df70: 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
df80: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49  on the end of pI
df90: 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  dx */.  Bitmask 
dfa0: 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
dfb0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
dfc0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
dfd0: 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
dfe0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
dff0: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
e000: 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
e010: 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
e020: 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
e030: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
e040: 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
e050: 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
e060: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
e070: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
e080: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
e090: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
e0a0: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
e0b0: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
e0c0: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
e0d0: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
e0e0: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
e0f0: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
e100: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
e110: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
e120: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
e130: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
e140: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e150: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e160: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
e170: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
e180: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
e190: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
e1a0: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
e1b0: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
e1c0: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
e1d0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
e1e0: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
e1f0: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
e200: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
e210: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
e220: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
e230: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
e240: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
e250: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
e260: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
e270: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
e280: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
e290: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
e2a0: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
e2b0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
e2c0: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
e2d0: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
e2e0: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
e2f0: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
e300: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
e310: 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
e320: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
e330: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
e340: 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67  if( !sentWarning
e350: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e360: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
e370: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
e380: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ,.            "a
e390: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f  utomatic index o
e3a0: 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c  n %s(%s)", pTabl
e3b0: 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  e->zName,.      
e3c0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
e3d0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b  ol[iCol].zName);
e3e0: 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72  .        sentWar
e3f0: 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ning = 1;.      
e400: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  }.      if( (idx
e410: 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
e420: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e430: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
e440: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f  pParse->db, pLoo
e450: 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 20  p, nKeyCol+1) ) 
e460: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
e470: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b  pLoop->aLTerm[nK
e480: 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d  eyCol++] = pTerm
e490: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
e4a0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
e4b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e4c0: 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e  assert( nKeyCol>
e4d0: 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
e4e0: 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
e4f0: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79  p->nLTerm = nKey
e500: 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  Col;.  pLoop->ws
e510: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
e520: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
e530: 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
e540: 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
e560: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
e570: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e580: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
e590: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
e5a0: 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
e5b0: 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
e5c0: 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
e5d0: 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
e5e0: 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
e5f0: 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
e600: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
e610: 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
e620: 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
e630: 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
e640: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
e650: 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
e660: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
e670: 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
e680: 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
e690: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
e6a0: 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
e6b0: 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
e6c0: 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
e6d0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
e6e0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
e6f0: 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
e700: 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
e710: 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
e720: 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
e730: 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
e740: 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
e750: 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
e760: 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
e770: 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
e780: 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
e790: 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
e7a0: 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
e7b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
e7c0: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
e7d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
e7e0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
e7f0: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
e800: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
e810: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
e820: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
e830: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
e840: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
e850: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
e860: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
e870: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
e880: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
e890: 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77  ;.  }.  pLoop->w
e8a0: 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
e8b0: 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
e8c0: 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f  E_IDX_ONLY;..  /
e8d0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
e8e0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
e8f0: 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
e900: 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20  dex */.  pIdx = 
e910: 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
e920: 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73  ndexObject(pPars
e930: 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31  e->db, nKeyCol+1
e940: 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b  , 0, &zNotUsed);
e950: 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
e960: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70   return;.  pLoop
e970: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
e980: 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d   = pIdx;.  pIdx-
e990: 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69  >zName = "auto-i
e9a0: 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70  ndex";.  pIdx->p
e9b0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
e9c0: 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f    n = 0;.  idxCo
e9d0: 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
e9e0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
e9f0: 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
ea00: 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
ea10: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
ea20: 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
ea30: 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
ea40: 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
ea50: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
ea60: 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
ea70: 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
ea80: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
ea90: 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
eaa0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
eab0: 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
eac0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
ead0: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
eae0: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
eaf0: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
eb00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
eb10: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
eb20: 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
eb30: 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = cMask;.       
eb40: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
eb50: 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  n] = pTerm->u.le
eb60: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
eb70: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
eb80: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
eb90: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
eba0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
ebb0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49  ght);.        pI
ebc0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
ebd0: 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20  ALWAYS(pColl) ? 
ebe0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22  pColl->zName : "
ebf0: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
ec00: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
ec10: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
ec20: 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d  ( (u32)n==pLoop-
ec30: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a  >u.btree.nEq );.
ec40: 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
ec50: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
ec60: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
ec70: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
ec80: 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
ec90: 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
eca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
ecb0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
ecc0: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
ecd0: 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20  ASKBIT(i) ){.   
ece0: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
ecf0: 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
ed00: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
ed10: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
ed20: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
ed30: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
ed40: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
ed50: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
ed60: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
ed70: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
ed80: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
ed90: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
eda0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
edb0: 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
edc0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
edd0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
ede0: 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49  =nKeyCol );.  pI
edf0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
ee00: 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  = -1;.  pIdx->az
ee10: 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
ee20: 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  Y";..  /* Create
ee30: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
ee40: 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
ee50: 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
ee60: 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c  r>=0 );.  pLevel
ee70: 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
ee80: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
ee90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
eea0: 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e  v, OP_OpenAutoin
eeb0: 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  dex, pLevel->iId
eec0: 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  xCur, nKeyCol+1)
eed0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
eee0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
eef0: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62  se, pIdx);.  Vdb
ef00: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
ef10: 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
ef20: 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
ef30: 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
ef40: 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
ef50: 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
ef60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ef70: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
ef80: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
ef90: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
efa0: 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  e(v);.  regRecor
efb0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
efc0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
efd0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
efe0: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
eff0: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
f000: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
f010: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, 0, 0, 0, 0);.
f020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f030: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
f040: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
f050: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
f060: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
f070: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f080: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
f090: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f0a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
f0b0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
f0c0: 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56  r, addrTop+1); V
f0d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f0e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f0f0: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
f100: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
f110: 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
f120: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f130: 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
f140: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f150: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
f160: 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
f170: 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
f180: 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
f190: 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
f1a0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f1b0: 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
f1c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f1d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
f1e0: 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
f1f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f200: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
f210: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
f220: 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
f230: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
f240: 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
f250: 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
f260: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
f270: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
f280: 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
f290: 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
f2a0: 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
f2b0: 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
f2c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
f2d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
f2e0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
f2f0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
f300: 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
f310: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f320: 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
f330: 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
f340: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
f350: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
f360: 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
f370: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
f380: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
f390: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f3a0: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
f3b0: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
f3c0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
f3d0: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
f3e0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f3f0: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
f400: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
f410: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
f420: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
f430: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
f440: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
f450: 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
f460: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
f470: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
f480: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
f490: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
f4a0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
f4b0: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
f4c0: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
f4d0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
f4e0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
f4f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
f500: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
f510: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
f520: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
f530: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
f540: 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
f550: 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
f560: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f570: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f580: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
f590: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
f5a0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f5b0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
f5c0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f5d0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f5e0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
f5f0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f600: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
f610: 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63  O_EQUIV))==0 ) c
f620: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
f630: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
f640: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
f650: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65  ontinue;.    nTe
f660: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
f670: 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
f680: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
f690: 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
f6a0: 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
f6b0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
f6c0: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
f6d0: 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
f6e0: 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a  erBy part of.  *
f6f0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
f700: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
f710: 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65  re..  */.  nOrde
f720: 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rBy = 0;.  if( p
f730: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
f740: 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d  nt n = pOrderBy-
f750: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
f760: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
f770: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
f780: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
f790: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
f7a0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
f7b0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
f7c0: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
f7d0: 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
f7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f7f0: 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72  i==n){.      nOr
f800: 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d  derBy = n;.    }
f810: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
f820: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
f830: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f840: 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ture.  */.  pIdx
f850: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
f860: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
f870: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
f880: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
f8b0: 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
f8c0: 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
f8d0: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
f8f0: 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
f900: 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
f910: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
f920: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f930: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f940: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
f950: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
f960: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
f970: 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74  alize the struct
f980: 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ure.  The sqlite
f990: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
f9a0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
f9b0: 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
f9c0: 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
f9d0: 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
f9e0: 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
f9f0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67   from.  ** chang
fa00: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
fa10: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
fa20: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
fa30: 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69  rder to.  ** ini
fa40: 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
fa50: 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  elds..  */.  pId
fa60: 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
fa70: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fa80: 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
fa90: 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  nfo[1];.  pIdxOr
faa0: 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
fab0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
fac0: 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
fad0: 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
fae0: 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
faf0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
fb00: 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
fb10: 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
fb20: 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
fb30: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
fb40: 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
fb50: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
fb60: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
fb70: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
fb80: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fb90: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
fba0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
fbb0: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
fbc0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
fbd0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
fbe0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
fbf0: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
fc00: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
fc10: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fc20: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
fc30: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
fc40: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72    pUsage;..  for
fca0: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
fcb0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
fcc0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
fcd0: 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  ){.    u8 op;.  
fce0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
fcf0: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
fd00: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
fd10: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
fd20: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
fd30: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd40: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
fd50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
fd60: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fd70: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
fd80: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
fd90: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
fda0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
fdb0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
fdc0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
fdd0: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
fde0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
fdf0: 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55  WO_ISNULL|WO_EQU
fe00: 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
fe10: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
fe20: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
fe30: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
fe40: 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
fe50: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
fe60: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
fe70: 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
fe80: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
fe90: 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
fea0: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
feb0: 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
fec0: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
fed0: 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
fee0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
fef0: 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20   op;.    /* The 
ff00: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
ff10: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
ff20: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
ff30: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
ff40: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
ff50: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
ff60: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
ff70: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
ff80: 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
ff90: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
ffa0: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
ffb0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ffc0: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
ffd0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
ffe0: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
fff0: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
10000 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10010 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
10020 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
10030 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10040 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
10050 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
10060 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10070 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
10080 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
10090 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
100a0 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
100b0 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
100c0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
100d0 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
100e0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
100f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
10100 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c  WO_IN|WO_EQ|WO_L
10110 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
10120 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
10130 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
10140 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
10150 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
10160 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
10170 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
10180 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
10190 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
101a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
101b0 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
101c0 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
101d0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
101e0 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
101f0 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
10200 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
10210 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
10220 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
10230 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
10240 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
10250 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
10260 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
10270 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10280 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
10290 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
102a0 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
102b0 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
102c0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
102d0 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
102e0 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
102f0 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
10300 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
10310 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10320 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
10330 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
10340 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
10350 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
10360 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
10370 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
10380 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
10390 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
103a0 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
103b0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
103c0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
103d0 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
103e0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
103f0 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
10400 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
10410 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
10420 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
10430 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
10440 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
10450 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
10460 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
10470 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
10480 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
10490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
104a0 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
104b0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
104c0 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
104d0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
104e0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
104f0 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
10500 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
10510 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
10520 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
10530 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44   rc;..  TRACE_ID
10540 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
10550 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
10560 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
10570 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
10580 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
10590 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
105a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
105b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
105c0 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
105d0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
105e0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
105f0 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
10600 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
10610 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10620 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
10630 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
10640 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10650 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10660 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
10670 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
10680 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
10690 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
106a0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
106b0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
106c0 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
106d0 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
106e0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
106f0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
10700 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
10710 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10720 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
10730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10740 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10750 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
10760 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
10770 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
10780 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
10790 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
107a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
107b0 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
107c0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
107d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
107e0 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a  TUALTABLE) */...
107f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10800 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
10810 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
10820 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
10830 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
10840 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
10850 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
10860 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
10870 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
10880 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
10890 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
108a0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
108b0 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
108c0 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
108d0 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
108e0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
108f0 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
10900 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10910 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  K on success..*/
10920 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10930 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
10940 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10960 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10970 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
10980 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
10990 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
109a0 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
109b0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
109c0 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
109d0 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
109e0 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
109f0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
10a00 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
10a10 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
10a20 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
10a30 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
10a40 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a60 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
10a70 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
10a80 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
10a90 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
10aa0 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
10ab0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
10ac0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10ad0 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
10ae0 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
10af0 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
10b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b10 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
10b20 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
10b30 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  d */.  int i = p
10b40 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20  Idx->nSample;   
10b50 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
10b60 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
10b70 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
10b80 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ec */.  int iTes
10b90 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10ba0 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
10bb0 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
10bc0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10be0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
10bf0 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
10c00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10c10 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
10c20 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73  PARAMETER( pPars
10c30 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  e );.#endif.  as
10c40 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b  sert( pRec!=0 );
10c50 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e  .  iCol = pRec->
10c60 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73  nField - 1;.  as
10c70 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
10c80 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
10c90 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
10ca0 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
10cb0 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20  nSampleCol );.  
10cc0 64 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20  do{.    iTest = 
10cd0 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20  (iMin+i)/2;.    
10ce0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
10cf0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
10d00 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c  Sample[iTest].n,
10d10 20 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e   aSample[iTest].
10d20 70 2c 20 70 52 65 63 2c 20 30 29 3b 0a 20 20 20  p, pRec, 0);.   
10d30 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
10d40 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
10d50 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
10d60 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b 0a       i = iTest;.
10d70 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
10d80 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29 3b  res && iMin<i );
10d90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10da0 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
10db0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
10dc0 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
10dd0 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
10de0 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
10df0 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
10e00 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
10e10 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
10e20 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
10e30 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
10e40 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
10e50 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  ts.  */.  if( re
10e60 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  s==0 ){.    /* I
10e70 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
10e80 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65 20  ue, then sample 
10e90 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  $i must be equal
10ea0 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20 20   to pRec */.    
10eb0 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
10ec0 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61  nSample );.    a
10ed0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
10ee0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10ef0 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
10f00 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
10f10 52 65 63 2c 20 30 29 0a 20 20 20 20 20 20 20 20  Rec, 0).        
10f20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
10f30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
10f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
10f50 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
10f60 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
10f70 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
10f80 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
10f90 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
10fa0 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
10fb0 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
10fc0 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
10fd0 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
10fe0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
10ff0 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
11000 65 5b 69 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29  e[i].p, pRec, 0)
11010 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  >0.         || p
11020 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
11030 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61  cFailed );.    a
11040 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20  ssert( i==0.    
11050 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
11060 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
11070 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c  (aSample[i-1].n,
11080 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c   aSample[i-1].p,
11090 20 70 52 65 63 2c 20 30 29 3c 30 0a 20 20 20 20   pRec, 0)<0.    
110a0 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
110b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
110c0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   );.  }.#endif /
110d0 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
110e0 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74  EBUG */..  /* At
110f0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61   this point, aSa
11100 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
11110 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  irst sample that
11120 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
11130 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74  .  ** or equal t
11140 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69  o pVal.  Or if i
11150 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
11160 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   then all sample
11170 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20  s are less.  ** 
11180 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61  than pVal.  If a
11190 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c  Sample[i]==pVal,
111a0 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20   then res==0..  
111b0 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  */.  if( res==0 
111c0 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  ){.    aStat[0] 
111d0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
111e0 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74  t[iCol];.    aSt
111f0 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[1] = aSample[
11200 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20  i].anEq[iCol];. 
11210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77   }else{.    tRow
11220 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  cnt iLower, iUpp
11230 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
11240 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
11250 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
11260 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
11270 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[0].anLt[iCol]
11280 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11290 20 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73     i64 nRow0 = s
112a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
112b0 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
112c0 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  Est[0]);.      i
112d0 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d  Upper = i>=pIdx-
112e0 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f 77 30  >nSample ? nRow0
112f0 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   : aSample[i].an
11300 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  Lt[iCol];.      
11310 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
11320 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d  [i-1].anEq[iCol]
11330 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   + aSample[i-1].
11340 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
11350 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  }.    aStat[1] =
11360 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43   pIdx->aAvgEq[iC
11370 6f 6c 5d 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f  ol];.    if( iLo
11380 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
11390 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20       iGap = 0;. 
113a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
113b0 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20  iGap = iUpper - 
113c0 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20  iLower;.    }.  
113d0 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b    if( roundUp ){
113e0 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69  .      iGap = (i
113f0 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65  Gap*2)/3;.    }e
11400 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
11410 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a  = iGap/3;.    }.
11420 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69      aStat[0] = i
11430 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20  Lower + iGap;.  
11440 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
11450 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
11460 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
11470 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f  *.** If it is no
11480 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73  t NULL, pTerm is
11490 20 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f   a term that pro
114a0 76 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f  vides an upper o
114b0 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64  r lower.** bound
114c0 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e   on a range scan
114d0 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64  . Without consid
114e0 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20  ering pTerm, it 
114f0 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a  is estimated .**
11500 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
11510 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72  ill visit nNew r
11520 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
11530 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
11540 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74  umber.** estimat
11550 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  ed to be visited
11560 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54   after taking pT
11570 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  erm into account
11580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75  ..**.** If the u
11590 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73  ser explicitly s
115a0 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c  pecified a likel
115b0 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f  ihood() value fo
115c0 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20  r this term,.** 
115d0 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
115e0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b  value is the lik
115f0 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69  elihood multipli
11600 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
11610 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77   of.** input row
11620 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  s. Otherwise, th
11630 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
11640 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20  mes that an "IS 
11650 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a  NOT NULL" term.*
11660 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f  * has a likeliho
11670 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20  od of 0.50, and 
11680 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61  any other term a
11690 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
116a0 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  .25..*/.static L
116b0 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65  ogEst whereRange
116c0 41 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d  Adjust(WhereTerm
116d0 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20   *pTerm, LogEst 
116e0 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20  nNew){.  LogEst 
116f0 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69  nRet = nNew;.  i
11700 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
11710 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
11720 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20  Prob<=0 ){.     
11730 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e   nRet += pTerm->
11740 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d  truthProb;.    }
11750 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
11760 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
11770 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
11780 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20     nRet -= 20;  
11790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30        assert( 20
117a0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
117b0 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  4) );.    }.  }.
117c0 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d    return nRet;.}
117d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
117e0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
117f0 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STAT4./* .** Thi
11800 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
11810 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  lled to estimate
11820 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
11830 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61  ows visited by a
11840 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f  .** range-scan o
11850 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e  n a skip-scan in
11860 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  dex. For example
11870 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
11880 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
11890 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53  a, b, c);.**   S
118a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
118b0 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63 20  WHERE a=? AND c 
118c0 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b  BETWEEN ? AND ?;
118d0 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f  .**.** Value pLo
118e0 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72 72  op->nOut is curr
118f0 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65  ently set to the
11900 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
11910 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69  r of rows .** vi
11920 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e 69  sited for scanni
11930 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29  ng (a=? AND b=?)
11940 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
11950 72 65 64 75 63 65 73 20 74 68 61 74 20 65 73 74  reduces that est
11960 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d  imate .** by som
11970 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63 6f  e factor to acco
11980 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20 42  unt for the (c B
11990 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20  ETWEEN ? AND ?) 
119a0 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65 64  expression based
119b0 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74 34  .** on the stat4
119c0 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e   data for the in
119d0 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20 77  dex. this scan w
119e0 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64 20  ill be peformed 
119f0 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d  multiple .** tim
11a00 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61 63  es (once for eac
11a10 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74  h (a,b) combinat
11a20 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73  ion that matches
11a30 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20 77   a=?) is dealt w
11a40 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ith .** by the c
11a50 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  aller..**.** It 
11a60 64 6f 65 73 20 74 68 69 73 20 62 79 20 73 63 61  does this by sca
11a70 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
11a80 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73 2c  l stat4 samples,
11a90 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65   comparing value
11aa0 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66  s.** extracted f
11ab0 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  rom pLower and p
11ac0 55 70 70 65 72 20 77 69 74 68 20 74 68 65 20 63  Upper with the c
11ad0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
11ae0 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73  umn in each.** s
11af0 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20  ample. If L and 
11b00 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72  U are the number
11b10 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e   of samples foun
11b20 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
11b30 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  n or.** equal to
11b40 20 74 68 65 20 76 61 6c 75 65 73 20 65 78 74 72   the values extr
11b50 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
11b60 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
11b70 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a  pectively, and.*
11b80 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c  * N is the total
11b90 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c   number of sampl
11ba0 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e  es, the pLoop->n
11bb0 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61 64 6a  Out value is adj
11bc0 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c  usted.** as foll
11bd0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75  ows:.**.**   nOu
11be0 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e  t = nOut * ( min
11bf0 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29  (U - L, 1) / N )
11c00 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72  .**.** If pLower
11c10 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76   is NULL, or a v
11c20 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65  alue cannot be e
11c30 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
11c40 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20  e term, L is.** 
11c50 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20  set to zero. If 
11c60 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20  pUpper is NULL, 
11c70 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  or a value canno
11c80 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
11c90 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20  rom it,.** U is 
11ca0 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20  set to N..**.** 
11cb0 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66  Normally, this f
11cc0 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 62  unction sets *pb
11cd0 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72 65  Done to 1 before
11ce0 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65   returning. Howe
11cf0 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61  ver,.** if no va
11d00 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74 72 61  lue can be extra
11d10 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72  cted from either
11d20 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70 65   pLower or pUppe
11d30 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a  r (and so the.**
11d40 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
11d50 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
11d60 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69 6e  delivered remain
11d70 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70  s unchanged), *p
11d80 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74  bDone.** is left
11d90 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   as is..**.** If
11da0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11db0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
11dc0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
11dd0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
11de0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ** SQLITE_OK..*/
11df0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
11e00 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73  eRangeSkipScanEs
11e10 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
11e20 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
11e30 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
11e40 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
11e50 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
11e60 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65  Lower,   /* Lowe
11e70 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
11e80 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33  ange. ex: "x>123
11e90 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
11ea0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
11eb0 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70  pUpper,   /* Upp
11ec0 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
11ed0 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35  range. ex: "x<45
11ee0 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  5" Might be NULL
11ef0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
11f00 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70  *pLoop,    /* Up
11f10 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20 76  date the .nOut v
11f20 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f  alue of this loo
11f30 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f  p */.  int *pbDo
11f40 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne          /* S
11f50 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 74  et to true if at
11f60 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72 2e   least one expr.
11f70 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   value extracted
11f80 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
11f90 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  p = pLoop->u.btr
11fa0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
11fb0 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
11fc0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c  btree.nEq;.  sql
11fd0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11fe0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f  e->db;.  int nLo
11ff0 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  wer = -1;.  int 
12000 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d  nUpper = p->nSam
12010 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20  ple+1;.  int rc 
12020 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
12030 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c  8 aff = p->pTabl
12040 65 2d 3e 61 43 6f 6c 5b 20 70 2d 3e 61 69 43 6f  e->aCol[ p->aiCo
12050 6c 75 6d 6e 5b 6e 45 71 5d 20 5d 2e 61 66 66 69  lumn[nEq] ].affi
12060 6e 69 74 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  nity;.  CollSeq 
12070 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c  *pColl;.  .  sql
12080 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d  ite3_value *p1 =
12090 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
120a0 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
120b0 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20  from pLower */. 
120c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
120d0 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p2 = 0;         
120e0 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
120f0 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20  ted from pUpper 
12100 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
12110 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20  ue *pVal = 0;   
12120 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
12130 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63  tracted from rec
12140 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20  ord */..  pColl 
12150 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
12160 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
12170 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a  ->azColl[nEq]);.
12180 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
12190 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
121a0 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
121b0 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65  pr(pParse, pLowe
121c0 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
121d0 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20  , aff, &p1);.   
121e0 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d   nLower = 0;.  }
121f0 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26  .  if( pUpper &&
12200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12210 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
12220 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
12230 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70  Expr(pParse, pUp
12240 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
12250 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20  ht, aff, &p2);. 
12260 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f     nUpper = p2 ?
12270 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b   0 : p->nSample;
12280 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c  .  }..  if( p1 |
12290 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  | p2 ){.    int 
122a0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66  i;.    int nDiff
122b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  ;.    for(i=0; r
122c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
122d0 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  i<p->nSample; i+
122e0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  +){.      rc = s
122f0 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d  qlite3Stat4Colum
12300 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  n(db, p->aSample
12310 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c  [i].p, p->aSampl
12320 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56  e[i].n, nEq, &pV
12330 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
12340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12350 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p1 ){.        in
12360 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
12370 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56  emCompare(p1, pV
12380 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
12390 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
123a0 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20   nLower++;.     
123b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
123c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32  =SQLITE_OK && p2
123d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
123e0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
123f0 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c  Compare(p2, pVal
12400 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
12410 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
12420 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Upper++;.      }
12430 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66  .    }.    nDiff
12440 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f   = (nUpper - nLo
12450 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  wer);.    if( nD
12460 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d  iff<=0 ) nDiff =
12470 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   1;..    /* If t
12480 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20  here is both an 
12490 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
124a0 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c  bound specified,
124b0 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
124c0 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64   comparisons ind
124d0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20  icate that they 
124e0 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68  are close togeth
124f0 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c  er, use the fall
12500 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68  back.    ** meth
12510 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20  od (assume that 
12520 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20  the scan visits 
12530 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73  1/64 of the rows
12540 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67  ) for estimating
12550 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  .    ** the numb
12560 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
12570 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  ed. Otherwise, e
12580 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
12590 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a  er of rows.    *
125a0 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68  * using the meth
125b0 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  od described in 
125c0 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
125d0 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  nt for this func
125e0 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
125f0 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70   nDiff!=1 || pUp
12600 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72  per==0 || pLower
12610 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
12620 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69   nAdjust = (sqli
12630 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61  te3LogEst(p->nSa
12640 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c  mple) - sqlite3L
12650 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20  ogEst(nDiff));. 
12660 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
12670 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20   -= nAdjust;.   
12680 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a     *pbDone = 1;.
12690 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
126a0 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73  (0x10, ("range s
126b0 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73  kip-scan regions
126c0 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74  : %u..%u  adjust
126d0 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20  =%d est=%d\n",. 
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72            nLower
12700 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73  , nUpper, nAdjus
12710 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  t*-1, pLoop->nOu
12720 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  t));.    }..  }e
12730 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
12740 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20   *pbDone==0 );. 
12750 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   }..  sqlite3Val
12760 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71  ueFree(p1);.  sq
12770 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
12780 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  2);.  sqlite3Val
12790 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
127a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
127b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
127c0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
127d0 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TAT4 */../*.** T
127e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
127f0 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  used to estimate
12800 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12810 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
12820 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73   visited.** by s
12830 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78  canning an index
12840 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20   for a range of 
12850 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67  values. The rang
12860 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70  e may have an up
12870 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20  per.** bound, a 
12880 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20  lower bound, or 
12890 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20  both. The WHERE 
128a0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
128b0 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a  t set the upper.
128c0 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  ** and lower bou
128d0 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e  nds are represen
128e0 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e  ted by pLower an
128f0 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
12900 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78  ively. For.** ex
12910 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
12920 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20  that index p is 
12930 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20  on t1(a):.**.** 
12940 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
12950 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
12960 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  < ? ....**      
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f                |_
12980 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a  ____|   |_____|.
12990 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
129a0 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
129b0 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
129c0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77              pLow
129d0 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a  er    pUpper.**.
129e0 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
129f0 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  the upper or low
12a00 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20  er bound is not 
12a10 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55  present, then NU
12a20 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a  LL is passed in.
12a30 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  ** place of the 
12a40 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
12a50 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
12a60 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75  he value in (pBu
12a70 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
12a80 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65  tree.nEq) is the
12a90 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e   index of the in
12aa0 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75  dex.** column su
12ab0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e  bject to the ran
12ac0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f  ge constraint. O
12ad0 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c  r, equivalently,
12ae0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
12af0 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
12b00 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64  raints optimized
12b10 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64   by the proposed
12b20 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72   index scan. For
12b30 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73   example,.** ass
12b40 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
12b50 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e   on t1(a, b), an
12b60 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  d the SQL query 
12b70 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
12b80 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
12b90 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e  = ? AND b > ? AN
12ba0 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D b < ? ....**.*
12bb0 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
12bc0 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72  t to 1 (as the r
12bd0 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
12be0 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68  column, b, is th
12bf0 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66  e second .** lef
12c00 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
12c10 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c   the index). Or,
12c20 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
12c30 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
12c40 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
12c50 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
12c60 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
12c70 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
12c80 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
12c90 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
12ca0 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pnOut is set to
12cb0 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45   the sqlite3LogE
12cc0 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  st() of the.** n
12cd0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
12ce0 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  at the index sca
12cf0 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  n is expected to
12d00 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a   visit without .
12d10 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  ** considering t
12d20 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
12d30 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20  ints. If nEq is 
12d40 30 2c 20 74 68 69 73 20 69 73 20 74 68 65 20 6e  0, this is the n
12d50 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77  umber of .** row
12d60 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20  s in the index. 
12d70 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  Assuming no erro
12d80 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74  r occurs, *pnOut
12d90 20 69 73 20 61 64 6a 75 73 74 65 64 20 28 72 65   is adjusted (re
12da0 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63  duced).** to acc
12db0 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e  ount for the ran
12dc0 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 70 4c  ge contraints pL
12dd0 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e  ower and pUpper.
12de0 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61  .** .** In the a
12df0 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
12e00 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64  _stat4 ANALYZE d
12e10 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20  ata, or if such 
12e20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  data cannot be.*
12e30 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65  * used, a single
12e40 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
12e50 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
12e60 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
12e70 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
12e80 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63   and a pair of c
12e90 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20  onstraints (x>? 
12ea0 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73  AND x<?) reduces
12eb0 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75   the expected nu
12ec0 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20  mber of.** rows 
12ed0 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63  visited by a fac
12ee0 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74  tor of 64..*/.st
12ef0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
12f00 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ngeScanEst(.  Pa
12f10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
12f20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
12f30 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
12f40 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
12f50 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
12f60 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65  Builder,.  Where
12f70 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
12f80 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
12f90 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
12fa0 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
12fb0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
12fc0 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
12fd0 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
12fe0 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
12ff0 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
13000 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
13010 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20  reLoop *pLoop   
13020 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20    /* Modify the 
13030 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20  .nOut and maybe 
13040 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a  .rRun fields */.
13050 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13060 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
13070 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Out = pLoop->nOu
13080 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77  t;.  LogEst nNew
13090 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
130a0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
130b0 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a  _STAT4.  Index *
130c0 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  p = pLoop->u.btr
130d0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
130e0 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
130f0 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66  btree.nEq;..  if
13100 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a 20  ( p->nSample>0. 
13110 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d    && nEq<p->nSam
13120 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74  pleCol.   && Opt
13130 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
13140 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
13150 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b  ITE_Stat3) .  ){
13160 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42  .    if( nEq==pB
13170 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
13180 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63  d ){.      Unpac
13190 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20  kedRecord *pRec 
131a0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63  = pBuilder->pRec
131b0 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  ;.      tRowcnt 
131c0 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61  a[2];.      u8 a
131d0 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61  ff;..      /* Va
131e0 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69  riable iLower wi
131f0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
13200 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
13210 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13220 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  in .      ** the
13230 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
13240 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f  less than the lo
13250 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
13260 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68   range query. Th
13270 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72  e.      ** lower
13280 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
13290 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
132a0 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
132b0 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
132c0 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78     ** key-prefix
132d0 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e   formed by the n
132e0 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65  Eq values matche
132f0 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45  d against the nE
13300 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20  q left-most.    
13310 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20    ** columns of 
13320 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24  the index, and $
13330 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69  L is the value i
13340 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20  n pLower..      
13350 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20  **.      ** Or, 
13360 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c  if pLower is NUL
13370 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62  L or $L cannot b
13380 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
13390 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a   it (because it.
133a0 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
133b0 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c  a simple variabl
133c0 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c  e or literal val
133d0 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62  ue), the lower b
133e0 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ound of the.    
133f0 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50    ** range is $P
13400 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b  . Due to a quirk
13410 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65 72   in the way wher
13420 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b  eKeyStats() work
13430 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  s, even.      **
13440 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61   if $L is availa
13450 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61  ble, whereKeySta
13460 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  ts() is called f
13470 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64  or both ($P) and
13480 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24   .      ** ($P:$
13490 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
134a0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
134b0 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65  urned values use
134c0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
134d0 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
134e0 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20  iUpper is to be 
134f0 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
13500 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
13510 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20  r of rows.      
13520 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
13530 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
13540 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
13550 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
13560 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20   bound.      ** 
13570 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f  is either ($P) o
13580 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e  r ($P:$U). Again
13590 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20  , even if $U is 
135a0 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20  available, both 
135b0 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
135c0 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65  of iUpper are re
135d0 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65  quested of where
135e0 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74  KeyStats() and t
135f0 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e  he smaller used.
13600 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13610 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 0a  tRowcnt iLower;.
13620 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55        tRowcnt iU
13630 70 70 65 72 3b 0a 0a 20 20 20 20 20 20 69 66 28  pper;..      if(
13640 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c   nEq==p->nKeyCol
13650 20 29 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20   ){.        aff 
13660 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
13670 45 47 45 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EGER;.      }els
13680 65 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d  e{.        aff =
13690 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
136a0 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  [p->aiColumn[nEq
136b0 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ]].affinity;.   
136c0 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65     }.      /* De
136d0 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
136e0 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
136f0 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
13700 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
13710 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
13720 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
13730 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pper = sqlite3Lo
13740 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
13750 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
13760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13770 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
13780 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f   call could be o
13790 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20  ptimized away - 
137a0 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76  since the same v
137b0 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20  alues must .    
137c0 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e      ** have been
137d0 20 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20   requested when 
137e0 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69  testing key $P i
137f0 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  n whereEqualScan
13800 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20  Est().  */.     
13810 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
13820 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
13830 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 0, a);.       
13840 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a   iLower = a[0];.
13850 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d          iUpper =
13860 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20   a[0] + a[1];.  
13870 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13880 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
13890 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77  rove on the iLow
138a0 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
138b0 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20  g ($P:$L). */.  
138c0 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
138d0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f  {.        int bO
138e0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
138f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
13900 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
13910 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
13920 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
13930 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
13940 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
13950 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
13960 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
13970 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
13980 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ))!=0 );.       
13990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
139a0 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
139b0 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
139c0 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
139d0 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
139e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
139f0 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
13a00 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
13a10 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
13a20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
13a30 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
13a40 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , a);.          
13a50 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28  iNew = a[0] + ((
13a60 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
13a70 72 20 26 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31  r & WO_GT) ? a[1
13a80 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
13a90 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65    if( iNew>iLowe
13aa0 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65  r ) iLower = iNe
13ab0 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  w;.          nOu
13ac0 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t--;.        }. 
13ad0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
13ae0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d   If possible, im
13af0 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70  prove on the iUp
13b00 70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69  per estimate usi
13b10 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20  ng ($P:$U). */. 
13b20 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20       if( pUpper 
13b30 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  ){.        int b
13b40 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Ok;             
13b50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
13b60 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61  f value is extra
13b70 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20  cted from pExpr 
13b80 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
13b90 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d  *pExpr = pUpper-
13ba0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
13bb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13bc0 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
13bd0 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
13be0 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
13bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
13c00 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
13c10 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
13c20 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
13c30 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
13c40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13c50 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
13c60 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
13c70 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
13c80 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
13c90 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
13ca0 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20  1, a);.         
13cb0 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28   iNew = a[0] + (
13cc0 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
13cd0 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61 5b  or & WO_LE) ? a[
13ce0 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
13cf0 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
13d00 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
13d10 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
13d20 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ut--;.        }.
13d30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
13d40 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
13d50 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28 20  pRec;.      if( 
13d60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55 70  .        if( iUp
13d80 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20  per>iLower ){.  
13d90 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73          nNew = s
13da0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70  qlite3LogEst(iUp
13db0 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20  per - iLower);. 
13dc0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13dd0 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31          nNew = 1
13de0 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  0;        assert
13df0 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 10==sqlite3Log
13e00 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20  Est(2) );.      
13e10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
13e20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20  nNew<nOut ){.   
13e30 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e         nOut = nN
13e40 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ew;.        }.  
13e50 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
13e60 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74  t = (LogEst)nOut
13e70 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  ;.        WHERET
13e80 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e  RACE(0x10, ("ran
13e90 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ge scan regions:
13ea0 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
13eb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13ed0 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
13ee0 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b  )iUpper, nOut));
13ef0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13f00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13f10 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13f20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20      int bDone = 
13f30 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  0;.      rc = wh
13f40 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
13f50 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c 6f 77  Est(pParse, pLow
13f60 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f  er, pUpper, pLoo
13f70 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20  p, &bDone);.    
13f80 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20 72 65    if( bDone ) re
13f90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
13fa0 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45   }.#else.  UNUSE
13fb0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72  D_PARAMETER(pPar
13fc0 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  se);.  UNUSED_PA
13fd0 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72  RAMETER(pBuilder
13fe0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
13ff0 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55  rt( pLower || pU
14000 70 70 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  pper );.  assert
14010 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28  ( pUpper==0 || (
14020 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20  pUpper->wtFlags 
14030 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
14040 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65   );.  nNew = whe
14050 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c  reRangeAdjust(pL
14060 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e  ower, nOut);.  n
14070 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65  New = whereRange
14080 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e  Adjust(pUpper, n
14090 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49  New);..  /* TUNI
140a0 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20  NG: If there is 
140b0 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e  both an upper an
140c0 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 2c 20 61  d lower limit, a
140d0 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20  ssume the range 
140e0 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20  is.  ** reduced 
140f0 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  by an additional
14100 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73   75%. This means
14110 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c   that, by defaul
14120 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64  t, an open-ended
14130 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72  .  ** range quer
14140 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29  y (e.g. col > ?)
14150 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d   is assumed to m
14160 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20  atch 1/4 of the 
14170 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  rows in the.  **
14180 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20   index. While a 
14190 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e  closed range (e.
141a0 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f  g. col BETWEEN ?
141b0 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d   AND ?) is estim
141c0 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74  ated to.  ** mat
141d0 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69  ch 1/64 of the i
141e0 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20  ndex. */ .  if( 
141f0 70 4c 6f 77 65 72 20 26 26 20 70 55 70 70 65 72  pLower && pUpper
14200 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 0a   ) nNew -= 20;..
14210 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65    nOut -= (pLowe
14220 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21  r!=0) + (pUpper!
14230 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c  =0);.  if( nNew<
14240 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a  10 ) nNew = 10;.
14250 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
14260 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20  ) nOut = nNew;. 
14270 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
14280 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72  LogEst)nOut;.  r
14290 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
142a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
142b0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
142c0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
142d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
142e0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
142f0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
14300 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
14310 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
14320 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
14330 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
14340 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
14350 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
14360 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
14370 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
14380 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
14390 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
143a0 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
143b0 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
143c0 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
143d0 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
143e0 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
143f0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
14400 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
14410 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
14420 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
14430 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
14440 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
14450 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
14460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14470 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
14480 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
14490 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
144a0 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
144b0 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
144c0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
144d0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
144e0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
144f0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
14500 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
14510 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
14520 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
14530 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
14540 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
14550 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
14560 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
14570 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
14580 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
14590 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
145a0 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
145b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
145c0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
145d0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
145e0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
145f0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
14600 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
14610 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
14620 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
14630 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
14640 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
14650 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
14660 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
14670 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
14680 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
14690 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
146a0 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
146b0 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
146c0 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
146d0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
146e0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
146f0 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
14700 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
14710 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
14720 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
14730 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
14740 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
14750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14760 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
14770 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14790 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
147a0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
147b0 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
147c0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
147d0 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62  stics */.  int b
147e0 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  Ok;..  assert( n
147f0 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Eq>=1 );.  asser
14800 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75  t( nEq<=p->nColu
14810 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
14820 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
14830 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53  .  assert( p->nS
14840 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73  ample>0 );.  ass
14850 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
14860 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a  RecValid<nEq );.
14870 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20  .  /* If values 
14880 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
14890 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73  e for all fields
148a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
148b0 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f   the left.  ** o
148c0 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65  f this one, no e
148d0 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d  stimate can be m
148e0 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ade. Return SQLI
148f0 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a  TE_NOTFOUND. */.
14900 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
14910 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31  nRecValid<(nEq-1
14920 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
14930 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
14940 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
14950 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
14960 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c  on only. The cal
14970 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74  l to sqlite3Stat
14980 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29  4ProbeSetValue()
14990 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c  .  ** below woul
149a0 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  d return the sam
149b0 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69  e value.  */.  i
149c0 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75  f( nEq>=p->nColu
149d0 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77  mn ){.    *pnRow
149e0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
149f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14a00 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
14a10 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
14a20 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66  lumn[nEq-1]].aff
14a30 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71  inity;.  rc = sq
14a40 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
14a50 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
14a60 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
14a70 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f   aff, nEq-1, &bO
14a80 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  k);.  pBuilder->
14a90 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69  pRec = pRec;.  i
14aa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14ab0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14ac0 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74  if( bOk==0 ) ret
14ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
14ae0 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  UND;.  pBuilder-
14af0 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71  >nRecValid = nEq
14b00 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61  ;..  whereKeySta
14b10 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
14b20 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45  ec, 0, a);.  WHE
14b30 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65  RETRACE(0x10,("e
14b40 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
14b50 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e  ions: %d\n", (in
14b60 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52  t)a[1]));.  *pnR
14b70 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20  ow = a[1];.  .  
14b80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
14b90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
14ba0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
14bb0 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AT4 */..#ifdef S
14bc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
14bd0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
14be0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
14bf0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
14c00 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
14c10 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
14c20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
14c30 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
14c40 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
14c50 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
14c60 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
14c70 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
14c80 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
14c90 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
14ca0 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
14cb0 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
14cc0 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
14cd0 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
14ce0 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
14cf0 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
14d00 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
14d10 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
14d20 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
14d30 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
14d40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
14d50 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
14d60 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
14d70 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
14d80 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
14d90 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
14da0 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
14db0 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
14dc0 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
14dd0 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
14de0 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
14df0 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
14e00 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
14e10 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
14e20 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
14e30 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
14e40 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
14e50 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
14e60 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
14e70 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
14e80 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  t */.  WhereLoop
14e90 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
14ea0 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r,.  ExprList *p
14eb0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
14ec0 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
14ed0 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
14ee0 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
14ef0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
14f00 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
14f10 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
14f20 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
14f30 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
14f40 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
14f50 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
14f60 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20  ex;.  i64 nRow0 
14f70 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
14f80 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67  oInt(p->aiRowLog
14f90 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e  Est[0]);.  int n
14fa0 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
14fb0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
14fc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14fd0 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62  E_OK;     /* Sub
14fe0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
14ff0 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  code */.  tRowcn
15000 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20  t nEst;         
15010 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
15020 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ows for a single
15030 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63   term */.  tRowc
15040 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20  nt nRowEst = 0; 
15050 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61     /* New estima
15060 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
15070 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
15080 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
15090 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
150a0 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
150b0 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
150c0 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
150d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
150e0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
150f0 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20   i++){.    nEst 
15100 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20  = nRow0;.    rc 
15110 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
15120 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
15130 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  lder, pList->a[i
15140 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b  ].pExpr, &nEst);
15150 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20  .    nRowEst += 
15160 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64  nEst;.    pBuild
15170 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
15180 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a  nRecValid;.  }..
15190 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
151a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
151b0 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29  RowEst > nRow0 )
151c0 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30   nRowEst = nRow0
151d0 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e  ;.    *pnRow = n
151e0 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52  RowEst;.    WHER
151f0 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e  ETRACE(0x10,("IN
15200 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65   row estimate: e
15210 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73  st=%g\n", nRowEs
15220 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  t));.  }.  asser
15230 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
15240 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69  cValid==nRecVali
15250 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d );.  return rc
15260 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
15270 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
15280 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
15290 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74  *.** Disable a t
152a0 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
152b0 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74   clause.  Except
152c0 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65  , do not disable
152d0 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20   the term.** if 
152e0 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45  it controls a LE
152f0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e  FT OUTER JOIN an
15300 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  d it did not ori
15310 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e  ginate in the ON
15320 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61  .** or USING cla
15330 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e  use of that join
15340 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72  ..**.** Consider
15350 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27   the term t2.z='
15360 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ok' in the follo
15370 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a  wing queries:.**
15380 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43  .**   (1)  SELEC
15390 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
153a0 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
153b0 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a  =t2.x WHERE t2.z
153c0 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20  ='ok'.**   (2)  
153d0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
153e0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
153f0 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
15400 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33  2.z='ok'.**   (3
15410 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
15420 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31   t1, t2 WHERE t1
15430 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
15440 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ='ok'.**.** The 
15450 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73  t2.z='ok' is dis
15460 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20  abled in the in 
15470 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f  (2) because it o
15480 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20  riginates.** in 
15490 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20  the ON clause.  
154a0 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61  The term is disa
154b0 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61  bled in (3) beca
154c0 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61  use it is not pa
154d0 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20  rt.** of a LEFT 
154e0 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20  OUTER JOIN.  In 
154f0 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73  (1), the term is
15500 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a   not disabled..*
15510 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61  *.** Disabling a
15520 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61   term causes tha
15530 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65  t term to not be
15540 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69   tested in the i
15550 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
15560 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62  the join.  Disab
15570 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d  ling is an optim
15580 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ization.  When t
15590 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69  erms are satisfi
155a0 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73  ed.** by indices
155b0 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65  , we disable the
155c0 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64  m to prevent red
155d0 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20  undant tests in 
155e0 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f  the inner.** loo
155f0 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74  p.  We would get
15600 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73   the correct res
15610 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20  ults if nothing 
15620 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c  were ever disabl
15630 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73  ed,.** but joins
15640 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74   might run a lit
15650 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65  tle slower.  The
15660 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73   trick is to dis
15670 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20  able as much.** 
15680 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75  as we can withou
15690 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20  t disabling too 
156a0 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73  much.  If we dis
156b0 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65  abled in (1), we
156c0 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72  'd get.** the wr
156d0 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65  ong answer.  See
156e0 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f   ticket #813..*/
156f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
15700 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65  ableTerm(WhereLe
15710 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65  vel *pLevel, Whe
15720 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
15730 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20    if( pTerm.    
15740 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46    && (pTerm->wtF
15750 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
15760 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28  D)==0.      && (
15770 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
15780 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50  n==0 || ExprHasP
15790 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
157a0 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
157b0 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c  n)).      && (pL
157c0 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 26  evel->notReady &
157d0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
157e0 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  l)==0.  ){.    p
157f0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
15800 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
15810 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72   if( pTerm->iPar
15820 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent>=0 ){.      
15830 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
15840 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d  r = &pTerm->pWC-
15850 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  >a[pTerm->iParen
15860 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d  t];.      if( (-
15870 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29  -pOther->nChild)
15880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
15890 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
158a0 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20  l, pOther);.    
158b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
158c0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
158d0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
158e0 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63  e to apply the c
158f0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
15900 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f  tring zAff.** to
15910 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72 73   the n registers
15920 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61 73   starting at bas
15930 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20  e. .**.** As an 
15940 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51  optimization, SQ
15950 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
15960 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72 65  tries (which are
15970 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a   no-ops) at the.
15980 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  ** beginning and
15990 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65   end of zAff are
159a0 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c   ignored.  If al
159b0 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66  l entries in zAf
159c0 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  f are.** SQLITE_
159d0 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e  AFF_NONE, then n
159e0 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65  o code gets gene
159f0 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rated..**.** Thi
15a00 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  s routine makes 
15a10 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
15a20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68 65  zAff so that the
15a30 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a   caller is free.
15a40 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66  ** to modify zAf
15a50 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75  f after this rou
15a60 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f  tine returns..*/
15a70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
15a80 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50  eApplyAffinity(P
15a90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
15aa0 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63  t base, int n, c
15ab0 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64  har *zAff){.  Vd
15ac0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
15ad0 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66  pVdbe;.  if( zAf
15ae0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
15af0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
15b00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
15b10 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
15b20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
15b30 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62  ;..  /* Adjust b
15b40 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69  ase and n to ski
15b50 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46  p over SQLITE_AF
15b60 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61  F_NONE entries a
15b70 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
15b80 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20    ** and end of 
15b90 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
15ba0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ing..  */.  whil
15bb0 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30  e( n>0 && zAff[0
15bc0 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ]==SQLITE_AFF_NO
15bd0 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20  NE ){.    n--;. 
15be0 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a     base++;.    z
15bf0 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69  Aff++;.  }.  whi
15c00 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b  le( n>1 && zAff[
15c10 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  n-1]==SQLITE_AFF
15c20 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d  _NONE ){.    n--
15c30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65  ;.  }..  /* Code
15c40 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79   the OP_Affinity
15c50 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72 65   opcode if there
15c60 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66   is anything lef
15c70 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66  t to do. */.  if
15c80 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( n>0 ){.    sql
15c90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15ca0 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62  , OP_Affinity, b
15cb0 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  ase, n);.    sql
15cc0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
15cd0 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29  (v, -1, zAff, n)
15ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
15cf0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
15d00 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73  ange(pParse, bas
15d10 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  e, n);.  }.}.../
15d20 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
15d30 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
15d40 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66  equality term of
15d50 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
15d60 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a  e.  An equality.
15d70 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65  ** term can be e
15d80 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20  ither X=expr or 
15d90 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54  X IN (...).   pT
15da0 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20  erm is the term 
15db0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e  to be .** coded.
15dc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
15dd0 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  nt value for the
15de0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c   constraint is l
15df0 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
15e00 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iReg..**.** For 
15e10 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
15e20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c  the form X=expr,
15e30 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15e40 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  is evaluated and
15e50 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69   its.** result i
15e60 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  s left on the st
15e70 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72  ack.  For constr
15e80 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
15e90 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20  m X IN (...).** 
15ea0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
15eb0 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74  s up a loop that
15ec0 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76   will iterate ov
15ed0 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
15ee0 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   X..*/.static in
15ef0 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  t codeEqualityTe
15f00 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
15f10 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
15f20 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
15f30 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
15f40 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65  *pTerm,   /* The
15f50 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
15f60 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
15f70 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
15f80 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f  Level *pLevel, /
15f90 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74  * The level of t
15fa0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77  he FROM clause w
15fb0 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
15fc0 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20 20   */.  int iEq,  
15fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15fe0 65 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  ex of the equali
15ff0 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ty term within t
16000 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69  his level */.  i
16010 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
16020 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 72     /* True for r
16030 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49 4e 20  everse-order IN 
16040 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
16050 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20  int iTarget     
16060 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74      /* Attempt t
16070 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20  o leave results 
16080 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
16090 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
160a0 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
160b0 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
160c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
160d0 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20  nt iReg;        
160e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
160f0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
16100 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65  sults */..  asse
16110 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b  rt( iTarget>0 );
16120 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  .  if( pX->op==T
16130 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67  K_EQ ){.    iReg
16140 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16150 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
16160 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
16170 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
16180 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
16190 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
161a0 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
161b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
161c0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
161d0 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
161e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
161f0 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
16200 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20    int eType;.   
16210 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
16220 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
16230 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  n;.    WhereLoop
16240 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c   *pLoop = pLevel
16250 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69  ->pWLoop;..    i
16260 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
16270 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
16280 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20  ALTABLE)==0.    
16290 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
162a0 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20  ree.pIndex!=0.  
162b0 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
162c0 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53  btree.pIndex->aS
162d0 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20  ortOrder[iEq].  
162e0 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
162f0 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20  ase( iEq==0 );. 
16300 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
16310 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
16320 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
16330 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
16340 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
16350 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
16360 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71  ;.    eType = sq
16370 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
16380 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b  (pParse, pX, 0);
16390 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
163a0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
163b0 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74 65 73  ESC ){.      tes
163c0 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20  tcase( bRev );. 
163d0 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65       bRev = !bRe
163e0 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61  v;.    }.    iTa
163f0 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  b = pX->iTable;.
16400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16410 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20  ddOp2(v, bRev ? 
16420 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
16430 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
16440 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
16450 66 28 76 2c 20 62 52 65 76 29 3b 0a 20 20 20 20  f(v, bRev);.    
16460 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
16470 2c 20 21 62 52 65 76 29 3b 0a 20 20 20 20 61 73  , !bRev);.    as
16480 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
16490 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
164a0 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20  LTI_OR)==0 );.  
164b0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
164c0 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c   |= WHERE_IN_ABL
164d0 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  E;.    if( pLeve
164e0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29  l->u.in.nIn==0 )
164f0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
16500 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
16510 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
16520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
16530 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b  vel->u.in.nIn++;
16540 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
16550 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20  n.aInLoop =.    
16560 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
16570 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
16580 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  ->db, pLevel->u.
16590 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20  in.aInLoop,.    
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165b0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
165c0 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  (pLevel->u.in.aI
165d0 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
165e0 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20  ->u.in.nIn);.   
165f0 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75   pIn = pLevel->u
16600 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20  .in.aInLoop;.   
16610 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20   if( pIn ){.    
16620 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d    pIn += pLevel-
16630 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20  >u.in.nIn - 1;. 
16640 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d       pIn->iCur =
16650 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28   iTab;.      if(
16660 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
16670 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
16680 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
16690 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
166a0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
166b0 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20  , iTab, iReg);. 
166c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
166d0 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
166e0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
166f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
16700 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52  umn, iTab, 0, iR
16710 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
16720 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70     pIn->eEndLoop
16730 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  Op = bRev ? OP_P
16740 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50 5f 4e  revIfOpen : OP_N
16750 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20 20 20  extIfOpen;.     
16760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16770 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
16780 20 69 52 65 67 29 3b 20 56 64 62 65 43 6f 76 65   iReg); VdbeCove
16790 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c  rage(v);.    }el
167a0 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
167b0 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a  ->u.in.nIn = 0;.
167c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
167d0 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70  .  disableTerm(p
167e0 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
167f0 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
16800 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16810 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
16820 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61  valuate all == a
16830 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
16840 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65  s for an.** inde
16850 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  x scan..**.** Fo
16860 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69  r example, consi
16870 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62  der table t1(a,b
16880 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69  ,c,d,e,f) with i
16890 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a  ndex i1(a,b,c)..
168a0 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57  ** Suppose the W
168b0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
168c0 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62  his:  a==5 AND b
168d0 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20   IN (1,2,3) AND 
168e0 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20  c>5 AND c<10.** 
168f0 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73  The index has as
16900 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65   many as three e
16910 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16920 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73  nts, but in this
16930 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  .** example, the
16940 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65   third "c" value
16950 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
16960 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20  y.  So only two 
16970 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
16980 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73  are coded.  This
16990 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65   routine will ge
169a0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
169b0 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20  valuate.** a==5 
169c0 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  and b IN (1,2,3)
169d0 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  .  The current v
169e0 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20  alues for a and 
169f0 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  b will be stored
16a00 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69  .** in consecuti
16a10 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ve registers and
16a20 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
16a30 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
16a40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
16a50 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
16a60 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
16a70 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
16a80 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
16a90 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
16aa0 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
16ab0 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
16ac0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
16ad0 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
16ae0 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
16af0 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
16b00 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
16b10 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  Mem memory cell 
16b20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74  and.** compute t
16b30 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
16b40 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  ng..**.** The nE
16b50 78 74 72 61 52 65 67 20 70 61 72 61 6d 65 74 65  xtraReg paramete
16b60 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 74  r is 0 or 1.  It
16b70 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57 48 45   is 0 if all WHE
16b80 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
16b90 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d 3d 20  aints.** are == 
16ba0 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20 63 6f  or IN and are co
16bb0 76 65 72 65 64 20 62 79 20 74 68 65 20 6e 45 71  vered by the nEq
16bc0 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69 73 20  .  nExtraReg is 
16bd0 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
16be0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
16bf0 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63 68 20  onstraint (such 
16c00 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41 4e 44  as the "c>=5 AND
16c10 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20 65 78   c<10" in the ex
16c20 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a 20 6f  ample) that.** o
16c30 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
16c40 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f 6e 73  nEq quality cons
16c50 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  traints..**.** T
16c60 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
16c70 63 61 74 65 73 20 61 20 72 61 6e 67 65 20 6f 66  cates a range of
16c80 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67 20 6d   nEq+nExtraReg m
16c90 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
16ca0 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69  returns.** the i
16cb0 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
16cc0 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
16cd0 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54 68 65   that range. The
16ce0 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61   code that.** ca
16cf0 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
16d00 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d   will use that m
16d10 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f 20 73  emory range to s
16d20 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a 2a 2a  tore keys for.**
16d30 20 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d 69   start and termi
16d40 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
16d50 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
16d60 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
16d70 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
16d80 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
16d90 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
16da0 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
16db0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
16dc0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
16dd0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
16de0 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
16df0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
16e00 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
16e10 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
16e20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
16e30 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
16e40 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
16e50 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
16e60 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
16e70 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
16e80 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
16e90 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
16ea0 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
16eb0 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
16ec0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
16ed0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16ee0 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e  nts that use NON
16ef0 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73  E affinity are s
16f00 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f  et to.** SQLITE_
16f10 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69  AFF_NONE. This i
16f20 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  s to deal with S
16f30 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66  QL such as the f
16f40 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
16f50 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
16f60 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59  1(a TEXT PRIMARY
16f70 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53   KEY, b);.**   S
16f80 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
16f90 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52  1 AS t2, t1 WHER
16fa0 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a  E t1.a = t2.b;.*
16fb0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
16fc0 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69  ple above, the i
16fd0 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61  ndex on t1(a) ha
16fe0 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  s TEXT affinity.
16ff0 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68   But since.** th
17000 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64  e right hand sid
17010 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  e of the equalit
17020 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32  y constraint (t2
17030 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66  .b) has NONE aff
17040 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e  inity,.** no con
17050 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  version should b
17060 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f  e attempted befo
17070 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20  re using a t2.b 
17080 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66  value as part of
17090 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61  .** a key to sea
170a0 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48  rch the index. H
170b0 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62  ence the first b
170c0 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  yte in the retur
170d0 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ned affinity.** 
170e0 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65  string in this e
170f0 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20  xample would be 
17100 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  set to SQLITE_AF
17110 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69  F_NONE..*/.stati
17120 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
17130 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
17140 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17150 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
17160 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
17170 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
17180 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
17190 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
171a0 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
171b0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
171c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
171d0 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72  everse the order
171e0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   of IN operators
171f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
17200 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Reg,        /* N
17210 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
17220 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
17230 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
17240 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20  *pzAff          
17250 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70  /* OUT: Set to p
17260 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79  oint to affinity
17270 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
17280 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20 20 20  u16 nEq;        
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
172a0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
172b0 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
172c0 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  nts to code */. 
172d0 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20 20 20   u16 nSkip;     
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
172f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 66 74  * Number of left
17300 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  -most columns to
17310 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62 65 20   skip */.  Vdbe 
17320 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
17330 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
17340 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  vm under constru
17350 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
17360 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
17370 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17380 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
17390 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
173a0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
173b0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
173c0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
173d0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
173e0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
173f0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
17400 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
17410 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
17420 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
17430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17440 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
17450 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17470 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
17480 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20  */.  int nReg;  
17490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
174b0 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
174c0 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
174d0 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  *zAff;          
174e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
174f0 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72  nity string to r
17500 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54  eturn */..  /* T
17510 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e  his module is on
17520 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65  ly called on que
17530 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73  ry plans that us
17540 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  e an index. */. 
17550 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
17560 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72  >pWLoop;.  asser
17570 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
17580 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
17590 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
175a0 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
175b0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e 53 6b  btree.nEq;.  nSk
175c0 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ip = pLoop->u.bt
175d0 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 70 49 64  ree.nSkip;.  pId
175e0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
175f0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73  ee.pIndex;.  ass
17600 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
17610 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
17620 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79   how many memory
17630 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e   cells we will n
17640 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  eed then allocat
17650 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72  e them..  */.  r
17660 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
17670 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65  >nMem + 1;.  nRe
17680 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  g = pLoop->u.btr
17690 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52  ee.nEq + nExtraR
176a0 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  eg;.  pParse->nM
176b0 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a  em += nReg;..  z
176c0 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
176d0 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
176e0 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  , sqlite3IndexAf
176f0 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
17700 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66  x));.  if( !zAff
17710 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
17720 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17730 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 1;.  }..  if(
17740 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e   nSkip ){.    in
17750 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76  t iIdxCur = pLev
17760 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
17770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17780 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c  p1(v, (bRev?OP_L
17790 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20  ast:OP_Rewind), 
177a0 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64  iIdxCur);.    Vd
177b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
177c0 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64  bRev==0);.    Vd
177d0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
177e0 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 56 64  bRev!=0);.    Vd
177f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  beComment((v, "b
17800 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f  egin skip-scan o
17810 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  n %s", pIdx->zNa
17820 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71  me));.    j = sq
17830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
17840 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
17850 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
17860 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
17870 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62 52 65  ddOp4Int(v, (bRe
17880 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53  v?OP_SeekLT:OP_S
17890 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20 20 20  eekGT),.        
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178b0 20 20 20 20 69 49 64 78 43 75 72 2c 20 30 2c 20      iIdxCur, 0, 
178c0 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b  regBase, nSkip);
178d0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
178e0 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b  eIf(v, bRev==0);
178f0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
17900 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b  eIf(v, bRev!=0);
17910 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17920 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a  JumpHere(v, j);.
17930 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
17940 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Skip; j++){.    
17950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17960 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
17970 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 65  , iIdxCur, j, re
17980 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
17990 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
179a0 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a  Column[j]>=0 );.
179b0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
179c0 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
179d0 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
179e0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
179f0 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
17a00 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45  .  }    ..  /* E
17a10 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
17a20 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
17a30 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
17a40 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29  zAff==0 || (int)
17a50 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45  strlen(zAff)>=nE
17a60 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b  q );.  for(j=nSk
17a70 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  ip; j<nEq; j++){
17a80 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
17a90 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
17aa0 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61  aLTerm[j];.    a
17ab0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
17ac0 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  );.    /* The fo
17ad0 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61 73 65  llowing testcase
17ae0 20 69 73 20 74 72 75 65 20 66 6f 72 20 69 6e 64   is true for ind
17af0 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64  ices with redund
17b00 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20  ant columns. .  
17b10 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20    ** Ex: CREATE 
17b20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
17b30 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20  ,b,a); SELECT * 
17b40 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
17b50 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20  0 AND b=0; */.  
17b60 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65    testcase( (pTe
17b70 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
17b80 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a  RM_CODED)!=0 );.
17b90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
17ba0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
17bb0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
17bc0 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61     r1 = codeEqua
17bd0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
17be0 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
17bf0 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73 65  j, bRev, regBase
17c00 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
17c10 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
17c20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
17c30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17c40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17c50 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
17c60 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
17c70 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
17c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
17c90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17ca0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
17cb0 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
17cc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
17cd0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
17ce0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
17cf0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
17d00 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
17d10 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
17d20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
17d30 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
17d40 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
17d50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
17d60 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
17d70 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
17d80 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
17d90 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
17da0 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  l(pRight) ){.   
17db0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17dc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
17dd0 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ull, regBase+j, 
17de0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
17df0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
17e00 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17e10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66   }.      if( zAf
17e20 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
17e30 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
17e40 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
17e50 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45  zAff[j])==SQLITE
17e60 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
17e70 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
17e80 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
17e90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17ea0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
17eb0 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
17ec0 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
17ed0 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20   zAff[j]) ){.   
17ee0 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
17ef0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
17f00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17f10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
17f20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20  *pzAff = zAff;. 
17f30 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b   return regBase;
17f40 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
17f50 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
17f60 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17f70 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66  ne is a helper f
17f80 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  or explainIndexR
17f90 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a  ange() below.**.
17fa0 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68  ** pStr holds th
17fb0 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70  e text of an exp
17fc0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20  ression that we 
17fd0 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20  are building up 
17fe0 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61  one term.** at a
17ff0 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75   time.  This rou
18000 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20  tine adds a new 
18010 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20  term to the end 
18020 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
18030 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20  n..** Terms are 
18040 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44  separated by AND
18050 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44   so add the "AND
18060 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e  " text for secon
18070 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
18080 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a  .** terms only..
18090 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
180a0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
180b0 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53  (.  StrAccum *pS
180c0 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
180d0 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72  /* The text expr
180e0 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69  ession being bui
180f0 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  lt */.  int iTer
18100 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
18110 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
18120 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73  this term.  Firs
18130 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63  t is zero */.  c
18140 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
18150 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  mn,        /* Na
18160 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
18170 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
18180 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20   *zOp           
18190 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
181a0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   operator */.){.
181b0 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71    if( iTerm ) sq
181c0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
181d0 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20  end(pStr, " AND 
181e0 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 5);.  sqlite3
181f0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
18200 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29  l(pStr, zColumn)
18210 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
18220 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
18230 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  zOp, 1);.  sqlit
18240 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
18250 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
18260 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
18270 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62  t pLevel describ
18280 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f  es a strategy fo
18290 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65  r scanning table
182a0 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20   pTab. This .** 
182b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
182c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
182d0 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f  string buffer co
182e0 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72  ntaining a descr
182f0 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  iption.** of the
18300 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65   subset of table
18310 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
18320 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
18330 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a   the form of an.
18340 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ** SQL expressio
18350 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f  n. Or, if all ro
18360 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20  ws are scanned, 
18370 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
18380 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
18390 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
183a0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
183b0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
183c0 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a  E a=1 AND b>2;.*
183d0 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20  *.** is run and 
183e0 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
183f0 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
18400 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
18410 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72  returns a.** str
18420 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ing similar to:.
18430 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44  **.**   "a=? AND
18440 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20   b>?".**.** The 
18450 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
18460 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72   points to memor
18470 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
18480 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
18490 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  )..** It is the 
184a0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
184b0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
184c0 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
184d0 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f  when it is.** no
184e0 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
184f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
18500 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61   *explainIndexRa
18510 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nge(sqlite3 *db,
18520 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
18530 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  p, Table *pTab){
18540 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
18550 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
18560 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31 36 20  e.pIndex;.  u16 
18570 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
18580 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31 36 20  tree.nEq;.  u16 
18590 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  nSkip = pLoop->u
185a0 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20  .btree.nSkip;.  
185b0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75  int i, j;.  Colu
185c0 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *aCol = pTab-
185d0 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69  >aCol;.  i16 *ai
185e0 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
185f0 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72  >aiColumn;.  Str
18600 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66  Accum txt;..  if
18610 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f  ( nEq==0 && (pLo
18620 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
18630 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
18640 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
18650 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
18660 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
18670 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
18680 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54  txt, 0, 0, SQLIT
18690 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20  E_MAX_LENGTH);. 
186a0 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20   txt.db = db;.  
186b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
186c0 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22  ppend(&txt, " ("
186d0 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 2);.  for(i=0;
186e0 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20   i<nEq; i++){.  
186f0 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f    char *z = aiCo
18700 6c 75 6d 6e 5b 69 5d 20 3c 20 30 20 3f 20 22 72  lumn[i] < 0 ? "r
18710 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43  owid" : aCol[aiC
18720 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[i]].zName;
18730 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 53 6b 69  .    if( i>=nSki
18740 70 20 29 7b 0a 20 20 20 20 20 20 65 78 70 6c 61  p ){.      expla
18750 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
18760 74 2c 20 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20  t, i, z, "=");. 
18770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18780 69 66 28 20 69 20 29 20 73 71 6c 69 74 65 33 53  if( i ) sqlite3S
18790 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
187a0 78 74 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b  xt, " AND ", 5);
187b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
187c0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
187d0 74 2c 20 22 41 4e 59 28 22 2c 20 34 29 3b 0a 20  t, "ANY(", 4);. 
187e0 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
187f0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 74  ccumAppendAll(&t
18800 78 74 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  xt, z);.      sq
18810 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
18820 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31  end(&txt, ")", 1
18830 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18840 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f  j = i;.  if( pLo
18850 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
18860 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
18870 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 69 43     char *z = aiC
18880 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20 22  olumn[j] < 0 ? "
18890 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69  rowid" : aCol[ai
188a0 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
188b0 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  ;.    explainApp
188c0 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b  endTerm(&txt, i+
188d0 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a  +, z, ">");.  }.
188e0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
188f0 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
18900 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72  IMIT ){.    char
18910 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a   *z = aiColumn[j
18920 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20  ] < 0 ? "rowid" 
18930 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
18940 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
18950 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
18960 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22  (&txt, i, z, "<"
18970 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
18980 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
18990 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  txt, ")", 1);.  
189a0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74  return sqlite3St
189b0 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78  rAccumFinish(&tx
189c0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
189d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
189e0 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72  no-op unless cur
189f0 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
18a00 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  g an EXPLAIN QUE
18a10 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61  RY PLAN.** comma
18a20 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  nd. If the query
18a30 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20   being compiled 
18a40 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  is an EXPLAIN QU
18a50 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67  ERY PLAN, a sing
18a60 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  le.** record is 
18a70 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74  added to the out
18a80 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  put to describe 
18a90 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73  the table scan s
18aa0 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70  trategy in .** p
18ab0 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  Level..*/.static
18ac0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65   void explainOne
18ad0 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Scan(.  Parse *p
18ae0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
18af0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
18b00 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
18b10 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
18b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18b30 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73   Table list this
18b40 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20   loop refers to 
18b50 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
18b60 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  *pLevel,        
18b70 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20       /* Scan to 
18b80 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e  write OP_Explain
18b90 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20   opcode for */. 
18ba0 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bc0 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c   /* Value for "l
18bd0 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel" column of 
18be0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
18bf0 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
18c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
18c10 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20  alue for "from" 
18c20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
18c30 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
18c40 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
18c50 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
18c60 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
18c70 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
18c80 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
18c90 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
18ca0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
18cb0 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20   ).#endif.  {.  
18cc0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18cd0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
18ce0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
18cf0 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
18d00 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
18d10 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
18d20 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72   VM being constr
18d30 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ucted */.    sql
18d40 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
18d50 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61  e->db;     /* Da
18d60 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
18d70 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  .    char *zMsg;
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64     /* Text to ad
18da0 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20  d to EQP output 
18db0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d  */.    int iId =
18dc0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
18dd0 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69  Id;  /* Select i
18de0 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74  d (left-most out
18df0 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20  put column) */. 
18e00 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b     int isSearch;
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53   /* True for a S
18e30 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72  EARCH. False for
18e40 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68   SCAN. */.    Wh
18e50 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
18e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18e70 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57  he controlling W
18e80 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
18e90 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73  */.    u32 flags
18ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18eb0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68       /* Flags th
18ec0 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69 73  at describe this
18ed0 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c   loop */..    pL
18ee0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
18ef0 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20  Loop;.    flags 
18f00 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  = pLoop->wsFlags
18f10 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
18f20 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
18f30 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
18f40 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
18f50 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  NLY) ) return;..
18f60 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28      isSearch = (
18f70 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
18f80 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
18f90 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
18fa0 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
18fb0 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c  gs&WHERE_VIRTUAL
18fc0 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c  TABLE)==0 && (pL
18fd0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
18fe0 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  >0)).           
18ff0 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
19000 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
19010 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
19020 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73  _MAX));..    zMs
19030 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
19040 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53  tf(db, "%s", isS
19050 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22  earch?"SEARCH":"
19060 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20  SCAN");.    if( 
19070 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
19080 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
19090 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
190a0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42  b, zMsg, "%s SUB
190b0 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c  QUERY %d", zMsg,
190c0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
190d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
190e0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
190f0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
19100 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25  Msg, "%s TABLE %
19110 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
19120 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a  >zName);.    }..
19130 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
19140 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a  Alias ){.      z
19150 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
19160 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
19170 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67  "%s AS %s", zMsg
19180 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
19190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
191a0 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  (flags & (WHERE_
191b0 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41  IPK|WHERE_VIRTUA
191c0 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20  LTABLE))==0.    
191d0 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70   && ALWAYS(pLoop
191e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
191f0 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
19200 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
19210 6d 74 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  mt;.      Index 
19220 2a 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  *pIdx = pLoop->u
19230 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
19240 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
19250 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  e = explainIndex
19260 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c  Range(db, pLoop,
19270 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
19280 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66       assert( !(f
19290 6c 61 67 73 26 57 48 45 52 45 5f 41 55 54 4f 5f  lags&WHERE_AUTO_
192a0 49 4e 44 45 58 29 20 7c 7c 20 28 66 6c 61 67 73  INDEX) || (flags
192b0 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  &WHERE_IDX_ONLY)
192c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48   );.      if( !H
192d0 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70  asRowid(pItem->p
192e0 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72  Tab) && IsPrimar
192f0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
19300 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20  ){.        zFmt 
19310 3d 20 7a 57 68 65 72 65 20 3f 20 22 25 73 20 55  = zWhere ? "%s U
19320 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59  SING PRIMARY KEY
19330 25 2e 30 73 25 73 22 20 3a 20 22 25 73 25 2e 30  %.0s%s" : "%s%.0
19340 73 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  s%s";.      }els
19350 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 57 48  e if( flags & WH
19360 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29  ERE_AUTO_INDEX )
19370 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d  {.        zFmt =
19380 20 22 25 73 20 55 53 49 4e 47 20 41 55 54 4f 4d   "%s USING AUTOM
19390 41 54 49 43 20 43 4f 56 45 52 49 4e 47 20 49 4e  ATIC COVERING IN
193a0 44 45 58 25 2e 30 73 25 73 22 3b 0a 20 20 20 20  DEX%.0s%s";.    
193b0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
193c0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
193d0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46  LY ){.        zF
193e0 6d 74 20 3d 20 22 25 73 20 55 53 49 4e 47 20 43  mt = "%s USING C
193f0 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 25 73  OVERING INDEX %s
19400 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
19410 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d  {.        zFmt =
19420 20 22 25 73 20 55 53 49 4e 47 20 49 4e 44 45 58   "%s USING INDEX
19430 20 25 73 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a   %s%s";.      }.
19440 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
19450 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
19460 20 7a 4d 73 67 2c 20 7a 46 6d 74 2c 20 7a 4d 73   zMsg, zFmt, zMs
19470 67 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  g, pIdx->zName, 
19480 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73  zWhere);.      s
19490 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
194a0 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65   zWhere);.    }e
194b0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
194c0 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26   WHERE_IPK)!=0 &
194d0 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  & (flags & WHERE
194e0 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20  _CONSTRAINT)!=0 
194f0 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
19500 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
19510 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
19520 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
19530 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b  ARY KEY", zMsg);
19540 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  ..      if( flag
19550 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  s&(WHERE_COLUMN_
19560 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
19570 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IN) ){.        z
19580 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
19590 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
195a0 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20  "%s (rowid=?)", 
195b0 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
195c0 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48  se if( (flags&WH
195d0 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d  ERE_BOTH_LIMIT)=
195e0 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  =WHERE_BOTH_LIMI
195f0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  T ){.        zMs
19600 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
19610 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
19620 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72  s (rowid>? AND r
19630 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
19640 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
19650 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d   flags&WHERE_BTM
19660 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
19670 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
19680 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
19690 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29  g, "%s (rowid>?)
196a0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
196b0 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
196c0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  (flags&WHERE_TOP
196d0 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20  _LIMIT) ){.     
196e0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
196f0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
19700 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f  sg, "%s (rowid<?
19710 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
19720 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
19730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
19740 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c  TUALTABLE.    el
19750 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  se if( (flags & 
19760 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
19770 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
19780 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
19790 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
197a0 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42   "%s VIRTUAL TAB
197b0 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
197c0 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
197d0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
197e0 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
197f0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
19800 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Str);.    }.#end
19810 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  if.    zMsg = sq
19820 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
19830 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d  , zMsg, "%s", zM
19840 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
19850 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19860 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69  _Explain, iId, i
19870 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d  Level, iFrom, zM
19880 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
19890 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
198a0 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65  efine explainOne
198b0 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a  Scan(u,v,w,x,y,z
198c0 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
198d0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
198e0 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  */.../*.** Gener
198f0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
19900 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
19910 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
19920 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19930 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
19940 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
19950 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
19960 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
19970 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
19980 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
19990 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
199a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
199b0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
199c0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
199d0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
199e0 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
199f0 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
19a00 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42   be coded */.  B
19a10 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
19a20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
19a30 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
19a40 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
19a50 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
19a60 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
19a70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
19a80 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
19a90 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
19aa0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
19ab0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
19ac0 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
19ad0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
19ae0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
19af0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
19b00 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
19b10 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
19b20 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
19b30 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
19b40 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
19b50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
19b60 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
19b70 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
19b80 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
19b90 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
19ba0 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
19bb0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
19bc0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
19bd0 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  p;    /* The Whe
19be0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65  reLoop object be
19bf0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57  ing coded */.  W
19c00 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
19c10 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
19c20 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
19c30 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
19c40 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
19c50 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
19c60 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
19c70 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
19c80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
19cb0 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
19cc0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
19cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
19ce0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
19cf0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
19d20 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20  ared stmt under 
19d30 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f  constructions */
19d40 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
19d50 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
19d60 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
19d70 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64  e term being cod
19d80 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
19d90 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Brk;            
19da0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
19db0 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
19dc0 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  t of the loop */
19dd0 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
19e00 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
19e10 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
19e20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d   int iRowidReg =
19e30 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f   0;        /* Ro
19e40 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  wid is stored in
19e50 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20   this register, 
19e60 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20  if not zero */. 
19e70 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67   int iReleaseReg
19e80 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65   = 0;      /* Te
19e90 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
19ea0 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ree before retur
19eb0 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73  ning */..  pPars
19ec0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
19ed0 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  se;.  v = pParse
19ee0 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d  ->pVdbe;.  pWC =
19ef0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
19f00 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
19f10 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57  ;.  pLevel = &pW
19f20 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b  Info->a[iLevel];
19f30 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
19f40 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61  l->pWLoop;.  pTa
19f50 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
19f60 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
19f70 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
19f80 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
19f90 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65  iCursor;.  pLeve
19fa0 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f  l->notReady = no
19fb0 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73  tReady & ~getMas
19fc0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
19fd0 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52  Set, iCur);.  bR
19fe0 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65  ev = (pWInfo->re
19ff0 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31  vMask>>iLevel)&1
1a000 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
1a010 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1a020 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1a030 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
1a040 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1a050 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1a060 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b  FORCE_TABLE)==0;
1a070 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
1a080 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
1a090 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
1a0a0 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65  ",iLevel,pTabIte
1a0b0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
1a0c0 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
1a0d0 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
1a0e0 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
1a0f0 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
1a100 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
1a110 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
1a120 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
1a130 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
1a140 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
1a150 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
1a160 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
1a170 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
1a180 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
1a190 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
1a1a0 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
1a1b0 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
1a1c0 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
1a1d0 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
1a1e0 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
1a1f0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1a200 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
1a210 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
1a220 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
1a230 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
1a240 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1a250 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
1a260 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
1a270 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
1a280 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
1a290 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
1a2a0 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1a2b0 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
1a2c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1a2d0 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
1a2e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
1a2f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a300 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
1a310 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1a320 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
1a330 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
1a340 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
1a350 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1a360 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
1a370 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
1a380 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
1a390 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
1a3a0 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
1a3b0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
1a3c0 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
1a3d0 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
1a3e0 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
1a3f0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
1a400 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
1a410 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
1a420 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1a430 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a440 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1a450 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
1a460 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
1a470 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
1a480 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
1a490 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
1a4a0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
1a4b0 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  se of a FROM cla
1a4c0 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70  use subquery imp
1a4d0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
1a4e0 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66  -routine */.  if
1a4f0 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
1a500 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
1a510 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
1a520 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
1a530 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
1a540 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a550 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1a560 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
1a570 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
1a580 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  b);.    pLevel->
1a590 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  p2 =  sqlite3Vdb
1a5a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a5b0 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61  eld, regYield, a
1a5c0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62  ddrBrk);.    Vdb
1a5d0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a5e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a5f0 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c  , "next row of \
1a600 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d  "%s\"", pTabItem
1a610 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1a620 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1a630 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c  = OP_Goto;.  }el
1a640 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
1a650 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1a660 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f  ABLE.  if(  (pLo
1a670 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1a680 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1a690 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
1a6a0 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c  ase 1:  The tabl
1a6b0 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
1a6c0 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
1a6d0 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
1a6e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a6f0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1a700 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
1a710 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
1a720 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
1a730 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  Filter */.    in
1a740 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a  t addrNotFound;.
1a750 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
1a760 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  int = pLoop->nLT
1a770 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  erm;..    sqlite
1a780 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1a790 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67  Parse);.    iReg
1a7a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a7b0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1a7c0 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1a7d0 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1a7e0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1a7f0 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  k;.    for(j=0; 
1a800 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
1a810 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
1a820 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b  Target = iReg+j+
1a830 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  2;.      pTerm =
1a840 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1a850 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ];.      if( pTe
1a860 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
1a870 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1a880 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1a890 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  O_IN ){.        
1a8a0 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1a8b0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1a8c0 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c  pLevel, j, bRev,
1a8d0 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1a8e0 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20     addrNotFound 
1a8f0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1a900 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1a910 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a920 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1a930 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
1a940 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
1a950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a970 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1a980 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  r, pLoop->u.vtab
1a990 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  .idxNum, iReg);.
1a9a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a9b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1a9c0 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ger, nConstraint
1a9d0 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
1a9e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a9f0 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
1aa00 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75  iCur, addrNotFou
1aa10 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20  nd, iReg,.      
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1aa40 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1aa60 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
1aa70 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  ee ? P4_MPRINTF 
1aa80 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
1aa90 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1aaa0 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  );.    pLoop->u.
1aab0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1aac0 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
1aad0 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26  j<nConstraint &&
1aae0 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<16; j++){.   
1aaf0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75     if( (pLoop->u
1ab00 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e  .vtab.omitMask>>
1ab10 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j)&1 ){.        
1ab20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1ab30 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  el, pLoop->aLTer
1ab40 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m[j]);.      }. 
1ab50 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1ab60 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
1ab70 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1ab80 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1ab90 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
1aba0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1abb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1abc0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1abd0 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
1abe0 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1abf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ac00 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1ac10 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
1ac20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1ac30 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
1ac40 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1ac50 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1ac60 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d  =0.   && (pLoop-
1ac70 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1ac80 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1ac90 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30  E_COLUMN_EQ))!=0
1aca0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
1acb0 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72  e 2:  We can dir
1acc0 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20  ectly reference 
1acd0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69  a single row usi
1ace0 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ng an.    **    
1acf0 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
1ad00 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1ad10 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1ad20 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20  d.  Or.    **   
1ad30 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
1ad40 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
1ad50 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
1ad60 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a   IN (...)".    *
1ad70 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
1ad80 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ruct..    */.   
1ad90 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
1ada0 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29  u.btree.nEq==1 )
1adb0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
1adc0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a  oop->aLTerm[0];.
1add0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1ade0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
1adf0 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
1ae00 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1ae10 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
1ae20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1ae30 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1ae40 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1ae50 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  ;.    iReleaseRe
1ae60 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1ae70 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65  em;.    iRowidRe
1ae80 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  g = codeEquality
1ae90 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1aea0 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62  rm, pLevel, 0, b
1aeb0 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67  Rev, iReleaseReg
1aec0 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  );.    if( iRowi
1aed0 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65  dReg!=iReleaseRe
1aee0 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  g ) sqlite3Relea
1aef0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1af00 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
1af10 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1af20 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1af30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1af40 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
1af50 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c  eInt, iRowidReg,
1af60 20 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65 43   addrNxt); VdbeC
1af70 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1af80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1af90 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
1afa0 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74  s, iCur, addrNxt
1afb0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1afc0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1afd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1afe0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1aff0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  hange(pParse, iR
1b000 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20  owidReg, 1);.   
1b010 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b020 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1b030 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1b040 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
1b050 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1b060 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1b070 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
1b080 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  se if( (pLoop->w
1b090 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1b0a0 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  PK)!=0.         
1b0b0 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
1b0c0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1b0d0 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b  N_RANGE)!=0.  ){
1b0e0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20  .    /* Case 3: 
1b0f0 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
1b100 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1b110 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1b120 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
1b130 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
1b140 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1b150 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
1b160 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
1b170 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
1b180 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
1b190 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
1b1a0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1b1b0 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53     j = 0;.    pS
1b1c0 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b  tart = pEnd = 0;
1b1d0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1b1e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1b1f0 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61  BTM_LIMIT ) pSta
1b200 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
1b210 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28  rm[j++];.    if(
1b220 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1b230 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1b240 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70  T ) pEnd = pLoop
1b250 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1b260 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
1b270 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t!=0 || pEnd!=0 
1b280 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20  );.    if( bRev 
1b290 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ){.      pTerm =
1b2a0 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   pStart;.      p
1b2b0 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
1b2c0 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
1b2d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b2e0 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1b2f0 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
1b300 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
1b310 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
1b320 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
1b330 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
1b340 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
1b350 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
1b360 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
1b370 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
1b380 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
1b390 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1b3a0 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
1b3b0 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
1b3c0 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
1b3d0 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
1b3e0 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
1b3f0 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1b400 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
1b410 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
1b420 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
1b430 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
1b440 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
1b450 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20  eekGT,.         
1b460 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
1b470 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20  P_SeekLE,.      
1b480 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
1b490 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20    OP_SeekLT,.   
1b4a0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
1b4b0 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20   */  OP_SeekGE. 
1b4c0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
1b4d0 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
1b4e0 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
1b4f0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
1b500 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
1b510 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1b520 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
1b530 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
1b540 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
1b550 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1b560 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
1b570 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1b580 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
1b590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1b5a0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1b5b0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1b5c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b5d0 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c  se( pStart->wtFl
1b5e0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1b5f0 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d  AL );.      pX =
1b600 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
1b610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1b620 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  !=0 );.      tes
1b630 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c  tcase( pStart->l
1b640 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
1b650 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65  ); /* transitive
1b660 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1b670 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1b680 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1b690 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1b6a0 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
1b6b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b6c0 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
1b6d0 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
1b6e0 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
1b6f0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1b700 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1b710 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b720 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b730 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_GT);.      Vd
1b740 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b750 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a  pX->op==TK_LE);.
1b760 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b770 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d  geIf(v, pX->op==
1b780 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_LT);.      Vd
1b790 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b7a0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  pX->op==TK_GE);.
1b7b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b7c0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1b7d0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1b7e0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1b7f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1b800 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
1b810 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1b820 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
1b830 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1b840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b850 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
1b860 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
1b870 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
1b880 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Brk);.      Vdbe
1b890 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
1b8a0 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64  ev==0);.      Vd
1b8b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b8c0 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  bRev!=0);.    }.
1b8d0 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
1b8e0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
1b8f0 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
1b900 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
1b910 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
1b920 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
1b930 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1b940 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1b950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b960 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
1b970 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61  !=iCur ); /* Tra
1b980 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
1b990 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  nts */.      tes
1b9a0 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
1b9b0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1b9c0 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  UAL );.      mem
1b9d0 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61  EndValue = ++pPa
1b9e0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1b9f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ba00 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1ba10 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  ght, memEndValue
1ba20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  );.      if( pX-
1ba30 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
1ba40 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
1ba50 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1ba60 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
1ba70 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  P_Ge;.      }els
1ba80 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  e{.        testO
1ba90 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74  p = bRev ? OP_Lt
1baa0 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20   : OP_Gt;.      
1bab0 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  }.      disableT
1bac0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
1bad0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
1bae0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
1baf0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1bb00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1bb10 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
1bb20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  : OP_Next;.    p
1bb30 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1bb40 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1bb50 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73   = start;.    as
1bb60 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
1bb70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74  ==0 );.    if( t
1bb80 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
1bb90 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1bba0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1bbb0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1bbc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1bbd0 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  P_Rowid, iCur, i
1bbe0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1bbf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1bc00 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1bc10 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1bc20 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1bc30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1bc40 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61  testOp, memEndVa
1bc50 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  lue, addrBrk, iR
1bc60 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1bc70 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1bc80 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29  , testOp==OP_Le)
1bc90 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1bca0 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1bcb0 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
1bcc0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1bcd0 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29  , testOp==OP_Ge)
1bce0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1bcf0 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70  rageIf(v, testOp
1bd00 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1bd10 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1bd20 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46  eP5(v, SQLITE_AF
1bd30 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49  F_NUMERIC | SQLI
1bd40 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1bd50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1bd60 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1bd70 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1bd80 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1bd90 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  4: A scan using 
1bda0 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
1bdb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1bdc0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1bdd0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
1bde0 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
1bdf0 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
1be00 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
1be10 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
1be20 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
1be30 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
1be40 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
1be50 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1be60 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
1be70 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
1be80 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
1be90 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
1bea0 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
1beb0 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
1bec0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
1bed0 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
1bee0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1bef0 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
1bf00 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
1bf10 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
1bf20 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
1bf30 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
1bf40 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
1bf50 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
1bf60 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
1bf70 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
1bf80 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1bf90 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
1bfa0 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
1bfb0 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
1bfc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
1bfd0 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
1bfe0 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
1bff0 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
1c000 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1c010 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
1c020 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1c030 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1c040 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
1c050 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1c060 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
1c070 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1c080 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1c090 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
1c0a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1c0b0 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
1c0c0 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
1c0d0 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
1c0e0 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
1c0f0 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
1c100 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
1c110 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1c120 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
1c130 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1c140 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
1c150 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
1c160 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1c170 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
1c180 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
1c190 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
1c1a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1c1b0 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
1c1c0 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
1c1d0 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
1c1e0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
1c1f0 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
1c200 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
1c210 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1c220 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c230 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
1c240 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
1c250 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
1c260 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
1c270 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
1c280 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
1c290 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
1c2a0 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
1c2b0 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f    .    static co
1c2c0 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b  nst u8 aStartOp[
1c2d0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20  ] = {.      0,. 
1c2e0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50       0,.      OP
1c2f0 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20  _Rewind,        
1c300 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74     /* 2: (!start
1c310 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1c320 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65  startEq &&  !bRe
1c330 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c  v) */.      OP_L
1c340 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
1c350 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63   /* 3: (!start_c
1c360 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
1c370 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29  artEq &&   bRev)
1c380 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1c390 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGT,           /
1c3a0 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 4: (start_cons
1c3b0 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1c3c0 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1c3d0 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1c3e0 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  T,           /* 
1c3f0 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  5: (start_constr
1c400 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
1c410 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1c420 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c        OP_SeekGE,
1c430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a             /* 6:
1c440 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1c450 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1c460 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1c470 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20      OP_SeekLE   
1c480 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28           /* 7: (
1c490 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1c4a0 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
1c4b0 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1c4c0 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
1c4d0 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20  nst u8 aEndOp[] 
1c4e0 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78  = {.      OP_Idx
1c4f0 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
1c500 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 0: (end_constr
1c510 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26  aints && !bRev &
1c520 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20  & !endEq) */.   
1c530 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20     OP_IdxGT,    
1c540 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
1c550 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
1c560 26 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45  & !bRev &&  endE
1c570 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  q) */.      OP_I
1c580 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxLE,           
1c590 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
1c5a0 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76  traints &&  bRev
1c5b0 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20   && !endEq) */. 
1c5c0 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20       OP_IdxLT,  
1c5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
1c5e0 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1c5f0 20 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e   &&  bRev &&  en
1c600 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  dEq) */.    };. 
1c610 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f     u16 nEq = pLo
1c620 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
1c630 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c640 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73  f == or IN terms
1c650 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
1c660 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1c670 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1c680 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
1c690 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
1c6a0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1c6b0 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
1c6c0 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
1c6d0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1c6e0 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
1c6f0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1c700 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
1c710 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1c720 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1c730 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
1c740 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
1c750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c760 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
1c770 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1c780 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
1c790 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
1c7a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c7b0 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
1c7c0 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1c7d0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
1c7e0 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
1c7f0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
1c800 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
1c810 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
1c820 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
1c830 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c840 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
1c850 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
1c860 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
1c870 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c880 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
1c890 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
1c8a0 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
1c8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c8c0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1c8d0 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
1c8e0 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
1c8f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c900 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1c910 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
1c920 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
1c930 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1c940 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
1c950 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
1c960 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
1c970 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
1c980 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1c990 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
1c9a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1c9b0 20 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20     char cEndAff 
1c9c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1c9d0 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1c9e0 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
1c9f0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75  straint */.    u
1ca00 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20  8 bSeekPastNull 
1ca10 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
1ca20 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74  rue to seek past
1ca30 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a   initial nulls *
1ca40 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74  /.    u8 bStopAt
1ca50 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Null = 0;       
1ca60 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74     /* Add condit
1ca70 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ion to terminate
1ca80 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20   at NULLs */..  
1ca90 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1caa0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1cab0 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
1cac0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
1cad0 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d     assert( nEq>=
1cae0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1caf0 53 6b 69 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Skip );..    /* 
1cb00 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74  If this loop sat
1cb10 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72  isfies a sort or
1cb20 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72  der (pOrderBy) r
1cb30 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20  equest that .   
1cb40 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74   ** was passed t
1cb50 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1cb60 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22  to implement a "
1cb70 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e  SELECT min(x) ..
1cb80 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ." .    ** query
1cb90 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1cba0 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
1cbb0 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
1cbc0 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73  n for.    ** a s
1cbd0 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
1cbe0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1cbf0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
1cc00 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73  eturned.    ** s
1cc10 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61  hould not have a
1cc20 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72   NULL value stor
1cc30 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f  ed in 'x'. If co
1cc40 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20  lumn 'x' is.    
1cc50 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
1cc60 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
1cc70 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1cc80 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
1cc90 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65  ,.    ** this re
1cca0 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
1ccb0 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
1ccc0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1ccd0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
1cce0 79 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  y==0.         ||
1ccf0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
1cd00 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a 20 20 20 20  y->nExpr==1.    
1cd10 20 20 20 20 20 7c 7c 20 28 70 57 49 6e 66 6f 2d       || (pWInfo-
1cd20 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
1cd30 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d  E_ORDERBY_MIN)==
1cd40 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 57  0 );.    if( (pW
1cd50 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1cd60 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
1cd70 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70  IN)!=0.     && p
1cd80 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 0a  WInfo->nOBSat>0.
1cd90 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
1cda0 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20  KeyCol>nEq).    
1cdb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1cdc0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1cdd0 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20  nSkip==0 );.    
1cde0 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20    bSeekPastNull 
1cdf0 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
1ce00 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1ce10 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
1ce20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1ce30 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
1ce40 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
1ce50 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
1ce60 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
1ce70 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20  .    j = nEq;.  
1ce80 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1ce90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
1cea0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1ceb0 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c  pRangeStart = pL
1cec0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1ced0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1cee0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
1cef0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1cf00 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
1cf10 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1cf20 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70  RangeEnd = pLoop
1cf30 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1cf40 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
1cf50 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52   1;.      if( pR
1cf60 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20 20 20  angeStart==0.   
1cf70 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64 78      && (j = pIdx
1cf80 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29  ->aiColumn[nEq])
1cf90 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
1cfa0 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
1cfb0 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a  l[j].notNull==0.
1cfc0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1cfd0 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
1cfe0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1cff0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  }.    assert( pR
1d000 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70  angeEnd==0 || (p
1d010 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
1d020 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1d030 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  =0 );..    /* Ge
1d040 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1d050 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
1d060 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
1d070 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
1d080 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
1d090 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
1d0a0 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72   terms in an arr
1d0b0 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
1d0c0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
1d0d0 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20  at regBase..    
1d0e0 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  */.    regBase =
1d0f0 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
1d100 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65  Terms(pParse,pLe
1d110 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52  vel,bRev,nExtraR
1d120 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a  eg,&zStartAff);.
1d130 20 20 20 20 61 73 73 65 72 74 28 20 7a 53 74 61      assert( zSta
1d140 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69  rtAff==0 || sqli
1d150 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 61  te3Strlen30(zSta
1d160 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20  rtAff)>=nEq );. 
1d170 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
1d180 20 29 20 63 45 6e 64 41 66 66 20 3d 20 7a 53 74   ) cEndAff = zSt
1d190 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20  artAff[nEq];.   
1d1a0 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1d1b0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
1d1c0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1d1d0 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
1d1e0 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
1d1f0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
1d200 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
1d210 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
1d220 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
1d230 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
1d240 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
1d250 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
1d260 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
1d270 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
1d280 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e     */.    if( (n
1d290 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  Eq<pIdx->nKeyCol
1d2a0 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d   && bRev==(pIdx-
1d2b0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
1d2c0 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
1d2d0 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20  ).     || (bRev 
1d2e0 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  && pIdx->nKeyCol
1d2f0 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  ==nEq).    ){.  
1d300 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
1d310 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
1d320 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
1d330 20 20 20 20 20 53 57 41 50 28 75 38 2c 20 62 53       SWAP(u8, bS
1d340 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74  eekPastNull, bSt
1d350 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  opAtNull);.    }
1d360 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ..    testcase( 
1d370 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28  pRangeStart && (
1d380 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
1d390 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
1d3a0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1d3b0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
1d3c0 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
1d3d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1d3e0 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  GE)!=0 );.    te
1d3f0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1d400 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
1d410 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1d420 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
1d430 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
1d440 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64 2d  d && (pRangeEnd-
1d450 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1d460 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73 74  GE)!=0 );.    st
1d470 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
1d480 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
1d490 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1d4a0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
1d4b0 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
1d4c0 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
1d4d0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
1d4e0 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
1d4f0 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
1d500 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
1d510 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
1d520 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
1d530 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
1d540 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1d550 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1d560 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
1d570 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
1d580 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
1d590 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1d5a0 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70  RangeStart->pExp
1d5b0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1d5c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d5d0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1d5e0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1d5f0 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1d600 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1d610 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a   TERM_VNULL)==0.
1d620 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1d630 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1d640 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a  Right).      ){.
1d650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1d660 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d670 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
1d680 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
1d690 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1d6a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
1d6b0 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
1d6c0 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
1d6d0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1d6e0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1d6f0 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
1d700 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
1d710 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
1d720 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
1d730 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
1d740 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
1d750 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
1d760 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
1d770 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
1d780 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
1d790 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
1d7a0 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
1d7b0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
1d7c0 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
1d7d0 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
1d7e0 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
1d7f0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
1d800 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d810 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
1d820 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
1d830 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
1d840 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
1d850 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
1d860 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
1d870 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
1d880 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
1d890 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1d8a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d8b0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
1d8c0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1d8d0 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73  TUAL );.    }els
1d8e0 65 20 69 66 28 20 62 53 65 65 6b 50 61 73 74 4e  e if( bSeekPastN
1d8f0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
1d900 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d910 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
1d920 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1d930 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1d940 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d  .      startEq =
1d950 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f   0;.      start_
1d960 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b  constraints = 1;
1d970 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41  .    }.    codeA
1d980 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
1d990 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
1d9a0 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65 65  onstraint - bSee
1d9b0 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72  kPastNull, zStar
1d9c0 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20  tAff);.    op = 
1d9d0 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f  aStartOp[(start_
1d9e0 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20  constraints<<2) 
1d9f0 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b  + (startEq<<1) +
1da00 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65   bRev];.    asse
1da10 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
1da20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1da30 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
1da40 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
1da50 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
1da60 69 6e 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  int);.    VdbeCo
1da70 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56  verage(v);.    V
1da80 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1da90 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b   op==OP_Rewind);
1daa0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1dab0 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20  OP_Rewind );.   
1dac0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1dad0 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b  v, op==OP_Last);
1dae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1daf0 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
1db00 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1db10 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54  v, op==OP_SeekGT
1db20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1db30 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20  ==OP_SeekGT );. 
1db40 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1db50 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
1db60 47 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  GE);  testcase( 
1db70 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b  op==OP_SeekGE );
1db80 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1db90 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65  eIf(v, op==OP_Se
1dba0 65 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73 65  ekLE);  testcase
1dbb0 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20  ( op==OP_SeekLE 
1dbc0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1dbd0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1dbe0 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63 61  SeekLT);  testca
1dbf0 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
1dc00 54 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  T );..    /* Loa
1dc10 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
1dc20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
1dc30 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
1dc40 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
1dc50 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
1dc60 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
1dc70 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
1dc80 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
1dc90 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1dca0 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1dcb0 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
1dcc0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1dcd0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1dce0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
1dcf0 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
1dd00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dd10 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1dd20 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1dd30 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
1dd40 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1dd50 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20  ERM_VNULL)==0.  
1dd60 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
1dd70 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69  xprCanBeNull(pRi
1dd80 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ght).      ){.  
1dd90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1dda0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
1ddb0 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
1ddc0 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
1ddd0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1dde0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
1ddf0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
1de00 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
1de10 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21  Right, cEndAff)!
1de20 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1de30 0a 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69  .       && !sqli
1de40 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1de50 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1de60 67 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20  ght, cEndAff).  
1de70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63      ){.        c
1de80 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
1de90 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1dea0 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66  +nEq, 1, &cEndAf
1deb0 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f);.      }.    
1dec0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
1ded0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1dee0 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c   pRangeEnd->wtFl
1def0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1df00 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  AL );.    }else 
1df10 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20  if( bStopAtNull 
1df20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1df30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1df40 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
1df50 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 65 6e  e+nEq);.      en
1df60 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  dEq = 0;.      n
1df70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1df80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
1df90 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74  bFree(db, zStart
1dfa0 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
1dfb0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
1dfc0 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
1dfd0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1dfe0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1dff0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1e000 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
1e010 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
1e020 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
1e030 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f  . */.    if( nCo
1e040 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
1e050 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52    op = aEndOp[bR
1e060 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20  ev*2 + endEq];. 
1e070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e080 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
1e090 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
1e0a0 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
1e0b0 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
1e0c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1e0d0 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62 65 43  _IdxGT );  VdbeC
1e0e0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1e0f0 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20  =OP_IdxGT );.   
1e100 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e110 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20 56 64  =OP_IdxGE );  Vd
1e120 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e130 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
1e140 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e150 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20  op==OP_IdxLT ); 
1e160 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e170 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  v, op==OP_IdxLT 
1e180 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e190 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  e( op==OP_IdxLE 
1e1a0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
1e1b0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
1e1c0 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LE );.    }..   
1e1d0 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
1e1e0 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
1e1f0 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
1e200 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1e210 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
1e220 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1e230 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
1e240 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69 74  d);.    if( omit
1e250 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f  Table ){.      /
1e260 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f 76 65  * pIdx is a cove
1e270 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20  ring index.  No 
1e280 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  need to access t
1e290 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a  he main table. *
1e2a0 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
1e2b0 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
1e2c0 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
1e2d0 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
1e2e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1e2f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e300 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
1e310 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
1e320 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1e330 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
1e340 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
1e350 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
1e360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e370 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e380 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
1e390 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
1e3a0 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
1e3b0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75 72    }else if( iCur
1e3c0 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20 20  !=iIdxCur ){.   
1e3d0 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
1e3e0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1e3f0 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61  yIndex(pIdx->pTa
1e400 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77  ble);.      iRow
1e410 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  idReg = sqlite3G
1e420 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1e430 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  se, pPk->nKeyCol
1e440 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
1e450 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
1e460 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1e470 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  k = sqlite3Colum
1e480 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70  nOfIndex(pIdx, p
1e490 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29  Pk->aiColumn[j])
1e4a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1e4b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1e4c0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
1e4d0 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b  r, k, iRowidReg+
1e4e0 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1e4f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e500 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
1e510 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  Found, iCur, add
1e520 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  rCont,.         
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e540 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b    iRowidReg, pPk
1e550 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
1e560 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1e570 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   }..    /* Recor
1e580 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
1e590 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
1e5a0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69  ate the loop. Di
1e5b0 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48  sable .    ** WH
1e5c0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
1e5d0 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20   made redundant 
1e5e0 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e  by the index ran
1e5f0 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  ge scan..    */.
1e600 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1e610 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
1e620 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70  NEROW ){.      p
1e630 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1e640 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
1e650 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1e660 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1e670 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
1e680 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1e690 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
1e6a0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1e6b0 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
1e6c0 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28    pLevel->p3 = (
1e6d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
1e6e0 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29  HERE_UNQ_WANTED)
1e6f0 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69  !=0 ? 1:0;.    i
1e700 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1e710 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
1e720 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  RAINT)==0 ){.   
1e730 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
1e740 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
1e750 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
1e760 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e770 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
1e780 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ->p5==0 );.    }
1e790 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
1e7a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
1e7b0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
1e7c0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1e7d0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
1e7e0 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
1e7f0 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 5:  Two or mo
1e800 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
1e810 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
1e820 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
1e830 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
1e840 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1e850 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1e860 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
1e870 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
1e880 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
1e890 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1e8a0 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
1e8b0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
1e8c0 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
1e8d0 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
1e8e0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
1e8f0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
1e900 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
1e910 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
1e920 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
1e930 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
1e940 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
1e950 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
1e960 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
1e970 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
1e980 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
1e990 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
1e9a0 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
1e9b0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
1e9c0 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
1e9d0 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
1e9e0 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  1.    **.    ** 
1e9f0 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69  Then, for each i
1ea00 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65  ndexed term, the
1ea10 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20   following. The 
1ea20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
1ea30 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61   ** RowSetTest a
1ea40 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65  re such that the
1ea50 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75   rowid of the cu
1ea60 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73  rrent row is ins
1ea70 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74  erted.    ** int
1ea80 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66  o the RowSet. If
1ea90 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
1eaa0 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20  resent, control 
1eab0 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a  skips the.    **
1eac0 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e   Gosub opcode an
1ead0 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74  d jumps straight
1eae0 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
1eaf0 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45  erated by WhereE
1eb00 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nd()..    **.   
1eb10 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
1eb20 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65  e3WhereBegin(<te
1eb30 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  rm>).    **     
1eb40 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20       RowSetTest 
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20   # Insert rowid 
1eb70 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20  into rowset.    
1eb80 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  **          Gosu
1eb90 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a  b      2 A.    *
1eba0 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
1ebb0 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a  WhereEnd().    *
1ebc0 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69  *.    ** Followi
1ebd0 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f  ng the above, co
1ebe0 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  de to terminate 
1ebf0 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  the loop. Label 
1ec00 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20  A, the target.  
1ec10 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75    ** of the Gosu
1ec20 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74  b above, jumps t
1ec30 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
1ec40 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  n right after th
1ec50 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  e Goto..    **. 
1ec60 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
1ec70 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
1ec80 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
1ec90 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
1eca0 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  reg 1.    **    
1ecb0 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
1ecc0 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20   B              
1ecd0 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20    # The loop is 
1ece0 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a  finished..    **
1ecf0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a  .    **       A:
1ed00 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20   <loop body>    
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52               # R
1ed20 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74  eturn data, what
1ed30 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ever..    **.   
1ed40 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74   **          Ret
1ed50 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20  urn     2       
1ed60 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20           # Jump 
1ed70 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75  back to the Gosu
1ed80 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  b.    **.    ** 
1ed90 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20        B: <after 
1eda0 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a  the loop>.    **
1edb0 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32 30  .    ** Added 20
1edc0 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68 65  14-05-26: If the
1edd0 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48   table is a WITH
1ede0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c  OUT ROWID table,
1edf0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65   then.    ** use
1ee00 20 61 6e 20 65 70 68 65 72 6d 65 72 61 6c 20 69   an ephermeral i
1ee10 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
1ee20 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f  a RowSet to reco
1ee30 72 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20  rd the primary. 
1ee40 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68     ** keys of th
1ee50 65 20 72 6f 77 73 20 77 65 20 68 61 76 65 20 61  e rows we have a
1ee60 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20  lready seen..   
1ee70 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
1ee80 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
1ee90 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
1eea0 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
1eeb0 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
1eec0 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
1eed0 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
1eee0 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
1eef0 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
1ef00 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
1ef10 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
1ef20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1ef30 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63    /* Potential c
1ef40 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f  overing index (o
1ef50 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69  r NULL) */.    i
1ef60 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61  nt iCovCur = pPa
1ef70 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a  rse->nTab++;  /*
1ef80 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   Cursor used for
1ef90 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66   index scans (if
1efa0 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e   any) */..    in
1efb0 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
1efc0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
1efd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1efe0 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
1eff0 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
1f000 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f020 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1f030 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
1f040 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
1f050 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1f080 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
1f090 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
1f0a0 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
1f0b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1f0c0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
1f0d0 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
1f0e0 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1f110 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
1f120 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
1f130 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
1f140 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f150 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
1f160 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
1f170 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
1f180 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1f1b0 0a 20 20 20 20 69 6e 74 20 73 75 62 57 63 74 72  .    int subWctr
1f1c0 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
1f1d0 20 20 20 20 20 20 20 20 2f 2a 20 77 63 74 72 6c          /* wctrl
1f1e0 46 6c 61 67 73 20 66 6f 72 20 73 75 62 2d 71 75  Flags for sub-qu
1f1f0 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 45 78 70  eries */.    Exp
1f200 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b  r *pAndExpr = 0;
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e  /* An ".. AND (.
1f230 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
1f240 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
1f250 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
1f260 54 61 62 3b 0a 20 20 20 0a 20 20 20 20 70 54 65  Tab;.   .    pTe
1f270 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
1f280 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[0];.    asser
1f290 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
1f2a0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1f2b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1f2c0 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _OR );.    asser
1f2d0 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
1f2e0 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
1f2f0 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57  )!=0 );.    pOrW
1f300 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  c = &pTerm->u.pO
1f310 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70  rInfo->wc;.    p
1f320 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52  Level->op = OP_R
1f330 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65  eturn;.    pLeve
1f340 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72  l->p1 = regRetur
1f350 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  n;..    /* Set u
1f360 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  p a new SrcList 
1f370 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69  in pOrTab contai
1f380 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62  ning the table b
1f390 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20  eing scanned.   
1f3a0 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70   ** by this loop
1f3b0 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f   in the a[0] slo
1f3c0 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61  t and all notRea
1f3d0 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31  dy tables in a[1
1f3e0 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  ..] slots..    *
1f3f0 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74  * This becomes t
1f400 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68  he SrcList in th
1f410 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1f420 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
1f430 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  Begin()..    */.
1f440 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
1f450 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20  nLevel>1 ){.    
1f460 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b    int nNotReady;
1f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f480 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1f490 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  f notReady table
1f4a0 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
1f4b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f4c0 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20  origSrc;     /* 
1f4d0 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66  Original list of
1f4e0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
1f4f0 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49   nNotReady = pWI
1f500 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c  nfo->nLevel - iL
1f510 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20  evel - 1;.      
1f520 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33  pOrTab = sqlite3
1f530 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62  StackAllocRaw(db
1f540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1f560 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e  zeof(*pOrTab)+ n
1f570 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28  NotReady*sizeof(
1f580 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a  pOrTab->a[0]));.
1f590 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62        if( pOrTab
1f5a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74  ==0 ) return not
1f5b0 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72  Ready;.      pOr
1f5c0 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75  Tab->nAlloc = (u
1f5d0 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31  8)(nNotReady + 1
1f5e0 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  );.      pOrTab-
1f5f0 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e  >nSrc = pOrTab->
1f600 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65  nAlloc;.      me
1f610 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20  mcpy(pOrTab->a, 
1f620 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66  pTabItem, sizeof
1f630 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20  (*pTabItem));.  
1f640 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57      origSrc = pW
1f650 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1f660 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31  a;.      for(k=1
1f670 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20  ; k<=nNotReady; 
1f680 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  k++){.        me
1f690 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b  mcpy(&pOrTab->a[
1f6a0 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65  k], &origSrc[pLe
1f6b0 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73  vel[k].iFrom], s
1f6c0 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b  izeof(pOrTab->a[
1f6d0 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  k]));.      }.  
1f6e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f6f0 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  OrTab = pWInfo->
1f700 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  pTabList;.    }.
1f710 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1f720 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65  ze the rowset re
1f730 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69  gister to contai
1f740 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e  n NULL. An SQL N
1f750 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  ULL is .    ** e
1f760 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20  quivalent to an 
1f770 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20 4f  empty rowset.  O
1f780 72 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70 68  r, create an eph
1f790 65 72 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20  ermeral index.  
1f7a0 20 20 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20    ** capable of 
1f7b0 68 6f 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20  holding primary 
1f7c0 6b 65 79 73 20 69 6e 20 74 68 65 20 63 61 73 65  keys in the case
1f7d0 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
1f7e0 57 49 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  WID..    **.    
1f7f0 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69  ** Also initiali
1f800 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20  ze regReturn to 
1f810 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72  contain the addr
1f820 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72  ess of the instr
1f830 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69  uction .    ** i
1f840 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
1f850 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75  wing the OP_Retu
1f860 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  rn at the bottom
1f870 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68   of the loop. Th
1f880 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71  is.    ** is req
1f890 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f  uired in a few o
1f8a0 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e  bscure LEFT JOIN
1f8b0 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e   cases where con
1f8c0 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a  trol jumps.    *
1f8d0 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f  * over the top o
1f8e0 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20  f the loop into 
1f8f0 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20  the body of it. 
1f900 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
1f910 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74   .    ** correct
1f920 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68   response for th
1f930 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f  e end-of-loop co
1f940 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72  de (the OP_Retur
1f950 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a  n) is to .    **
1f960 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
1f970 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
1f980 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61  ction, just as a
1f990 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69  n OP_Next does i
1f9a0 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20  f.    ** called 
1f9b0 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  on an uninitiali
1f9c0 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20  zed cursor..    
1f9d0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e  */.    if( (pWIn
1f9e0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1f9f0 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
1fa00 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
1fa10 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
1fa20 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
1fa30 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
1fa40 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1fa50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1fa60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1fa70 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b  , 0, regRowset);
1fa80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fa90 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
1faa0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
1fab0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
1fac0 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 73  .        regRows
1fad0 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  et = pParse->nTa
1fae0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b++;.        sql
1faf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fb00 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1fb10 61 6c 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70  al, regRowset, p
1fb20 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
1fb30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fb40 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
1fb50 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20  arse, pPk);.    
1fb60 20 20 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77    }.      regRow
1fb70 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
1fb80 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Mem;.    }.    i
1fb90 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
1fba0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1fbb0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
1fbc0 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
1fbd0 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
1fbe0 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
1fbf0 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
1fc00 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
1fc10 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
1fc20 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
1fc30 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
1fc40 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
1fc50 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
1fc60 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
1fc70 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
1fc80 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
1fc90 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
1fca0 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
1fcb0 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
1fcc0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
1fcd0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
1fce0 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
1fcf0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1fd00 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
1fd10 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
1fd20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
1fd30 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
1fd40 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
1fd50 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
1fd60 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
1fd70 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
1fd80 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
1fd90 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
1fda0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
1fdb0 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
1fdc0 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
1fdd0 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
1fde0 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
1fdf0 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** This optimiza
1fe00 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61  tion also only a
1fe10 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78  pplies if the (x
1fe20 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
1fe30 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e  term.    ** is n
1fe40 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1fe50 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
1fe60 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20   a LEFT JOIN..  
1fe70 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20    ** See ticket 
1fe80 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
1fe90 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66  e.org/src/info/f
1fea0 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f  2369304e4.    */
1feb0 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
1fec0 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  erm>1 ){.      i
1fed0 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt iTerm;.      
1fee0 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65  for(iTerm=0; iTe
1fef0 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  rm<pWC->nTerm; i
1ff00 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
1ff10 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1ff20 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
1ff30 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
1ff40 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d  &pWC->a[iTerm] =
1ff50 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e  = pTerm ) contin
1ff60 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1ff70 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ff80 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
1ff90 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  in) ) continue;.
1ffa0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ffb0 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
1ffc0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
1ffd0 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20  RINFO );.       
1ffe0 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e   testcase( pWC->
1fff0 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
20000 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
20010 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
20020 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46  WC->a[iTerm].wtF
20030 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49  lags & (TERM_ORI
20040 4e 46 4f 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c  NFO|TERM_VIRTUAL
20050 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
20060 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e        if( (pWC->
20070 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74  a[iTerm].eOperat
20080 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20  or & WO_ALL)==0 
20090 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
200a0 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
200b0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
200c0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
200d0 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
200e0 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
200f0 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29  pAndExpr, pExpr)
20100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20110 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
20120 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
20130 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
20140 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20  pParse, TK_AND, 
20150 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b  0, pAndExpr, 0);
20160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20170 20 20 20 20 2f 2a 20 52 75 6e 20 61 20 73 65 70      /* Run a sep
20180 61 72 61 74 65 20 57 48 45 52 45 20 63 6c 61 75  arate WHERE clau
20190 73 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  se for each term
201a0 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73   of the OR claus
201b0 65 2e 20 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  e.  After.    **
201c0 20 65 6c 69 6d 69 6e 61 74 69 6e 67 20 64 75 70   eliminating dup
201d0 6c 69 63 61 74 65 73 20 66 72 6f 6d 20 6f 74 68  licates from oth
201e0 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  er WHERE clauses
201f0 2c 20 74 68 65 20 61 63 74 69 6f 6e 20 66 6f 72  , the action for
20200 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 73 75 62   each.    ** sub
20210 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73  -WHERE clause is
20220 20 74 6f 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68   to to invoke th
20230 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79  e main loop body
20240 20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65   as a subroutine
20250 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 75 62  ..    */.    sub
20260 57 63 74 72 6c 46 6c 61 67 73 20 3d 20 57 48 45  WctrlFlags = WHE
20270 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
20280 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f  SE | WHERE_AND_O
20290 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NLY |.          
202a0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
202b0 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48  FORCE_TABLE | WH
202c0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
202d0 59 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  Y;.    for(ii=0;
202e0 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
202f0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
20300 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
20310 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
20320 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
20330 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
20340 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65  ==iCur || (pOrTe
20350 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
20360 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
20370 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20        WhereInfo 
20380 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20  *pSubWInfo;     
20390 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f        /* Info fo
203a0 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d  r single OR-term
203b0 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   scan */.       
203c0 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d   Expr *pOrExpr =
203d0 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b   pOrTerm->pExpr;
203e0 20 2f 2a 20 43 75 72 72 65 6e 74 20 4f 52 20 63   /* Current OR c
203f0 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
20400 20 20 20 20 20 20 69 6e 74 20 6a 31 20 3d 20 30        int j1 = 0
20410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20420 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
20430 20 6f 66 20 6a 75 6d 70 20 6f 70 65 72 61 74 69   of jump operati
20440 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  on */.        if
20450 28 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45  ( pAndExpr && !E
20460 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20470 4f 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  OrExpr, EP_FromJ
20480 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oin) ){.        
20490 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66    pAndExpr->pLef
204a0 74 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20  t = pOrExpr;.   
204b0 20 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d         pOrExpr =
204c0 20 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20   pAndExpr;.     
204d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
204e0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  Loop through tab
204f0 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
20500 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
20510 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rm. */.        p
20520 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
20530 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
20540 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72  rse, pOrTab, pOr
20550 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Expr, 0, 0,.    
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20570 20 20 20 20 73 75 62 57 63 74 72 6c 46 6c 61 67      subWctrlFlag
20580 73 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20  s, iCovCur);.   
20590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
205a0 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65  bWInfo || pParse
205b0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
205c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
205d0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
205e0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
205f0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62   WhereLoop *pSub
20600 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
20610 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
20630 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70  arse, pOrTab, &p
20640 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  SubWInfo->a[0], 
20650 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e  iLevel, pLevel->
20660 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20  iFrom, 0.       
20670 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
20680 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 73  /* This is the s
20690 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20  ub-WHERE clause 
206a0 62 6f 64 79 2e 20 20 46 69 72 73 74 20 73 6b 69  body.  First ski
206b0 70 20 6f 76 65 72 0a 20 20 20 20 20 20 20 20 20  p over.         
206c0 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 72 6f   ** duplicate ro
206d0 77 73 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75  ws from prior su
206e0 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c  b-WHERE clauses,
206f0 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 0a   and record the.
20700 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
20710 69 64 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  id (or PRIMARY K
20720 45 59 29 20 66 6f 72 20 74 68 65 20 63 75 72 72  EY) for the curr
20730 65 6e 74 20 72 6f 77 20 73 6f 20 74 68 61 74 20  ent row so that 
20740 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20  the same.       
20750 20 20 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62     ** row will b
20760 65 20 73 6b 69 70 70 65 64 20 69 6e 20 73 75 62  e skipped in sub
20770 73 65 71 75 65 6e 74 20 73 75 62 2d 57 48 45 52  sequent sub-WHER
20780 45 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  E clauses..     
20790 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
207a0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
207b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
207c0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
207d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
207e0 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20     int r;.      
207f0 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d        int iSet =
20800 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54   ((ii==pOrWc->nT
20810 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20  erm-1)?-1:ii);. 
20820 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 48             if( H
20830 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
20840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
20850 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20860 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
20870 73 65 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69 43  se, pTab, -1, iC
20880 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29  ur, regRowid, 0)
20890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
208a0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
208b0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
208c0 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52  RowSetTest, regR
208d0 6f 77 73 65 74 2c 20 30 2c 20 72 2c 69 53 65 74  owset, 0, r,iSet
208e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
208f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
20900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
20910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
20920 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
20930 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
20940 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
20950 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
20960 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
20970 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
20980 20 20 69 6e 74 20 69 50 6b 3b 0a 0a 20 20 20 20    int iPk;..    
20990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
209a0 64 20 74 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e  d the PK into an
209b0 20 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72   array of temp r
209c0 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20  egisters. */.   
209d0 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
209e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
209f0 67 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b  ge(pParse, nPk);
20a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
20a10 6f 72 28 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50  or(iPk=0; iPk<nP
20a20 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20  k; iPk++){.     
20a30 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
20a40 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  Col = pPk->aiCol
20a50 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20  umn[iPk];.      
20a60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20a70 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
20a80 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  mn(pParse, pTab,
20a90 20 69 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69   iCol, iCur, r+i
20aa0 50 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  Pk, 0);.        
20ab0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
20ac0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
20ad0 69 66 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  if the temp tabl
20ae0 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
20af0 6e 73 20 74 68 69 73 20 6b 65 79 2e 20 49 66 20  ns this key. If 
20b00 73 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  so,.            
20b10 20 20 2a 2a 20 74 68 65 20 72 6f 77 20 68 61 73    ** the row has
20b20 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
20b30 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
20b40 73 75 6c 74 20 73 65 74 20 61 6e 64 0a 20 20 20  sult set and.   
20b50 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61             ** ca
20b60 6e 20 62 65 20 69 67 6e 6f 72 65 64 20 28 62 79  n be ignored (by
20b70 20 6a 75 6d 70 69 6e 67 20 70 61 73 74 20 74 68   jumping past th
20b80 65 20 47 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20  e Gosub below). 
20b90 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
20ba0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65           ** inse
20bb0 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20  rt the key into 
20bc0 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61  the temp table a
20bd0 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  nd proceed with 
20be0 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
20bf0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
20c00 72 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20 20  row..           
20c10 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
20c20 20 20 20 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20      ** Use some 
20c30 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 70 74 69  of the same opti
20c40 6d 69 7a 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f  mizations as OP_
20c50 52 6f 77 53 65 74 54 65 73 74 3a 20 49 66 20 69  RowSetTest: If i
20c60 53 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  Set.            
20c70 20 20 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73    ** is zero, as
20c80 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6b 65  sume that the ke
20c90 79 20 63 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79  y cannot already
20ca0 20 62 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 20   be present in. 
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20cc0 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  the temp table. 
20cd0 41 6e 64 20 69 66 20 69 53 65 74 20 69 73 20 2d  And if iSet is -
20ce0 31 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  1, assume that t
20cf0 68 65 72 65 20 69 73 20 6e 6f 20 0a 20 20 20 20  here is no .    
20d00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
20d10 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
20d20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  key into the tem
20d30 70 20 74 61 62 6c 65 2c 20 61 73 20 69 74 20 77  p table, as it w
20d40 69 6c 6c 20 6e 65 76 65 72 20 0a 20 20 20 20 20  ill never .     
20d50 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 74           ** be t
20d60 65 73 74 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a  ested for.  */ .
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
20d80 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20 20 20  ( iSet ){.      
20d90 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73            j1 = s
20da0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20db0 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
20dc0 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72   regRowset, 0, r
20dd0 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20  , nPk);.        
20de0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
20df0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
20e00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20e10 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74 3e         if( iSet>
20e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
20e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20e40 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
20e50 6b 65 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b  keRecord, r, nPk
20e60 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
20e80 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
20e90 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
20ea0 72 65 67 52 6f 77 73 65 74 2c 20 72 65 67 52 6f  regRowset, regRo
20eb0 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  wid, 0);.       
20ec0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65           if( iSe
20ed0 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  t ) sqlite3VdbeC
20ee0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
20ef0 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
20f00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20f10 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
20f20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
20f30 61 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65  array of temp re
20f40 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 20  gisters */.     
20f50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20f60 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
20f70 28 70 50 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29  (pParse, r, nPk)
20f80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
20f90 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
20fa0 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65         /* Invoke
20fb0 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62   the main loop b
20fc0 6f 64 79 20 61 73 20 61 20 73 75 62 72 6f 75 74  ody as a subrout
20fd0 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ine */.         
20fe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20ff0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
21000 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70  regReturn, iLoop
21010 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20  Body);..        
21020 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 28    /* Jump here (
21030 73 6b 69 70 70 69 6e 67 20 74 68 65 20 6d 61 69  skipping the mai
21040 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 73 75 62 72  n loop body subr
21050 6f 75 74 69 6e 65 29 20 69 66 20 74 68 65 0a 20  outine) if the. 
21060 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
21070 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20 72 6f  ent sub-WHERE ro
21080 77 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  w is a duplicate
21090 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d   from prior sub-
210a0 57 48 45 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20  WHEREs. */.     
210b0 20 20 20 20 20 69 66 28 20 6a 31 20 29 20 73 71       if( j1 ) sq
210c0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
210d0 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 20  e(v, j1);..     
210e0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62       /* The pSub
210f0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
21100 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20  erms flag means 
21110 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72  that this OR ter
21120 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  m.          ** c
21130 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20  ontained one or 
21140 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72  more AND term fr
21150 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61  om a notReady ta
21160 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  ble.  The.      
21170 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f      ** terms fro
21180 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74  m the notReady t
21190 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  able could not b
211a0 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c  e tested and wil
211b0 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  l.          ** n
211c0 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64  eed to be tested
211d0 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20   later..        
211e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
211f0 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  f( pSubWInfo->un
21200 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e  testedTerms ) un
21210 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b  testedTerms = 1;
21220 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
21230 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d  f all of the OR-
21240 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
21250 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73  are optimized us
21260 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20  ing the same.   
21270 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c         ** index,
21280 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
21290 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  s opened using t
212a0 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e  he same cursor n
212b0 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20 20  umber.          
212c0 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20  ** by each call 
212d0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
212e0 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74  egin() made by t
212f0 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79  his loop, it may
21300 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
21310 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
21320 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20 61   that index as a
21330 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
21340 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
21350 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
21360 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
21370 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61 62  3WhereBegin() ab
21380 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ove resulted in 
21390 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20  a scan that.    
213a0 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e        ** uses an
213b0 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73   index, and this
213c0 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 66   is either the f
213d0 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  irst OR-connecte
213e0 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  d term.         
213f0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72   ** processed or
21400 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 68   the index is th
21410 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 75  e same as that u
21420 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69  sed by all previ
21430 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
21440 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76   terms, set pCov
21450 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74   to the candidat
21460 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
21470 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
21480 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
21490 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69  Cov to NULL to i
214a0 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20  ndicate that no 
214b0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
214c0 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20  ng index will . 
214d0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61           ** be a
214e0 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20  vailable..      
214f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
21500 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62   pSubLoop = pSub
21510 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
21520 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  op;.          as
21530 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d  sert( (pSubLoop-
21540 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
21550 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20  _AUTO_INDEX)==0 
21560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21570 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c   (pSubLoop->wsFl
21580 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
21590 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20  XED)!=0.        
215a0 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20     && (ii==0 || 
215b0 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
215c0 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a  e.pIndex==pCov).
215d0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 48             && (H
215e0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
215f0 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
21600 64 65 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e  dex(pSubLoop->u.
21610 62 74 72 65 65 2e 70 49 6e 64 65 78 29 29 0a 20  btree.pIndex)). 
21620 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
21630 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21640 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
21650 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72  iIdxCur==iCovCur
21660 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
21670 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d  pCov = pSubLoop-
21680 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
21690 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62  .            sub
216a0 57 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  WctrlFlags |= WH
216b0 45 52 45 5f 4f 52 5f 49 4e 44 45 58 5f 4f 50 45  ERE_OR_INDEX_OPE
216c0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  N;.          }el
216d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
216e0 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  pCov = 0;.      
216f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
21700 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c   /* Finish the l
21710 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
21720 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
21730 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
21740 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
21750 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
21760 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20  pSubWInfo);.    
21770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21780 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
21790 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76  u.pCovidx = pCov
217a0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20 29  ;.    if( pCov )
217b0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
217c0 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20   = iCovCur;.    
217d0 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
217e0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
217f0 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20  pLeft = 0;.     
21800 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
21810 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29  te(db, pAndExpr)
21820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
21830 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
21840 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c  v, iRetInit, sql
21850 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
21860 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c  ddr(v));.    sql
21870 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21880 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
21890 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
218a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
218b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
218c0 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
218d0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
218e0 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  el>1 ) sqlite3St
218f0 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54  ackFree(db, pOrT
21900 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e  ab);.    if( !un
21910 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69  testedTerms ) di
21920 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
21930 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  , pTerm);.  }els
21940 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
21950 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
21960 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a  IZATION */..  {.
21970 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20      /* Case 6:  
21980 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62  There is no usab
21990 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75  le index.  We mu
219a0 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65  st do a complete
219b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
219c0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
219d0 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ire table..    *
219e0 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
219f0 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20  st u8 aStep[] = 
21a00 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72  { OP_Next, OP_Pr
21a10 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63  ev };.    static
21a20 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74   const u8 aStart
21a30 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64  [] = { OP_Rewind
21a40 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20  , OP_Last };.   
21a50 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30   assert( bRev==0
21a60 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20   || bRev==1 );. 
21a70 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
21a80 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a  >isRecursive ){.
21a90 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
21aa0 6d 61 72 6b 65 64 20 69 73 52 65 63 75 72 73 69  marked isRecursi
21ab0 76 65 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73  ve have only a s
21ac0 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20 69  ingle row that i
21ad0 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20  s stored in.    
21ae0 20 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63 75    ** a pseudo-cu
21af0 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74  rsor.  No need t
21b00 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e 65 78 74  o Rewind or Next
21b10 20 73 75 63 68 20 63 75 72 73 6f 72 73 2e 20 2a   such cursors. *
21b20 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  /.      pLevel->
21b30 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
21b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21b50 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65  Level->op = aSte
21b60 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70  p[bRev];.      p
21b70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
21b80 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
21b90 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
21ba0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53  VdbeAddOp2(v, aS
21bb0 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72  tart[bRev], iCur
21bc0 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
21bd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
21be0 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20  (v, bRev==0);.  
21bf0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
21c00 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a  If(v, bRev!=0);.
21c10 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
21c20 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
21c30 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
21c40 45 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  EP;.    }.  }.. 
21c50 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
21c60 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75  to test every su
21c70 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
21c80 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65   can be complete
21c90 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  ly.  ** computed
21ca0 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
21cb0 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
21cc0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
21cd0 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
21ce0 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
21cf0 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
21d00 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74   Expr *pE;.    t
21d10 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
21d20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
21d30 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65  IRTUAL );.    te
21d40 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
21d50 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
21d60 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
21d70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
21d80 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
21d90 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
21da0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
21db0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
21dc0 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  & pLevel->notRea
21dd0 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
21de0 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
21df0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d  ->untestedTerms=
21e00 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
21e10 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
21e20 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
21e30 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21  _ONETABLE_ONLY)!
21e40 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
21e50 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
21e60 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  s = 1;.      con
21e70 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
21e80 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
21e90 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
21ea0 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pE!=0 );.    if(
21eb0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
21ec0 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
21ed0 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
21ee0 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
21ef0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
21f00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
21f10 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
21f20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pE, addrCont, SQ
21f30 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
21f40 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
21f50 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
21f60 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  ED;.  }..  /* In
21f70 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
21f80 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f  t for implied co
21f90 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20  nstraints based 
21fa0 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a  on transitivity.
21fb0 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22    ** of the "=="
21fc0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
21fd0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66    ** Example: If
21fe0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
21ff0 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61  e contains "t1.a
22000 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62  =t2.b" and "t2.b
22010 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77  =123".  ** and w
22020 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65  e are coding the
22030 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65   t1 loop and the
22040 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74   t2 loop has not
22050 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a   yet coded,.  **
22060 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20   then we cannot 
22070 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32  use the "t1.a=t2
22080 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  .b" constraint, 
22090 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a  but we can code.
220a0 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64    ** the implied
220b0 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73   "t1.a=123" cons
220c0 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
220d0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
220e0 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
220f0 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
22100 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c  ){.    Expr *pE,
22110 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65   *pEAlt;.    Whe
22120 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20  reTerm *pAlt;.  
22130 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
22140 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
22150 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
22160 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22170 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
22180 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56  rator!=(WO_EQUIV
22190 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e  |WO_EQ) ) contin
221a0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
221b0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
221c0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
221d0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
221e0 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74  iLeftJoin ) cont
221f0 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70  inue;.    pE = p
22200 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
22210 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
22220 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
22230 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20  _FromJoin) );.  
22240 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
22250 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
22260 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
22270 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74  )!=0 );.    pAlt
22280 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
22290 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e   iCur, pTerm->u.
222a0 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52  leftColumn, notR
222b0 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
222c0 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  N, 0);.    if( p
222d0 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Alt==0 ) continu
222e0 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d  e;.    if( pAlt-
222f0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
22300 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
22310 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ue;.    testcase
22320 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
22330 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
22340 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d   testcase( pAlt-
22350 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
22360 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f  IN );.    VdbeMo
22370 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
22380 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76  "begin transitiv
22390 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b  e constraint"));
223a0 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c  .    pEAlt = sql
223b0 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
223c0 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45  w(db, sizeof(*pE
223d0 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70  Alt));.    if( p
223e0 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  EAlt ){.      *p
223f0 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45  EAlt = *pAlt->pE
22400 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74  xpr;.      pEAlt
22410 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c  ->pLeft = pE->pL
22420 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eft;.      sqlit
22430 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
22440 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64  arse, pEAlt, add
22450 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
22460 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
22470 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
22480 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20  e(db, pEAlt);.  
22490 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f    }.  }..  /* Fo
224a0 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
224b0 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
224c0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
224d0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
224e0 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
224f0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
22500 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
22510 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
22520 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
22530 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
22540 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
22550 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
22560 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
22570 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
22580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22590 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
225a0 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
225b0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
225c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
225d0 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
225e0 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
225f0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
22600 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
22610 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
22620 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
22630 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
22640 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22650 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
22660 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
22670 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22680 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22690 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
226a0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
226b0 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
226c0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
226d0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
226e0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
226f0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
22700 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
22710 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
22720 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
22730 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b  untestedTerms );
22740 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
22750 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
22760 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
22770 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73  pExpr );.      s
22780 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
22790 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
227a0 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74  >pExpr, addrCont
227b0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
227c0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72  ULL);.      pTer
227d0 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
227e0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
227f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c    }..  return pL
22800 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a  evel->notReady;.
22810 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  }..#if defined(W
22820 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
22830 44 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  D) && defined(SQ
22840 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
22850 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
22860 47 65 6e 65 72 61 74 65 20 22 45 78 70 6c 61 6e  Generate "Explan
22870 61 74 69 6f 6e 22 20 74 65 78 74 20 66 6f 72 20  ation" text for 
22880 61 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2f 0a  a WhereTerm..*/.
22890 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
228a0 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 56 64 62  eExplainTerm(Vdb
228b0 65 20 2a 76 2c 20 57 68 65 72 65 54 65 72 6d 20  e *v, WhereTerm 
228c0 2a 70 54 65 72 6d 29 7b 0a 20 20 63 68 61 72 20  *pTerm){.  char 
228d0 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 6d 65 6d 63  zType[4];.  memc
228e0 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
228f0 20 34 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   4);.  if( pTerm
22900 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
22910 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65  _VIRTUAL ) zType
22920 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 69 66 28  [0] = 'V';.  if(
22930 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
22940 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20  r & WO_EQUIV  ) 
22950 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a  zType[1] = 'E';.
22960 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
22970 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
22980 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
22990 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
229a0 27 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  ';.  sqlite3Expl
229b0 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 25 73  ainPrintf(v, "%s
229c0 20 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 73 71   ", zType);.  sq
229d0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
229e0 28 76 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (v, pTerm->pExpr
229f0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 57  );.}.#endif /* W
22a00 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
22a10 44 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  D && SQLITE_ENAB
22a20 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 20  LE_TREE_EXPLAIN 
22a30 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
22a40 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
22a50 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
22a60 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
22a70 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
22a80 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
22a90 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
22aa0 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
22ab0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
22ac0 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  C){.  WhereInfo 
22ad0 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
22ae0 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20  WInfo;.  int nb 
22af0 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61  = 1+(pWInfo->pTa
22b00 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38  bList->nSrc+7)/8
22b10 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
22b20 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
22b30 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
22b40 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
22b50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
22b60 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
22b70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22b80 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
22b90 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
22ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22bb0 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
22bc0 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
22bd0 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
22be0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22bf0 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
22c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c10 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
22c20 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
22c30 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
22c40 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
22c50 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
22c60 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
22c70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
22c80 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 66 28 20  zName;.     if( 
22c90 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22ca0 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d  x && (zName = p-
22cb0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
22cc0 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
22cd0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
22ce0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
22cf0 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
22d00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
22d10 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
22d20 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
22d30 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
22d40 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
22d50 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
22d60 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
22d70 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
22d80 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
22d90 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  6s %2d", zName, 
22da0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
22db0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22dc0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22dd0 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b  intf("%20s","");
22de0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
22df0 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
22e00 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
22e10 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
22e20 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
22e30 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
22e40 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
22e50 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
22e60 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
22e70 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
22e80 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
22e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
22ea0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
22eb0 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
22ec0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
22ed0 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
22ee0 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
22ef0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22f00 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a  f(" %-19s", z);.
22f10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22f20 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (z);.  }.  sqlit
22f30 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
22f40 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d  f %05x N %d", p-
22f50 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
22f60 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  erm);.  sqlite3D
22f70 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
22f80 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
22f90 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
22fa0 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  n, p->nOut);.#if
22fb0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
22fc0 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 0a 20  E_TREE_EXPLAIN. 
22fd0 20 2f 2a 20 49 66 20 74 68 65 20 30 78 31 30 30   /* If the 0x100
22fe0 20 62 69 74 20 6f 66 20 77 68 65 72 65 74 72 61   bit of wheretra
22ff0 63 69 6e 67 20 69 73 20 73 65 74 2c 20 74 68 65  cing is set, the
23000 6e 20 73 68 6f 77 20 61 6c 6c 20 6f 66 20 74 68  n show all of th
23010 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a  e constraint.  *
23020 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
23030 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 61   the WhereLoop.a
23040 4c 54 65 72 6d 5b 5d 20 61 72 72 61 79 2e 0a 20  LTerm[] array.. 
23050 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54   */.  if( p->nLT
23060 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57  erm && (sqlite3W
23070 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
23080 30 29 21 3d 30 20 29 7b 20 20 2f 2a 20 57 48 45  0)!=0 ){  /* WHE
23090 52 45 54 52 41 43 45 20 30 78 31 30 30 20 2a 2f  RETRACE 0x100 */
230a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
230b0 56 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f  Vdbe *v = pWInfo
230c0 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  ->pParse->pVdbe;
230d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
230e0 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20  ainBegin(v);.   
230f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
23100 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
23110 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
23120 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 5b  erm = p->aLTerm[
23130 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  i];.      if( pT
23140 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
23150 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
23160 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c  ExplainPrintf(v,
23170 20 22 20 20 28 25 64 29 20 23 25 2d 32 64 20 22   "  (%d) #%-2d "
23180 2c 20 69 2b 31 2c 20 28 69 6e 74 29 28 70 54 65  , i+1, (int)(pTe
23190 72 6d 2d 70 57 43 2d 3e 61 29 29 3b 0a 20 20 20  rm-pWC->a));.   
231a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
231b0 6e 50 75 73 68 28 76 29 3b 0a 20 20 20 20 20 20  nPush(v);.      
231c0 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d  whereExplainTerm
231d0 28 76 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  (v, pTerm);.    
231e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
231f0 50 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71  Pop(v);.      sq
23200 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76  lite3ExplainNL(v
23210 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
23220 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73  ite3ExplainFinis
23230 68 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  h(v);.    sqlite
23240 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
23250 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  ", sqlite3VdbeEx
23260 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20  planation(v));. 
23270 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64   }.#endif.}.#end
23280 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
23290 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e  t bulk memory in
232a0 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65  to a valid Where
232b0 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65  Loop that can be
232c0 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68   passed.** to wh
232d0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72  ereLoopClear har
232e0 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74  mlessly..*/.stat
232f0 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
23300 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20  pInit(WhereLoop 
23310 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  *p){.  p->aLTerm
23320 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63   = p->aLTermSpac
23330 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d  e;.  p->nLTerm =
23340 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20   0;.  p->nLSlot 
23350 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  = ArraySize(p->a
23360 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70  LTermSpace);.  p
23370 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d  ->wsFlags = 0;.}
23380 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
23390 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e  e WhereLoop.u un
233a0 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72  ion.  Leave Wher
233b0 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74  eLoop.pLTerm int
233c0 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  act..*/.static v
233d0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
233e0 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20  arUnion(sqlite3 
233f0 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
23400 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46  p){.  if( p->wsF
23410 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49  lags & (WHERE_VI
23420 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45  RTUALTABLE|WHERE
23430 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a  _AUTO_INDEX) ){.
23440 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
23450 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
23460 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20  UALTABLE)!=0 && 
23470 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
23480 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ee ){.      sqli
23490 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74  te3_free(p->u.vt
234a0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
234b0 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64    p->u.vtab.need
234c0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
234d0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
234e0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
234f0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
23500 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
23510 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62  EX)!=0 && p->u.b
23520 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
23530 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
23540 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62  bFree(db, p->u.b
23550 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f  tree.pIndex->zCo
23560 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c  lAff);.      sql
23570 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
23580 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  (p->u.btree.pInd
23590 65 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ex->pKeyInfo);. 
235a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
235b0 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
235c0 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
235d0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
235e0 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
235f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
23600 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
23610 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
23620 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
23630 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23640 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
23650 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
23660 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
23670 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
23680 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
23690 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
236a0 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65  ->aLTerm);.  whe
236b0 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
236c0 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65  (db, p);.  where
236d0 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a  LoopInit(p);.}..
236e0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  /*.** Increase t
236f0 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
23700 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e  tion for pLoop->
23710 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61  aLTerm[] to be a
23720 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74  t least n..*/.st
23730 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
23740 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33  opResize(sqlite3
23750 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
23760 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68  *p, int n){.  Wh
23770 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b  ereTerm **paNew;
23780 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74  .  if( p->nLSlot
23790 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=n ) return SQL
237a0 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e  ITE_OK;.  n = (n
237b0 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20  +7)&~7;.  paNew 
237c0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
237d0 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
237e0 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29  p->aLTerm[0])*n)
237f0 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30  ;.  if( paNew==0
23800 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
23810 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
23820 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
23830 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
23840 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
23850 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
23860 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
23870 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
23880 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
23890 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  m);.  p->aLTerm 
238a0 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c  = paNew;.  p->nL
238b0 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75  Slot = n;.  retu
238c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
238d0 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
238e0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
238f0 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e   second pLoop in
23900 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f  to the first..*/
23910 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
23920 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65  eLoopXfer(sqlite
23930 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
23940 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70   *pTo, WhereLoop
23950 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72   *pFrom){.  wher
23960 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
23970 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20  db, pTo);.  if( 
23980 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
23990 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
239a0 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d  nLTerm) ){.    m
239b0 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30  emset(&pTo->u, 0
239c0 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29  , sizeof(pTo->u)
239d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
239e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
239f0 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
23a00 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
23a10 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
23a20 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
23a30 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
23a40 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
23a50 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
23a60 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
23a70 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
23a80 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
23a90 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
23aa0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
23ab0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
23ac0 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
23ad0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
23ae0 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
23af0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
23b00 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
23b10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23b20 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
23b30 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
23b40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23b50 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
23b60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
23b70 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
23b80 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
23b90 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
23ba0 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
23bb0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
23bc0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
23bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23be0 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
23bf0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
23c00 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
23c10 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
23c20 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65  fo) ){.    where
23c30 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49  ClauseClear(&pWI
23c40 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77  nfo->sWC);.    w
23c50 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c  hile( pWInfo->pL
23c60 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68  oops ){.      Wh
23c70 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49  ereLoop *p = pWI
23c80 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20  nfo->pLoops;.   
23c90 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70     pWInfo->pLoop
23ca0 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  s = p->pNextLoop
23cb0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
23cc0 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  pDelete(db, p);.
23cd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23ce0 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
23cf0 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fo);.  }.}../*.*
23d00 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
23d10 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 6c   both of the fol
23d20 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
23d30 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20  .**.**   (1)  X 
23d40 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
23d50 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20  lower cost that 
23d60 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73  Y.**   (2)  X is
23d70 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
23d80 20 6f 66 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22   of Y.**.** By "
23d90 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77  proper subset" w
23da0 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73  e mean that X us
23db0 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63  es fewer WHERE c
23dc0 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74  lause terms.** t
23dd0 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
23de0 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
23df0 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
23e00 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a   is also used.**
23e10 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   by Y..**.** If 
23e20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
23e30 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59  bset of Y then Y
23e40 20 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f   is a better cho
23e50 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a  ice and ought.**
23e60 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72   to have a lower
23e70 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75   cost.  This rou
23e80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55  tine returns TRU
23e90 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74  E when that cost
23ea0 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69   .** relationshi
23eb0 70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e  p is inverted an
23ec0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64  d needs to be ad
23ed0 6a 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  justed..*/.stati
23ee0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43  c int whereLoopC
23ef0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
23f00 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  et(.  const Wher
23f10 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20  eLoop *pX,      
23f20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c   /* First WhereL
23f30 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  oop to compare *
23f40 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  /.  const WhereL
23f50 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f  oop *pY        /
23f60 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  * Compare agains
23f70 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  t this WhereLoop
23f80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
23f90 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54  j;.  if( pX->nLT
23fa0 65 72 6d 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72  erm >= pY->nLTer
23fb0 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  m ) return 0; /*
23fc0 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73   X is not a subs
23fd0 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 69 66 28  et of Y */.  if(
23fe0 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d   pX->rRun >= pY-
23ff0 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28  >rRun ){.    if(
24000 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e   pX->rRun > pY->
24010 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  rRun ) return 0;
24020 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
24030 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
24040 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e    if( pX->nOut >
24050 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75   pY->nOut ) retu
24060 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
24070 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
24080 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  */.  }.  for(i=p
24090 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d  X->nLTerm-1; i>=
240a0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 66 6f 72  0; i--){.    for
240b0 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  (j=pY->nLTerm-1;
240c0 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
240d0 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72     if( pY->aLTer
240e0 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d  m[j]==pX->aLTerm
240f0 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [i] ) break;.   
24100 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29   }.    if( j<0 )
24110 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58   return 0;  /* X
24120 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66   not a subset of
24130 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b   Y since term X[
24140 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59  i] not used by Y
24150 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
24160 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64   1;  /* All cond
24170 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d  itions meet */.}
24180 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61  ../*.** Try to a
24190 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 6f  djust the cost o
241a0 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d  f WhereLoop pTem
241b0 70 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f 72  plate upwards or
241c0 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a   downwards so.**
241d0 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   that:.**.**   (
241e0 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  1) pTemplate cos
241f0 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79  ts less than any
24200 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
24210 73 20 74 68 61 74 20 61 72 65 20 61 20 70 72 6f  s that are a pro
24220 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75 62  per.**       sub
24230 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74 65  set of pTemplate
24240 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54 65  .**.**   (2) pTe
24250 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f 72  mplate costs mor
24260 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  e than any other
24270 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20   WhereLoops for 
24280 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65 0a  which pTemplate.
24290 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20 70 72  **       is a pr
242a0 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a  oper subset..**.
242b0 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72 65  ** To say "Where
242c0 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f 70  Loop X is a prop
242d0 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 22 20  er subset of Y" 
242e0 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75 73 65  means that X use
242f0 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52 45  s fewer.** WHERE
24300 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
24310 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76  an Y and that ev
24320 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
24330 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20   term used by X 
24340 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20  is.** also used 
24350 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  by Y..**.** This
24360 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6f   adjustment is o
24370 6d 69 74 74 65 64 20 66 6f 72 20 53 4b 49 50 53  mitted for SKIPS
24380 43 41 4e 20 6c 6f 6f 70 73 2e 20 20 49 6e 20 61  CAN loops.  In a
24390 20 53 4b 49 50 53 43 41 4e 20 6c 6f 6f 70 2c 20   SKIPSCAN loop, 
243a0 74 68 65 0a 2a 2a 20 57 68 65 72 65 4c 6f 6f 70  the.** WhereLoop
243b0 2e 6e 4c 54 65 72 6d 20 66 69 65 6c 64 20 69 73  .nLTerm field is
243c0 20 6e 6f 74 20 61 6e 20 61 63 63 75 72 61 74 65   not an accurate
243d0 20 6d 65 61 73 75 72 65 20 6f 66 20 74 68 65 20   measure of the 
243e0 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 52 45 0a  number of WHERE.
243f0 2a 2a 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ** clause terms 
24400 63 6f 76 65 72 65 64 2c 20 73 69 6e 63 65 20 73  covered, since s
24410 6f 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ome of the first
24420 20 6e 4c 54 65 72 6d 20 65 6e 74 72 69 65 73 20   nLTerm entries 
24430 69 6e 20 61 4c 54 65 72 6d 5b 5d 0a 2a 2a 20 77  in aLTerm[].** w
24440 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 28 62 65 63  ill be NULL (bec
24450 61 75 73 65 20 74 68 65 79 20 61 72 65 20 73 6b  ause they are sk
24460 69 70 70 65 64 29 2e 20 20 54 68 61 74 20 6d 61  ipped).  That ma
24470 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66  kes it more diff
24480 69 63 75 6c 74 0a 2a 2a 20 74 6f 20 63 6f 6d 70  icult.** to comp
24490 61 72 65 20 74 68 65 20 6c 6f 6f 70 73 2e 20 20  are the loops.  
244a0 57 65 20 63 6f 75 6c 64 20 61 64 64 20 65 78 74  We could add ext
244b0 72 61 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  ra code to do th
244c0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 61 6e  e comparison, an
244d0 64 0a 2a 2a 20 70 65 72 68 61 70 73 20 77 65 20  d.** perhaps we 
244e0 77 69 6c 6c 20 73 6f 6d 65 64 61 79 2e 20 20 42  will someday.  B
244f0 75 74 20 53 4b 49 50 53 43 41 4e 20 69 73 20 73  ut SKIPSCAN is s
24500 75 66 66 69 63 69 65 6e 74 6c 79 20 75 6e 63 6f  ufficiently unco
24510 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73 0a 2a  mmon, and this.*
24520 2a 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  * adjustment is 
24530 73 75 66 66 69 63 69 65 6e 74 20 6d 69 6e 6f 72  sufficient minor
24540 2c 20 74 68 61 74 20 69 74 20 69 73 20 76 65 72  , that it is ver
24550 79 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 63  y difficult to c
24560 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 61 20 74 65  onstruct.** a te
24570 73 74 20 63 61 73 65 20 77 68 65 72 65 20 74 68  st case where th
24580 65 20 65 78 74 72 61 20 63 6f 64 65 20 77 6f 75  e extra code wou
24590 6c 64 20 69 6d 70 72 6f 76 65 20 74 68 65 20 71  ld improve the q
245a0 75 65 72 79 20 70 6c 61 6e 2e 20 20 42 65 74 74  uery plan.  Bett
245b0 65 72 0a 2a 2a 20 74 6f 20 61 76 6f 69 64 20 74  er.** to avoid t
245c0 68 65 20 61 64 64 65 64 20 63 6f 6d 70 6c 65 78  he added complex
245d0 69 74 79 20 61 6e 64 20 6a 75 73 74 20 6f 6d 69  ity and just omi
245e0 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
245f0 74 73 20 74 6f 20 53 4b 49 50 53 43 41 4e 0a 2a  ts to SKIPSCAN.*
24600 2a 20 6c 6f 6f 70 73 2e 0a 2a 2f 0a 73 74 61 74  * loops..*/.stat
24610 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
24620 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73  pAdjustCost(cons
24630 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  t WhereLoop *p, 
24640 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
24650 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54  late){.  if( (pT
24660 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
24670 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
24680 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
24690 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d   if( (pTemplate-
246a0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
246b0 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 29 20  _SKIPSCAN)!=0 ) 
246c0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20  return;.  for(; 
246d0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
246e0 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  p){.    if( p->i
246f0 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Tab!=pTemplate->
24700 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iTab ) continue;
24710 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
24720 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
24730 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69  EXED)==0 ) conti
24740 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d  nue;.    if( (p-
24750 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
24760 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 29 20  _SKIPSCAN)!=0 ) 
24770 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
24780 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  ( whereLoopCheap
24790 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70  erProperSubset(p
247a0 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a  , pTemplate) ){.
247b0 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
247c0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64  pTemplate cost d
247d0 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20  ownward so that 
247e0 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74 68  it is cheaper th
247f0 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a  an its .      **
24800 20 73 75 62 73 65 74 20 70 20 2a 2f 0a 20 20 20   subset p */.   
24810 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
24820 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20  un = p->rRun;.  
24830 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e      pTemplate->n
24840 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20  Out = p->nOut - 
24850 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
24860 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
24870 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 54  rProperSubset(pT
24880 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20  emplate, p) ){. 
24890 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70       /* Adjust p
248a0 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70  Template cost up
248b0 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20  ward so that it 
248c0 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e  is costlier than
248d0 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a   p since.      *
248e0 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  * pTemplate is a
248f0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
24900 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 70 54 65  f p */.      pTe
24910 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70  mplate->rRun = p
24920 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54  ->rRun;.      pT
24930 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20  emplate->nOut = 
24940 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20  p->nOut + 1;.   
24950 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24960 53 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  Search the list 
24970 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e  of WhereLoops in
24980 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67   *ppPrev looking
24990 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61   for one that ca
249a0 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74  n be.** supplant
249b0 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e  ed by pTemplate.
249c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  .**.** Return NU
249d0 4c 4c 20 69 66 20 74 68 65 20 57 68 65 72 65 4c  LL if the WhereL
249e0 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  oop list contain
249f0 73 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  s an entry that 
24a00 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20  can supplant.** 
24a10 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74  pTemplate, in ot
24a20 68 65 72 20 77 6f 72 64 73 20 69 66 20 70 54 65  her words if pTe
24a30 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20  mplate does not 
24a40 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69  belong on the li
24a50 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20  st..**.** If pX 
24a60 69 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74  is a WhereLoop t
24a70 68 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61  hat pTemplate ca
24a80 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e  n supplant, then
24a90 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c   return the.** l
24aa0 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20  ink that points 
24ab0 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  to pX..**.** If 
24ac0 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74  pTemplate cannot
24ad0 20 73 75 70 70 6c 61 6e 74 20 61 6e 79 20 65 78   supplant any ex
24ae0 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f  isting element o
24af0 66 20 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e  f the list but n
24b00 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64  eeds.** to be ad
24b10 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 2c  ded to the list,
24b20 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
24b30 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61  ointer to the ta
24b40 69 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a  il of the list..
24b50 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c  */.static WhereL
24b60 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46  oop **whereLoopF
24b70 69 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65  indLesser(.  Whe
24b80 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c  reLoop **ppPrev,
24b90 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
24ba0 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b  op *pTemplate.){
24bb0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b  .  WhereLoop *p;
24bc0 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65  .  for(p=(*ppPre
24bd0 76 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70  v); p; ppPrev=&p
24be0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a  ->pNextLoop, p=*
24bf0 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28  ppPrev){.    if(
24c00 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
24c10 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e  ate->iTab || p->
24c20 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c  iSortIdx!=pTempl
24c30 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b  ate->iSortIdx ){
24c40 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74  .      /* If eit
24c50 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20  her the iTab or 
24c60 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20  iSortIdx values 
24c70 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f  for two WhereLoo
24c80 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a  p are different.
24c90 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
24ca0 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ose WhereLoops n
24cb0 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64  eed to be consid
24cc0 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  ered separately.
24cd0 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20    Neither is.   
24ce0 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74     ** a candidat
24cf0 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
24d00 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20   other. */.     
24d10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
24d20 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63  .    /* In the c
24d30 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
24d40 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75  ation, the rSetu
24d50 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  p value is eithe
24d60 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72  r zero.    ** or
24d70 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69   the cost of bui
24d80 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  lding an automat
24d90 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29  ic index (NlogN)
24da0 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20   and the NlogN. 
24db0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d     ** is the sam
24dc0 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65  e for compatible
24dd0 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a   WhereLoops. */.
24de0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
24df0 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d  Setup==0 || pTem
24e00 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30  plate->rSetup==0
24e10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
24e20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d     || p->rSetup=
24e30 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
24e40 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68  up );..    /* wh
24e50 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
24e60 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74  ) always generat
24e70 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74  es and inserts t
24e80 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
24e90 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66  ex.    ** case f
24ea0 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d  irst.  Hence com
24eb0 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74  patible candidat
24ec0 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76  e WhereLoops nev
24ed0 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72  er have a larger
24ee0 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20  .    ** rSetup. 
24ef0 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d  Call this SETUP-
24f00 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20  INVARIANT */.   
24f10 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
24f20 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
24f30 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  Setup );..    /*
24f40 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20   Any loop using 
24f50 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65  an appliation-de
24f60 66 69 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20  fined index (or 
24f70 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20  PRIMARY KEY or. 
24f80 20 20 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e     ** UNIQUE con
24f90 73 74 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e  straint) with on
24fa0 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e  e or more == con
24fb0 73 74 72 61 69 6e 74 73 20 69 73 20 62 65 74 74  straints is bett
24fc0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61  er.    ** than a
24fd0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
24fe0 78 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70  x. */.    if( (p
24ff0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
25000 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
25010 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
25020 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
25030 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
25040 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
25050 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
25060 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21  HERE_COLUMN_EQ)!
25070 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70  =0.     && (p->p
25080 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
25090 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
250a0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
250b0 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
250c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
250d0 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  If existing Wher
250e0 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
250f0 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
25100 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  , pTemplate can 
25110 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72  be.    ** discar
25120 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  ded.  WhereLoop 
25130 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a  p is better if:.
25140 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20      **   (1)  p 
25150 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
25160 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54  ndencies than pT
25170 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20  emplate, and.   
25180 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73   **   (2)  p has
25190 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
251a0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65  er cost than pTe
251b0 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20  mplate.    */.  
251c0 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
251d0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
251e0 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
251f0 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20      /* (1)  */. 
25200 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
25210 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
25220 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20  tup             
25230 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
25240 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c       && p->rRun<
25250 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
25280 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
25290 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  <=pTemplate->nOu
252a0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
252b0 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a         /* (2c) *
252c0 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  /.    ){.      r
252d0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73  eturn 0;  /* Dis
252e0 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a  card pTemplate *
252f0 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
25300 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  If pTemplate is 
25310 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68  always better th
25320 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65  an p, then cause
25330 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
25340 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68  tten.    ** with
25350 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65   pTemplate.  pTe
25360 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
25370 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20   than p if:.    
25380 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c  **   (1)  pTempl
25390 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20  ate has no more 
253a0 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e  dependences than
253b0 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20   p, and.    **  
253c0 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (2)  pTemplate 
253d0 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
253e0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
253f0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
25400 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
25410 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
25420 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
25430 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a  ereq   /* (1)  *
25440 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
25450 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
25460 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25480 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
25490 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70  & p->nOut>=pTemp
254a0 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
254d0 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  /.    ){.      a
254e0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
254f0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
25500 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d  tup ); /* SETUP-
25510 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
25520 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  */.      break; 
25530 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20    /* Cause p to 
25540 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
25550 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
25560 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25570 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a  n ppPrev;.}../*.
25580 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70  ** Insert or rep
25590 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lace a WhereLoop
255a0 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
255b0 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69   template suppli
255c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ed..**.** An exi
255d0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
255e0 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f  entry might be o
255f0 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
25600 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a  e new template.*
25610 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20  * is better and 
25620 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64  has fewer depend
25630 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20  encies.  Or the 
25640 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65  template will be
25650 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20   ignored.** and 
25660 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f  no insert will o
25670 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74  ccur if an exist
25680 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
25690 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a   faster and has.
256a0 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  ** fewer depende
256b0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74  ncies than the t
256c0 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77  emplate.  Otherw
256d0 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ise a new WhereL
256e0 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  oop is.** added 
256f0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d  based on the tem
25700 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  plate..**.** If 
25710 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
25720 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
25730 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20  n we care about 
25740 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
25750 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
25760 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
25770 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
25780 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
25790 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
257a0 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
257b0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
257c0 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
257d0 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
257e0 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
257f0 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
25800 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
25810 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
25820 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
25830 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
25840 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
25850 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
25860 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
25870 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
25880 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
25890 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
258a0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73   new template is
258b0 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
258c0 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
258d0 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
258e0 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
258f0 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
25900 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
25910 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
25920 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
25930 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
25940 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
25950 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
25960 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
25970 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
25980 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
25990 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
259a0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
259b0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
259c0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
259d0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
259e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
259f0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
25a00 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
25a10 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
25a20 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
25a30 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
25a40 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68  ppPrev, *p;.  Wh
25a50 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
25a60 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
25a70 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
25a80 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
25a90 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66  se->db;..  /* If
25aa0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
25ab0 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
25ac0 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
25ad0 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
25ae0 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
25af0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
25b00 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
25b10 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41   ){.#if WHERETRA
25b20 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75  CE_ENABLED.    u
25b30 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d  16 n = pBuilder-
25b40 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20  >pOrSet->n;.    
25b50 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
25b60 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
25b70 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  (pBuilder->pOrSe
25b80 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  t, pTemplate->pr
25b90 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d  ereq, pTemplate-
25ba0 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20  >rRun,.         
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bc0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
25bd0 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  late->nOut);.#if
25be0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
25bf0 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
25c00 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25c10 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
25c20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
25c30 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20  bugPrintf(x?"   
25c40 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72  or-%d:  ":"   or
25c50 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20  -X:  ", n);.    
25c60 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
25c70 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
25c80 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
25c90 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
25ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25cb0 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f   }..  /* Look fo
25cc0 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
25cd0 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61  ereLoop to repla
25ce0 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ce with pTemplat
25cf0 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f  e.  */.  whereLo
25d00 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49  opAdjustCost(pWI
25d10 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
25d20 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65  mplate);.  ppPre
25d30 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  v = whereLoopFin
25d40 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d  dLesser(&pWInfo-
25d50 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
25d60 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72  te);..  if( ppPr
25d70 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ev==0 ){.    /* 
25d80 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  There already ex
25d90 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  ists a WhereLoop
25da0 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61   on the list tha
25db0 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  t is better.    
25dc0 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  ** than pTemplat
25dd0 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72  e, so just ignor
25de0 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23  e pTemplate */.#
25df0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
25e00 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
25e10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
25e20 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
25e30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25e40 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73  DebugPrintf("ins
25e50 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20 20  -noop: ");.     
25e60 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
25e70 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
25e80 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
25e90 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
25ea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
25eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
25ec0 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20   *ppPrev;.  }.. 
25ed0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
25ee0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
25ef0 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
25f00 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
25f10 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
25f20 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
25f30 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
25f40 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
25f50 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
25f60 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
25f70 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
25f80 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
25f90 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
25fa0 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
25fb0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
25fc0 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
25fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
25fe0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25ff0 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20  ins-del:  ");.  
26000 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
26010 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e  nt(p, pBuilder->
26020 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pWC);.    }.    
26030 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26040 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29  tf("ins-new:  ")
26050 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50  ;.    whereLoopP
26060 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
26070 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
26080 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
26090 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20   p==0 ){.    /* 
260a0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  Allocate a new W
260b0 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20  hereLoop to add 
260c0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
260d0 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70  e list */.    *p
260e0 70 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69  pPrev = p = sqli
260f0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
26100 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  b, sizeof(WhereL
26110 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70  oop));.    if( p
26120 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
26130 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77  ITE_NOMEM;.    w
26140 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
26150 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  .    p->pNextLoo
26160 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p = 0;.  }else{.
26170 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62      /* We will b
26180 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68  e overwriting Wh
26190 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75  ereLoop p[].  Bu
261a0 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20  t before we do, 
261b0 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20  first.    ** go 
261c0 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74  through the rest
261d0 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64   of the list and
261e0 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65   delete any othe
261f0 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65  r entries beside
26200 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61  s.    ** p[] tha
26210 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c  t are also suppl
26220 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  ated by pTemplat
26230 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  e */.    WhereLo
26240 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70  op **ppTail = &p
26250 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
26260 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44   WhereLoop *pToD
26270 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  el;.    while( *
26280 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  ppTail ){.      
26290 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f  ppTail = whereLo
262a0 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54  opFindLesser(ppT
262b0 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ail, pTemplate);
262c0 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69  .      if( ppTai
262d0 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
262e0 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70      pToDel = *pp
262f0 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Tail;.      if( 
26300 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61  pToDel==0 ) brea
26310 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c  k;.      *ppTail
26320 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74   = pToDel->pNext
26330 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54  Loop;.#if WHERET
26340 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
26350 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  0x8 */.      if(
26360 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26370 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
26380 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26390 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a  Printf("ins-del:
263a0 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68    ");.        wh
263b0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f  ereLoopPrint(pTo
263c0 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Del, pBuilder->p
263d0 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
263e0 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c  dif.      whereL
263f0 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54  oopDelete(db, pT
26400 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oDel);.    }.  }
26410 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  .  whereLoopXfer
26420 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74  (db, p, pTemplat
26430 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
26440 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
26450 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
26460 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
26470 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  dex = p->u.btree
26480 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
26490 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65   pIndex && pInde
264a0 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  x->tnum==0 ){.  
264b0 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
264c0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
264d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
264e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
264f0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
26500 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
26510 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
26520 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
26530 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
26540 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
26550 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
26560 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
26570 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
26580 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ndex..**.** In t
26590 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
265a0 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66  mentation, the f
265b0 69 72 73 74 20 65 78 74 72 61 20 57 48 45 52 45  irst extra WHERE
265c0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64   clause term red
265d0 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  uces.** the numb
265e0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
265f0 73 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  s by a factor of
26600 20 31 30 20 61 6e 64 20 65 61 63 68 20 61 64 64   10 and each add
26610 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20  itional term.** 
26620 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
26630 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
26640 73 20 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f  s by sqrt(2)..*/
26650 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
26660 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
26670 73 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  st(WhereClause *
26680 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pWC, WhereLoop *
26690 70 4c 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65 54  pLoop){.  WhereT
266a0 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b  erm *pTerm, *pX;
266b0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c  .  Bitmask notAl
266c0 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d  lowed = ~(pLoop-
266d0 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d  >prereq|pLoop->m
266e0 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20  askSelf);.  int 
266f0 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70  i, j;..  if( !Op
26700 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
26710 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  d(pWC->pWInfo->p
26720 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
26730 45 5f 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20  E_AdjustOutEst) 
26740 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
26750 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e   }.  for(i=pWC->
26760 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43  nTerm, pTerm=pWC
26770 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
26780 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
26790 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
267a0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
267b0 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
267c0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
267d0 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
267e0 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
267f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
26800 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
26810 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
26820 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
26830 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d      for(j=pLoop-
26840 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
26850 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20   j--){.      pX 
26860 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
26870 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  j];.      if( pX
26880 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
26890 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54        if( pX==pT
268a0 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
268b0 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65     if( pX->iPare
268c0 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e  nt>=0 && (&pWC->
268d0 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d  a[pX->iParent])=
268e0 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
268f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
26900 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  0 ){.      pLoop
26910 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 54 65 72 6d  ->nOut += (pTerm
26920 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 3f  ->truthProb<=0 ?
26930 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
26940 62 20 3a 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  b : -1);.    }. 
26950 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68   }.}../*.** We h
26960 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68  ave so far match
26970 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ed pBuilder->pNe
26980 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74  w->u.btree.nEq t
26990 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  erms of the .** 
269a0 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72  index pIndex. Tr
269b0 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d  y to match one m
269c0 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ore..**.** When 
269d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
269e0 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65   called, pBuilde
269f0 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f  r->pNew->nOut co
26a00 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e  ntains the .** n
26a10 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78  umber of rows ex
26a20 70 65 63 74 65 64 20 74 6f 20 62 65 20 76 69 73  pected to be vis
26a30 69 74 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e  ited by filterin
26a40 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20  g using the nEq 
26a50 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20  .** terms only. 
26a60 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65  If it is modifie
26a70 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  d, this value is
26a80 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
26a90 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
26aa0 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  on returns..**.*
26ab0 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75  * If pProbe->tnu
26ac0 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73  m==0, that means
26ad0 20 70 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b   pIndex is a fak
26ae0 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72  e index used for
26af0 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
26b00 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a  PRIMARY KEY..*/.
26b10 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
26b20 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
26b30 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  x(.  WhereLoopBu
26b40 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
26b50 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
26b60 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f  eLoop factory */
26b70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
26b80 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
26b90 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
26ba0 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61  e term being ana
26bb0 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  lyzed */.  Index
26bc0 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20   *pProbe,       
26bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
26be0 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a   index on pSrc *
26bf0 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75  /.  LogEst nInMu
26c00 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
26c10 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65      /* log(Numbe
26c20 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20  r of iterations 
26c30 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b  due to IN) */.){
26c40 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
26c50 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
26c60 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45  >pWInfo;  /* WHE
26c70 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65  RE analyse conte
26c80 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
26c90 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
26ca0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f  pParse;        /
26cb0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
26cc0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
26cd0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
26ce0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
26cf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  se connection ma
26d00 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lloc context */.
26d10 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
26d20 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
26d30 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68    /* Template Wh
26d40 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f  ereLoop under co
26d50 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
26d60 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
26d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26d80 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 75  /* A WhereTerm u
26d90 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69  nder considerati
26da0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61  on */.  int opMa
26db0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
26dc0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64          /* Valid
26dd0 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63   operators for c
26de0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
26df0 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20  WhereScan scan; 
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e10 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
26e20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20  WHERE terms */. 
26e30 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70   Bitmask saved_p
26e40 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20 20  rereq;          
26e50 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
26e60 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72  ue of pNew->prer
26e70 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  eq */.  u16 save
26e80 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20  d_nLTerm;       
26e90 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
26ea0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
26eb0 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75  w->nLTerm */.  u
26ec0 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20  16 saved_nEq;   
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ee0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
26ef0 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   of pNew->u.btre
26f00 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73  e.nEq */.  u16 s
26f10 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20  aved_nSkip;     
26f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
26f30 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
26f40 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  pNew->u.btree.nS
26f50 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76  kip */.  u32 sav
26f60 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20  ed_wsFlags;     
26f70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
26f80 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
26f90 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20  ew->wsFlags */. 
26fa0 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f   LogEst saved_nO
26fb0 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
26fc0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
26fd0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74  ue of pNew->nOut
26fe0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27000 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
27010 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  f the column in 
27020 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
27030 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27040 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
27050 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
27060 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
27070 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
27080 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
27090 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
270a0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
270b0 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
270c0 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
270d0 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
270e0 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
270f0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
27100 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
27110 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
27120 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27130 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  ;..  assert( (pN
27140 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
27150 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
27160 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
27170 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
27180 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
27190 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  IT)==0 );.  if( 
271a0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
271b0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
271c0 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
271d0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
271e0 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d  else if( pProbe-
271f0 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72  >tnum<=0 || (pSr
27200 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
27210 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
27220 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
27230 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
27240 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
27250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
27260 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
27270 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54  |WO_ISNULL|WO_GT
27280 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
27290 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  LE;.  }.  if( pP
272a0 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
272b0 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57   ) opMask &= ~(W
272c0 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
272d0 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65  |WO_LE);..  asse
272e0 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  rt( pNew->u.btre
272f0 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  e.nEq<pProbe->nC
27300 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 43 6f 6c 20  olumn );.  iCol 
27310 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
27320 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  mn[pNew->u.btree
27330 2e 6e 45 71 5d 3b 0a 0a 20 20 70 54 65 72 6d 20  .nEq];..  pTerm 
27340 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
27350 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
27360 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
27370 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20  sor, iCol,.     
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27390 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
273a0 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20  e);.  saved_nEq 
273b0 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
273c0 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b  nEq;.  saved_nSk
273d0 69 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  ip = pNew->u.btr
273e0 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65  ee.nSkip;.  save
273f0 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d  d_nLTerm = pNew-
27400 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64  >nLTerm;.  saved
27410 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d  _wsFlags = pNew-
27420 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65  >wsFlags;.  save
27430 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d  d_prereq = pNew-
27440 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64  >prereq;.  saved
27450 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f  _nOut = pNew->nO
27460 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  ut;.  pNew->rSet
27470 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69  up = 0;.  rLogSi
27480 7a 65 20 3d 20 65 73 74 4c 6f 67 28 70 50 72 6f  ze = estLog(pPro
27490 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
274a0 30 5d 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69  0]);..  /* Consi
274b0 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70  der using a skip
274c0 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61  -scan if there a
274d0 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
274e0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
274f0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   ** available fo
27500 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  r the left-most 
27510 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
27520 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61  ex, and if the a
27530 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  verage.  ** numb
27540 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e  er of repeats in
27550 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
27560 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74  erms is at least
27570 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   18. .  **.  ** 
27580 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  The magic number
27590 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20   18 is selected 
275a0 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61  on the basis tha
275b0 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f  t scanning 17 ro
275c0 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73  ws.  ** is almos
275d0 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72  t always quicker
275e0 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73   than an index s
275f0 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68  eek (even though
27600 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   if the index.  
27610 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ** contains fewe
27620 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73  r than 2^17 rows
27630 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72   we assume other
27640 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61  wise in other pa
27650 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  rts of.  ** the 
27660 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e  code). And, even
27670 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   if it is not, i
27680 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
27690 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e  too much slower.
276a0 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74   .  ** On the ot
276b0 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78  her hand, the ex
276c0 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20  tra seeks could 
276d0 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67  end up being sig
276e0 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
276f0 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20  more expensive. 
27700 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32   */.  assert( 42
27710 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
27720 31 38 29 20 29 3b 0a 20 20 69 66 28 20 70 54 65  18) );.  if( pTe
27730 72 6d 3d 3d 30 0a 20 20 20 26 26 20 73 61 76 65  rm==0.   && save
27740 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b  d_nEq==saved_nSk
27750 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  ip.   && saved_n
27760 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65  Eq+1<pProbe->nKe
27770 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62  yCol.   && pProb
27780 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
27790 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20  aved_nEq+1]>=42 
277a0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69   /* TUNING: Mini
277b0 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  mum for skip-sca
277c0 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d  n */.   && (rc =
277d0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
277e0 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
277f0 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c  >nLTerm+1))==SQL
27800 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20  ITE_OK.  ){.    
27810 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20  LogEst nIter;.  
27820 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
27830 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  nEq++;.    pNew-
27840 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b  >u.btree.nSkip++
27850 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  ;.    pNew->aLTe
27860 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
27870 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  +] = 0;.    pNew
27880 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
27890 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20  RE_SKIPSCAN;.   
278a0 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d   nIter = pProbe-
278b0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
278c0 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65  ed_nEq] - pProbe
278d0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
278e0 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20  ved_nEq+1];.    
278f0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
27900 74 65 72 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  ter;.    whereLo
27910 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
27920 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
27930 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20  pProbe, nIter + 
27940 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65  nInMul);.    pNe
27950 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
27960 6e 4f 75 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  nOut;.  }.  for(
27970 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
27980 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65  && pTerm!=0; pTe
27990 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65  rm = whereScanNe
279a0 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20  xt(&scan)){.    
279b0 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d  u16 eOp = pTerm-
279c0 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a  >eOperator;   /*
279d0 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
279e0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
279f0 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43  */.    LogEst rC
27a00 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45  ostIdx;.    LogE
27a10 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65  st nOutUnadjuste
27a20 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75  d;        /* nOu
27a30 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e  t before IN() an
27a40 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65  d WHERE adjustme
27a50 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
27a60 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  In = 0;.#ifdef S
27a70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
27a80 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
27a90 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
27aa0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
27ab0 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  lid;.#endif.    
27ac0 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e  if( (eOp==WO_ISN
27ad0 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77  ULL || (pTerm->w
27ae0 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c  tFlags&TERM_VNUL
27af0 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28  L)!=0).     && (
27b00 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e  iCol<0 || pSrc->
27b10 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
27b20 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b  .notNull).    ){
27b30 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
27b40 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e   /* ignore IS [N
27b50 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  OT] NULL constra
27b60 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c  ints on NOT NULL
27b70 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
27b80 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  }.    if( pTerm-
27b90 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
27ba0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
27bb0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70  continue;..    p
27bc0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
27bd0 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
27be0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
27bf0 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
27c00 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
27c10 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  m = saved_nLTerm
27c20 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c  ;.    if( whereL
27c30 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
27c40 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
27c50 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  +1) ) break; /* 
27c60 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  OOM */.    pNew-
27c70 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
27c80 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  Term++] = pTerm;
27c90 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
27ca0 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65  q = (saved_prere
27cb0 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  q | pTerm->prere
27cc0 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d  qRight) & ~pNew-
27cd0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20  >maskSelf;..    
27ce0 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d  assert( nInMul==
27cf0 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e  0.        || (pN
27d00 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
27d10 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
27d20 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  !=0 .        || 
27d30 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27d40 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
27d50 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c  )!=0 .        ||
27d60 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
27d70 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
27d80 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20  )!=0 .    );..  
27d90 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49    if( eOp & WO_I
27da0 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
27db0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
27dc0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
27dd0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
27de0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
27df0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
27e00 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
27e10 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
27e20 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
27e30 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
27e40 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
27e50 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
27e60 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
27e70 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
27e80 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
27e90 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  gEst(25) );.    
27ea0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
27eb0 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
27ec0 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
27ed0 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
27ee0 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
27ef0 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
27f00 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
27f10 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  nIn = sqlite3Log
27f20 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Est(pExpr->x.pLi
27f30 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
27f40 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
27f50 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52  ( nIn>0 );  /* R
27f60 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20  HS always has 2 
27f70 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e  or more terms...
27f80 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20    The parser.   
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fa0 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20       ** changes 
27fb0 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20  "x IN (?)" into 
27fc0 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d  "x=?". */..    }
27fd0 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28  else if( eOp & (
27fe0 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20  WO_EQ) ){.      
27ff0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
28000 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
28010 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
28020 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30  <0 || (nInMul==0
28030 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
28040 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq==pProbe->n
28050 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20  KeyCol-1) ){.   
28060 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
28070 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72   && pProbe->onEr
28080 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror==OE_None ){.
28090 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
280a0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
280b0 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
280c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
280d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
280e0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
280f0 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
28100 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28110 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
28120 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
28130 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
28140 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
28150 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28160 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
28170 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
28180 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
28190 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
281a0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
281b0 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
281c0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
281d0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
281e0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
281f0 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
28200 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
28210 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
28220 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
28230 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
28240 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28250 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20  se( eOp & WO_LT 
28260 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28270 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29  e( eOp & WO_LE )
28280 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
28290 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
282a0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
282b0 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
282c0 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
282d0 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
282e0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
282f0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
28300 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
28310 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
28320 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
28330 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
28340 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
28350 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
28360 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
28370 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
28380 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
28390 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
283a0 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
283b0 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
283c0 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
283d0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
283e0 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
283f0 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
28400 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
28410 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
28420 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
28430 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
28440 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
28450 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
28460 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
28470 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
28480 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
28490 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
284a0 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
284b0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
284c0 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
284d0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
284e0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
284f0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
28500 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
28510 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
28520 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
28530 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
28540 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
28550 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
28560 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
28570 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
28580 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
28590 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
285a0 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
285b0 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
285c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
285d0 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
285e0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
285f0 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
28600 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
28610 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20 20 20 20  O_IN) );..      
28620 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
28630 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
28640 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
28650 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
28660 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  && iCol>=0 ){.  
28670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65        assert( (e
28680 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e  Op & WO_IN) || n
28690 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  In==0 );.       
286a0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
286b0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20   WO_IN );.      
286c0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
286d0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
286e0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
286f0 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
28700 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
28710 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
28720 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
28730 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
28740 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
28750 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
28760 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
28770 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
28780 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
28790 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
287a0 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
287b0 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
287c0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
287d0 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20  , SQLITE_Stat3) 
287e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65  .         && ((e
287f0 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c  Op & WO_IN)==0 |
28800 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
28810 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
28820 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a   EP_xIsSelect)).
28830 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
28840 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
28850 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
28860 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
28870 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
28880 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20  ISNULL))!=0 ){. 
28890 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
288a0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
288b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
288c0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
288d0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
288e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
288f0 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
28900 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
28910 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
28920 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
28930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28940 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
28950 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
28960 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
28970 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75  r->x.pList, &nOu
28980 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
28990 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
289a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
289b0 7c 7c 20 6e 4f 75 74 3e 30 20 29 3b 0a 20 20 20  || nOut>0 );.   
289c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
289d0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
289e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
289f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
28a00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
28a10 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  reak;          /
28a20 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  * Jump out of th
28a30 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a  e pTerm loop */.
28a40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f            if( nO
28a50 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
28a60 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
28a70 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75  qlite3LogEst(nOu
28a80 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
28a90 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73  if( pNew->nOut>s
28aa0 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77  aved_nOut ) pNew
28ab0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
28ac0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Out;.           
28ad0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
28ae0 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  In;.          }.
28af0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28b00 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a    if( nOut==0 ).
28b10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
28b20 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
28b30 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65  >nOut += (pProbe
28b40 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45  ->aiRowLogEst[nE
28b50 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52  q] - pProbe->aiR
28b60 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29  owLogEst[nEq-1])
28b70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28b80 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
28b90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
28ba0 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
28bb0 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68  re is no likelih
28bc0 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73  ood() value, ass
28bd0 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20  ume that a .    
28be0 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20          ** "col 
28bf0 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73  IS NULL" express
28c00 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63  ion matches twic
28c10 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a  e as many rows .
28c20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
28c30 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20  s (col=?). */.  
28c40 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
28c50 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20  nOut += 10;.    
28c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28c70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
28c80 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73  .    /* Set rCos
28c90 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74  tIdx to the cost
28ca0 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c   of visiting sel
28cb0 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e  ected rows in in
28cc0 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20  dex. Add.    ** 
28cd0 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e  it to pNew->rRun
28ce0 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65  , which is curre
28cf0 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20  ntly set to the 
28d00 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65  cost of the inde
28d10 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e  x.    ** seek on
28d20 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69  ly. Then, if thi
28d30 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
28d40 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74  ing index, add t
28d50 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a  he cost of.    *
28d60 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72  * visiting the r
28d70 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
28d80 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72  table.  */.    r
28d90 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e  CostIdx = pNew->
28da0 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70  nOut + 1 + (15*p
28db0 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
28dc0 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54  /pSrc->pTab->szT
28dd0 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  abRow;.    pNew-
28de0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
28df0 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
28e00 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20  e, rCostIdx);.  
28e10 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
28e20 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44  lags & (WHERE_ID
28e30 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b  X_ONLY|WHERE_IPK
28e40 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))==0 ){.      p
28e50 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
28e60 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
28e70 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e  w->rRun, pNew->n
28e80 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d  Out + 16);.    }
28e90 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75  ..    nOutUnadju
28ea0 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  sted = pNew->nOu
28eb0 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  t;.    pNew->rRu
28ec0 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  n += nInMul + nI
28ed0 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  n;.    pNew->nOu
28ee0 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49  t += nInMul + nI
28ef0 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  n;.    whereLoop
28f00 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75  OutputAdjust(pBu
28f10 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77  ilder->pWC, pNew
28f20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  );.    rc = wher
28f30 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
28f40 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  lder, pNew);..  
28f50 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
28f60 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
28f70 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
28f80 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
28f90 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d  aved_nOut;.    }
28fa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
28fb0 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61  ->nOut = nOutUna
28fc0 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a  djusted;.    }..
28fd0 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
28fe0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
28ff0 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20  OP_LIMIT)==0.   
29000 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
29010 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  ee.nEq<pProbe->n
29020 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20  Column.    ){.  
29030 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
29040 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
29050 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
29060 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a  e, nInMul+nIn);.
29070 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
29080 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
29090 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
290a0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
290b0 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c  _STAT4.    pBuil
290c0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
290d0 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64   nRecValid;.#end
290e0 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  if.  }.  pNew->p
290f0 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72  rereq = saved_pr
29100 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  ereq;.  pNew->u.
29110 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
29120 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  d_nEq;.  pNew->u
29130 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 73  .btree.nSkip = s
29140 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e  aved_nSkip;.  pN
29150 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
29160 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70  ved_wsFlags;.  p
29170 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
29180 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e  d_nOut;.  pNew->
29190 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
291a0 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20  LTerm;.  return 
291b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
291c0 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69  urn True if it i
291d0 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
291e0 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20  pIndex might be 
291f0 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70  useful in.** imp
29200 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
29210 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e  DER BY clause in
29220 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a   pBuilder..**.**
29230 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66   Return False if
29240 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e   pBuilder does n
29250 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52  ot contain an OR
29260 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
29270 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
29280 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65  no way for pInde
29290 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69  x to be useful i
292a0 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  n implementing t
292b0 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  hat.** ORDER BY 
292c0 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
292d0 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74  c int indexMight
292e0 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
292f0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
29300 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
29310 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a   Index *pIndex,.
29320 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b    int iCursor.){
29330 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42  .  ExprList *pOB
29340 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
29350 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62  .  if( pIndex->b
29360 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75  Unordered ) retu
29370 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42  rn 0;.  if( (pOB
29380 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
29390 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d  nfo->pOrderBy)==
293a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
293b0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42  for(ii=0; ii<pOB
293c0 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
293d0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
293e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
293f0 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b  pCollate(pOB->a[
29400 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  ii].pExpr);.    
29410 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
29420 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
29430 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78  n 0;.    if( pEx
29440 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72  pr->iTable==iCur
29450 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  sor ){.      for
29460 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
29470 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
29480 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
29490 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
294a0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
294b0 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  j] ) return 1;. 
294c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
294d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
294e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62  /*.** Return a b
294f0 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20  itmask where 1s 
29500 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
29510 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
29520 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
29530 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 62   table is used b
29540 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  y an index.  Onl
29550 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63  y the first 63 c
29560 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69  olumns are consi
29570 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dered..*/.static
29580 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73   Bitmask columns
29590 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  InIndex(Index *p
295a0 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  Idx){.  Bitmask 
295b0 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  m = 0;.  int j;.
295c0 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43    for(j=pIdx->nC
295d0 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  olumn-1; j>=0; j
295e0 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  --){.    int x =
295f0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
29600 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30  j];.    if( x>=0
29610 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
29620 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( x==BMS-1 );.
29630 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29640 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  x==BMS-2 );.    
29650 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
29660 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
29670 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29680 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65  urn m;.}../* Che
29690 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 70  ck to see if a p
296a0 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74  artial index wit
296b0 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65 72  h pPartIndexWher
296c0 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  e can be used.**
296d0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
296e0 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74  query.  Return t
296f0 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62 65  rue if it can be
29700 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
29710 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
29720 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74   whereUsablePart
29730 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61  ialIndex(int iTa
29740 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  b, WhereClause *
29750 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72  pWC, Expr *pWher
29760 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  e){.  int i;.  W
29770 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
29780 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
29790 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
297a0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
297b0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73  rm++){.    if( s
297c0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
297d0 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45 78  sExpr(pTerm->pEx
297e0 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
297f0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
29800 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
29810 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
29820 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
29830 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61   for a single ta
29840 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
29850 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a  where the table.
29860 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62  ** is idenfied b
29870 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  y pBuilder->pNew
29880 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
29890 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
298a0 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74  d to be.** a b-t
298b0 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ree table, not a
298c0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
298d0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20  **.** The costs 
298e0 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29  (WhereLoop.rRun)
298f0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c   of the b-tree l
29900 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68  oops added by th
29910 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
29920 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  re calculated as
29930 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
29940 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c  For a full scan,
29950 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61   assuming the ta
29960 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63  ble (or index) c
29970 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77  ontains nRow row
29980 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73  s:.**.**     cos
29990 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20  t = nRow * 3.0  
299a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299b0 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20    // full-table 
299c0 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74  scan.**     cost
299d0 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20   = nRow * K     
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299f0 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65   // scan of cove
29a00 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
29a10 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
29a20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20  (K+3.0)         
29a30 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
29a40 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  f non-covering i
29a50 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ndex.**.** where
29a60 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65   K is a value be
29a70 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e  tween 1.1 and 3.
29a80 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74  0 set based on t
29a90 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20  he relative .** 
29aa0 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67  estimated averag
29ab0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
29ac0 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65  dex and table re
29ad0 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  cords..**.** For
29ae0 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20   an index scan, 
29af0 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20  where nVisit is 
29b00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
29b10 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64  dex rows visited
29b20 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c  .** by the scan,
29b30 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68   and nSeek is th
29b40 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b  e number of seek
29b50 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75   operations requ
29b60 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  ired on .** the 
29b70 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a  index b-tree:.**
29b80 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
29b90 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
29ba0 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20  ) + K * nVisit) 
29bb0 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65           // cove
29bc0 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ring index.**   
29bd0 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
29be0 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b   (log(nRow) + (K
29bf0 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20  +3.0) * nVisit) 
29c00 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69     // non-coveri
29c10 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e  ng index.**.** N
29c20 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69  ormally, nSeek i
29c30 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65  s 1. nSeek value
29c40 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31  s greater than 1
29c50 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74   come about if t
29c60 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  he .** WHERE cla
29c70 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20  use includes "x 
29c80 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73  IN (....)" terms
29c90 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
29ca0 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e  f "x=?". Or when
29cb0 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78   .** implicit "x
29cc0 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52   IN (SELECT x FR
29cd0 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61  OM tbl)" terms a
29ce0 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69  re added for ski
29cf0 70 2d 73 63 61 6e 73 2e 0a 2a 2f 0a 73 74 61 74  p-scans..*/.stat
29d00 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
29d10 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72  AddBtree(.  Wher
29d20 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
29d30 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45  uilder, /* WHERE
29d40 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
29d50 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
29d60 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20 20   mExtra         
29d70 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
29d80 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20  erequesites for 
29d90 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  using this table
29da0 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
29db0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
29dc0 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
29dd0 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
29de0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
29df0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29e00 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
29e10 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
29e20 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29e40 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
29e50 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
29e60 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c  imary key */.  L
29e70 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b  ogEst aiRowEstPk
29e80 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  [2];       /* Th
29e90 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20  e aiRowLogEst[] 
29ea0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
29eb0 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36  k index */.  i16
29ec0 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31   aiColumnPk = -1
29ed0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
29ee0 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20  aColumn[] value 
29ef0 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
29f00 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  x */.  SrcList *
29f10 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  pTabList;       
29f20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
29f30 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
29f40 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
29f50 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52  pSrc;  /* The FR
29f60 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20  OM clause btree 
29f70 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20  term to add */. 
29f80 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
29f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29fa0 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
29fb0 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
29fc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
29fd0 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  K;         /* Re
29fe0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
29ff0 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b  nt iSortIdx = 1;
2a000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a010 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
2a020 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20  int b;          
2a030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2a040 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a   boolean value *
2a050 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65  /.  LogEst rSize
2a060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a070 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* number of row
2a080 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
2a090 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
2a0a0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2a0b0 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
2a0c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2a0d0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2a0e0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
2a0f0 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
2a100 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57   /* The parsed W
2a110 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2a120 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a140 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
2a150 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77  ied */.  .  pNew
2a160 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2a170 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  w;.  pWInfo = pB
2a180 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2a190 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49    pTabList = pWI
2a1a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
2a1b0 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74   pSrc = pTabList
2a1c0 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
2a1d0 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
2a1e0 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70  >pTab;.  pWC = p
2a1f0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
2a200 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75  assert( !IsVirtu
2a210 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
2a220 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  ;..  if( pSrc->p
2a230 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20  Index ){.    /* 
2a240 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  An INDEXED BY cl
2a250 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61  ause specifies a
2a260 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
2a270 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  x to use */.    
2a280 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70  pProbe = pSrc->p
2a290 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69  Index;.  }else i
2a2a0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
2a2b0 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65  b) ){.    pProbe
2a2c0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
2a2d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2a2e0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44   There is no IND
2a2f0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
2a300 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49   Create a fake I
2a310 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c  ndex object in l
2a320 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69  ocal.    ** vari
2a330 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72  able sPk to repr
2a340 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
2a350 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
2a360 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20  x.  Make this.  
2a370 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20    ** fake index 
2a380 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63  the first in a c
2a390 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62  hain of Index ob
2a3a0 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f  jects with all o
2a3b0 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a  f the real.    *
2a3c0 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c  * indices to fol
2a3d0 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  low */.    Index
2a3e0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
2a3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2a400 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69  rst of real indi
2a410 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
2a420 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
2a430 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49  sPk, 0, sizeof(I
2a440 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e  ndex));.    sPk.
2a450 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20  nKeyCol = 1;.   
2a460 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
2a470 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
2a480 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
2a490 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c  ;.    sPk.aiRowL
2a4a0 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  ogEst = aiRowEst
2a4b0 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
2a4c0 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
2a4d0 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
2a4e0 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b   = pTab;.    sPk
2a4f0 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62  .szIdxRow = pTab
2a500 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
2a510 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
2a520 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2a530 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
2a540 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  [1] = 0;.    pFi
2a550 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
2a560 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
2a570 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
2a580 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
2a590 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
2a5a0 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
2a5b0 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
2a5c0 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
2a5d0 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
2a5e0 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
2a5f0 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
2a600 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
2a610 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
2a620 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
2a630 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
2a640 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54    }.  rSize = pT
2a650 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
2a660 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
2a670 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66  Log(rSize);..#if
2a680 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a690 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
2a6a0 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20  .  /* Automatic 
2a6b0 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28  indexes */.  if(
2a6c0 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53   !pBuilder->pOrS
2a6d0 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  et.   && (pWInfo
2a6e0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ->pParse->db->fl
2a6f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74  ags & SQLITE_Aut
2a700 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26  oIndex)!=0.   &&
2a710 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30   pSrc->pIndex==0
2a720 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76 69  .   && !pSrc->vi
2a730 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26 26  aCoroutine.   &&
2a740 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78   !pSrc->notIndex
2a750 65 64 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69  ed.   && HasRowi
2a760 64 28 70 54 61 62 29 0a 20 20 20 26 26 20 21 70  d(pTab).   && !p
2a770 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  Src->isCorrelate
2a780 64 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69  d.   && !pSrc->i
2a790 73 52 65 63 75 72 73 69 76 65 0a 20 20 29 7b 0a  sRecursive.  ){.
2a7a0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2a7b0 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65  auto-index Where
2a7c0 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65  Loops */.    Whe
2a7d0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
2a7e0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57     WhereTerm *pW
2a7f0 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
2a800 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
2a810 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
2a820 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2a830 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  && pTerm<pWCEnd;
2a840 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2a850 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
2a860 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
2a870 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
2a880 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  nue;.      if( t
2a890 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
2a8a0 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29  (pTerm, pSrc, 0)
2a8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
2a8c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
2a8d0 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
2a8e0 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d  >u.btree.nSkip =
2a8f0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
2a900 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2a910 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 0;.        pN
2a920 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  ew->nLTerm = 1;.
2a930 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
2a940 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
2a950 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2a960 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73  NG: One-time cos
2a970 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20  t for computing 
2a980 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
2a990 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a  dex is.        *
2a9a0 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  * approximately 
2a9b0 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  7*N*log2(N) wher
2a9c0 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
2a9d0 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20  r of rows in.   
2a9e0 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c       ** the tabl
2a9f0 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 2e  e being indexed.
2aa00 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
2aa10 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53  ->rSetup = rLogS
2aa20 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 32 38  ize + rSize + 28
2aa30 3b 20 20 61 73 73 65 72 74 28 20 32 38 3d 3d 73  ;  assert( 28==s
2aa40 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 37 29 20  qlite3LogEst(7) 
2aa50 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  );.        /* TU
2aa60 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
2aa70 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
2aa80 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
2aa90 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
2aaa0 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
2aab0 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
2aac0 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
2aad0 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
2aae0 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
2aaf0 66 20 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20 73  f knowning how s
2ab00 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64  elective the ind
2ab10 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  ex will ultimate
2ab20 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64  ly be.  It would
2ab30 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2ab40 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  be unreasonable 
2ab50 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c  to make this val
2ab60 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20  ue much larger. 
2ab70 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
2ab80 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73  >nOut = 43;  ass
2ab90 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33  ert( 43==sqlite3
2aba0 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20  LogEst(20) );.  
2abb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2abc0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2abd0 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65  Add(rLogSize,pNe
2abe0 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  w->nOut);.      
2abf0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2ac00 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  = WHERE_AUTO_IND
2ac10 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EX;.        pNew
2ac20 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
2ac30 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  a | pTerm->prere
2ac40 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2ac50 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2ac60 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2ac70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
2ac80 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
2ac90 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
2aca0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
2acb0 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
2acc0 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a   all indices.  *
2acd0 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  /.  for(; rc==SQ
2ace0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62  LITE_OK && pProb
2acf0 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  e; pProbe=pProbe
2ad00 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64  ->pNext, iSortId
2ad10 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  x++){.    if( pP
2ad20 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
2ad30 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21  ere!=0.     && !
2ad40 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
2ad50 61 6c 49 6e 64 65 78 28 70 4e 65 77 2d 3e 69 54  alIndex(pNew->iT
2ad60 61 62 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d  ab, pWC, pProbe-
2ad70 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20  >pPartIdxWhere) 
2ad80 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
2ad90 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69  e;  /* Partial i
2ada0 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61  ndex inappropria
2adb0 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  te for this quer
2adc0 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72  y */.    }.    r
2add0 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Size = pProbe->a
2ade0 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
2adf0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
2ae00 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e  .nEq = 0;.    pN
2ae10 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
2ae20 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
2ae30 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  >nLTerm = 0;.   
2ae40 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2ae50 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  = 0;.    pNew->r
2ae60 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70  Setup = 0;.    p
2ae70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
2ae80 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  xtra;.    pNew->
2ae90 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
2aea0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2aeb0 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b  pIndex = pProbe;
2aec0 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69  .    b = indexMi
2aed0 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
2aee0 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72  By(pBuilder, pPr
2aef0 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  obe, pSrc->iCurs
2af00 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  or);.    /* The 
2af10 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
2af20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75  flags never occu
2af30 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  rs together with
2af40 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20   ORDER BY */.   
2af50 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f   assert( (pWInfo
2af60 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2af70 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2af80 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30  IRED)==0 || b==0
2af90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   );.    if( pPro
2afa0 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20  be->tnum<=0 ){. 
2afb0 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
2afc0 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
2afd0 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  x */.      pNew-
2afe0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2aff0 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  _IPK;..      /* 
2b000 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  Full table scan 
2b010 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  */.      pNew->i
2b020 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
2b030 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
2b040 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
2b050 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20  t of full table 
2b060 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e  scan is (N*3.0).
2b070 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
2b080 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
2b090 36 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  6;.      whereLo
2b0a0 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
2b0b0 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  WC, pNew);.     
2b0c0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2b0d0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2b0e0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
2b0f0 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
2b100 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2b110 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
2b120 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2b130 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  m;.      if( pPr
2b140 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  obe->isCovering 
2b150 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2b160 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2b170 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
2b180 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
2b190 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20     m = 0;.      
2b1a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
2b1b0 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
2b1c0 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
2b1d0 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
2b1e0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2b1f0 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
2b200 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
2b210 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
2b220 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
2b230 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
2b240 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
2b250 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
2b260 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73  b.       || !Has
2b270 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20  Rowid(pTab).    
2b280 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20     || ( m==0.   
2b290 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
2b2a0 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
2b2b0 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f          && (pPro
2b2c0 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  be->szIdxRow<pTa
2b2d0 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20  b->szTabRow).   
2b2e0 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
2b2f0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2b300 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2b310 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20  IRED)==0.       
2b320 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
2b330 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
2b340 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
2b350 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
2b360 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
2b370 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65  >db, SQLITE_Cove
2b380 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20  rIdxScan).      
2b390 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20      ).      ){. 
2b3a0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f         pNew->iSo
2b3b0 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
2b3c0 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20  tIdx : 0;..     
2b3d0 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
2b3e0 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 69  f visiting the i
2b3f0 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b  ndex rows is N*K
2b400 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20  , where K is.   
2b410 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
2b420 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70  1.1 and 3.0, dep
2b430 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65  ending on the re
2b440 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20  lative sizes of 
2b450 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
2b460 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
2b470 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ows. If this is 
2b480 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
2b490 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20 20  ndex scan,.     
2b4a0 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20 74     ** also add t
2b4b0 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
2b4c0 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20 28  ing table rows (
2b4d0 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20 20  N*3.0).  */.    
2b4e0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2b4f0 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35   rSize + 1 + (15
2b500 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  *pProbe->szIdxRo
2b510 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  w)/pTab->szTabRo
2b520 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  w;.        if( m
2b530 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2b540 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
2b550 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
2b560 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a 65  New->rRun, rSize
2b570 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +16);.        }.
2b580 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
2b590 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
2b5a0 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  WC, pNew);.     
2b5b0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2b5c0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2b5d0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
2b5e0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2b5f0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
2b600 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
2b610 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2b620 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2b630 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
2b640 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
2b650 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  be, 0);.#ifdef S
2b660 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
2b670 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
2b680 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
2b690 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e  eFree(pBuilder->
2b6a0 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c  pRec);.    pBuil
2b6b0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
2b6c0 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72   0;.    pBuilder
2b6d0 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64  ->pRec = 0;.#end
2b6e0 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
2b6f0 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
2b700 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
2b710 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
2b720 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
2b730 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
2b740 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
2b750 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20  ndex ) break;.  
2b760 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b770 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2b780 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2b790 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  LE./*.** Add all
2b7a0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2b7b0 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
2b7c0 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
2b7d0 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
2b7e0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
2b7f0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
2b800 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2b810 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
2b820 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2b830 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2b840 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tual(.  WhereLoo
2b850 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
2b860 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  er,  /* WHERE cl
2b870 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
2b880 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
2b890 78 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65 49  xtra.){.  WhereI
2b8a0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2b8b0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
2b8c0 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
2b8d0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
2b8e0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
2b8f0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
2b900 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
2b910 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
2b920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b930 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2b940 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
2b950 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
2b960 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
2b970 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
2b980 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  rch */.  Table *
2b990 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
2b9a0 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  *db;.  sqlite3_i
2b9b0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
2b9c0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
2b9d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2b9e0 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
2b9f0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
2ba00 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
2ba10 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
2ba20 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
2ba30 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pTerm;.  int i, 
2ba40 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  j;.  int iTerm, 
2ba50 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43  mxTerm;.  int nC
2ba60 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74  onstraint;.  int
2ba70 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20   seenIn = 0;    
2ba80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ba90 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  e if an IN opera
2baa0 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  tor is seen */. 
2bab0 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30   int seenVar = 0
2bac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2bad0 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63   True if a non-c
2bae0 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69  onstant constrai
2baf0 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  nt is seen */.  
2bb00 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20  int iPhase;     
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bb20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c  0: const w/o IN,
2bb30 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f   1: const, 2: no
2bb40 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20   IN,  2: IN */. 
2bb50 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
2bb60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2bb70 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66  ITE_OK;..  pWInf
2bb80 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2bb90 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
2bba0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
2bbb0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2bbc0 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  db;.  pWC = pBui
2bbd0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65  lder->pWC;.  pNe
2bbe0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
2bbf0 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57  ew;.  pSrc = &pW
2bc00 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2bc10 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20  a[pNew->iTab];. 
2bc20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
2bc30 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73  ab;.  assert( Is
2bc40 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b  Virtual(pTab) );
2bc50 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c  .  pIdxInfo = al
2bc60 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
2bc70 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
2bc80 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  c, pBuilder->pOr
2bc90 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49  derBy);.  if( pI
2bca0 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  dxInfo==0 ) retu
2bcb0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2bcc0 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
2bcd0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  = 0;.  pNew->rSe
2bce0 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
2bcf0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2bd00 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
2bd10 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2bd20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
2bd30 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
2bd40 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49    pUsage = pIdxI
2bd50 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
2bd60 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72  Usage;.  nConstr
2bd70 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d  aint = pIdxInfo-
2bd80 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
2bd90 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
2bda0 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43  ize(db, pNew, nC
2bdb0 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20  onstraint) ){.  
2bdc0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2bdd0 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  db, pIdxInfo);. 
2bde0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bdf0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66  _NOMEM;.  }..  f
2be00 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68  or(iPhase=0; iPh
2be10 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b  ase<=3; iPhase++
2be20 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e  ){.    if( !seen
2be30 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29  In && (iPhase&1)
2be40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68  !=0 ){.      iPh
2be50 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ase++;.      if(
2be60 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61   iPhase>3 ) brea
2be70 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2be80 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68   !seenVar && iPh
2be90 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20  ase>1 ) break;. 
2bea0 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
2beb0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2bec0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
2bed0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
2bee0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f  nstraint;.    fo
2bef0 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
2bf00 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
2bf10 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
2bf20 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78  {.      j = pIdx
2bf30 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
2bf40 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  t;.      pTerm =
2bf50 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
2bf60 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73     switch( iPhas
2bf70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
2bf80 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74  e 0:    /* Const
2bf90 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20  ants without IN 
2bfa0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
2bfb0 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2bfc0 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
2bfd0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2bfe0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2bff0 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)!=0 ){.     
2c000 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20         seenIn = 
2c010 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2c020 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
2c030 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21  rm->prereqRight!
2c040 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c050 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20    seenVar = 1;. 
2c060 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
2c070 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2c080 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  ator & WO_IN)==0
2c090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c0a0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2c0b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2c0c0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
2c0d0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
2c0e0 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e  1:    /* Constan
2c0f0 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61  ts with IN opera
2c100 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  tors */.        
2c110 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e    assert( seenIn
2c120 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
2c130 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2c140 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
2c150 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20  ight==0);.      
2c160 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2c170 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a     case 2:    /*
2c180 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f   Variables witho
2c190 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  ut IN */.       
2c1a0 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56     assert( seenV
2c1b0 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ar );.          
2c1c0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2c1d0 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72   = (pTerm->eOper
2c1e0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  ator & WO_IN)==0
2c1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2c200 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  k;.        defau
2c210 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  lt:   /* Variabl
2c220 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20  es with IN */.  
2c230 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c240 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49  seenVar && seenI
2c250 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
2c260 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2c270 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
2c280 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2c290 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
2c2a0 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Usage, 0, sizeof
2c2b0 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78  (pUsage[0])*pIdx
2c2c0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
2c2d0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t);.    if( pIdx
2c2e0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2c2f0 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
2c300 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
2c310 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64  idxStr);.    pId
2c320 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
2c330 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2c340 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20  >idxNum = 0;.   
2c350 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2c360 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
2c370 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  .    pIdxInfo->o
2c380 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
2c390 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2c3a0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
2c3b0 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
2c3c0 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20   / (double)2;.  
2c3d0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
2c3e0 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a  matedRows = 25;.
2c3f0 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73      rc = vtabBes
2c400 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
2c410 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  Tab, pIdxInfo);.
2c420 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2c430 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
2c440 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64  ab_exit;.    pId
2c450 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
2c460 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2c470 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
2c480 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2c490 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  nt;.    pNew->pr
2c4a0 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
2c4b0 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a     mxTerm = -1;.
2c4c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2c4d0 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
2c4e0 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72  raint );.    for
2c4f0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
2c500 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
2c510 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
2c520 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2c530 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  omitMask = 0;.  
2c540 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
2c550 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
2c560 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
2c570 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
2c580 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
2c590 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
2c5a0 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
2c5b0 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
2c5c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2c5d0 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  rm>=nConstraint.
2c5e0 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a           || j<0.
2c5f0 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70           || j>=p
2c600 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20  WC->nTerm.      
2c610 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
2c620 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
2c630 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c640 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2c650 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ROR;.          s
2c660 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2c670 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74  Parse, "%s.xBest
2c680 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74  Index() malfunct
2c690 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ion", pTab->zNam
2c6a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
2c6b0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
2c6c0 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  tab_exit;.      
2c6d0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
2c6e0 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f  case( iTerm==nCo
2c6f0 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20  nstraint-1 );.  
2c700 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c710 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  j==0 );.        
2c720 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
2c730 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
2c740 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
2c750 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  C->a[j];.       
2c760 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
2c770 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
2c780 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
2c790 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
2c7a0 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2c7b0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2c7c0 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
2c7d0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2c7e0 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
2c7f0 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
2c800 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
2c810 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20  rm==15 );.      
2c820 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2c830 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20  m==16 );.       
2c840 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
2c850 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
2c860 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
2c870 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
2c880 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
2c890 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2c8a0 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2c8b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2c8c0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d  pUsage[i].omit==
2c8d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c8e0 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   /* Do not attem
2c8f0 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20  pt to use an IN 
2c900 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68  constraint if th
2c910 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  e virtual table.
2c920 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
2c930 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75  ays that the equ
2c940 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74  ivalent EQ const
2c950 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
2c960 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a  safely omitted..
2c970 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
2c980 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20  f we do attempt 
2c990 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f  to use such a co
2c9a0 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72  nstraint, some r
2c9b0 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20  ows might be.   
2c9c0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65           ** repe
2c9d0 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ated in the outp
2c9e0 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ut. */.         
2c9f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ca00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ca10 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
2ca20 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
2ca30 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
2ca40 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
2ca50 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
2ca60 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
2ca70 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
2ca80 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
2ca90 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
2caa0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65      ** is not ne
2cab0 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65  cessarily relate
2cac0 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f  d to the order o
2cad0 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61  f output terms a
2cae0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
2caf0 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
2cb00 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
2cb10 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
2cb20 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
2cb30 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
2cb40 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2cb50 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2cb60 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
2cb70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2cb80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2cb90 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  >=nConstraint ){
2cba0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
2cbb0 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
2cbc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
2cbd0 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77  ew->nLTerm<=pNew
2cbe0 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
2cbf0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2cc00 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f  dxNum = pIdxInfo
2cc10 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20  ->idxNum;.      
2cc20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2cc30 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
2cc40 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2cc50 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  tr;.      pIdxIn
2cc60 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2cc70 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  xStr = 0;.      
2cc80 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
2cc90 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
2cca0 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e  idxStr;.      pN
2ccb0 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  ew->u.vtab.isOrd
2ccc0 65 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78  ered = (i8)(pIdx
2ccd0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2cce0 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 20 20  sumed ?.        
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2cd10 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
2cd20 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65   : 0);.      pNe
2cd30 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2cd40 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2cd50 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46  = sqlite3LogEstF
2cd60 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
2cd70 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
2cd80 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  t);.      pNew->
2cd90 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
2cda0 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65  gEst(pIdxInfo->e
2cdb0 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20  stimatedRows);. 
2cdc0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e       whereLoopIn
2cdd0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2cde0 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
2cdf0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2ce00 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  dFree ){.       
2ce10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
2ce20 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
2ce30 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
2ce40 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2ce50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
2ce60 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72     }.  }  ..wher
2ce70 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
2ce80 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  t:.  if( pIdxInf
2ce90 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2cea0 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
2ceb0 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
2cec0 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
2ced0 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
2cee0 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fo);.  return rc
2cef0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2cf00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2cf10 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
2cf20 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65   Add WhereLoop e
2cf30 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65  ntries to handle
2cf40 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73   OR terms.  This
2cf50 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65   works for eithe
2cf60 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76  r.** btrees or v
2cf70 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a  irtual tables..*
2cf80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
2cf90 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72  reLoopAddOr(Wher
2cfa0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2cfb0 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20  uilder, Bitmask 
2cfc0 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65  mExtra){.  Where
2cfd0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
2cfe0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2cff0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2d000 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2d010 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54   *pNew;.  WhereT
2d020 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43  erm *pTerm, *pWC
2d030 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  End;.  int rc = 
2d040 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2d050 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c   iCur;.  WhereCl
2d060 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57  ause tempWC;.  W
2d070 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2d080 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65  sSubBuild;.  Whe
2d090 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43  reOrSet sSum, sC
2d0a0 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  ur;.  struct Src
2d0b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2d0c0 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75  ;.  .  pWC = pBu
2d0d0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66  ilder->pWC;.  if
2d0e0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
2d0f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44  lags & WHERE_AND
2d100 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53  _ONLY ) return S
2d110 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45  QLITE_OK;.  pWCE
2d120 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
2d130 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77  C->nTerm;.  pNew
2d140 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2d150 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75  w;.  memset(&sSu
2d160 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75  m, 0, sizeof(sSu
2d170 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  m));.  pItem = p
2d180 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2d190 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
2d1a0 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
2d1b0 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72  >iCursor;..  for
2d1c0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
2d1d0 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72  Term<pWCEnd && r
2d1e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54  c==SQLITE_OK; pT
2d1f0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
2d200 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2d210 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20  r & WO_OR)!=0.  
2d220 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
2d230 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
2d240 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  le & pNew->maskS
2d250 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  elf)!=0 .    ){.
2d260 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
2d270 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20  e * const pOrWC 
2d280 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
2d290 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57  nfo->wc;.      W
2d2a0 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74  hereTerm * const
2d2b0 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72   pOrWCEnd = &pOr
2d2c0 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65  WC->a[pOrWC->nTe
2d2d0 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65  rm];.      Where
2d2e0 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20  Term *pOrTerm;. 
2d2f0 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20       int once = 
2d300 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  1;.      int i, 
2d310 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53  j;.    .      sS
2d320 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c  ubBuild = *pBuil
2d330 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42  der;.      sSubB
2d340 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20  uild.pOrderBy = 
2d350 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  0;.      sSubBui
2d360 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75  ld.pOrSet = &sCu
2d370 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f  r;..      for(pO
2d380 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
2d390 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
2d3a0 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
2d3b0 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
2d3c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
2d3d0 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20  WO_AND)!=0 ){.  
2d3e0 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
2d3f0 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d  d.pWC = &pOrTerm
2d400 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63  ->u.pAndInfo->wc
2d410 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2d420 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
2d430 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b  tCursor==iCur ){
2d440 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2d450 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e  C.pWInfo = pWC->
2d460 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  pWInfo;.        
2d470 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20    tempWC.pOuter 
2d480 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  = pWC;.         
2d490 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f   tempWC.op = TK_
2d4a0 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74  AND;.          t
2d4b0 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
2d4c0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2d4d0 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20  C.a = pOrTerm;. 
2d4e0 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
2d4f0 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43  ld.pWC = &tempWC
2d500 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d510 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2d520 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
2d530 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20         sCur.n = 
2d540 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
2d550 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2d560 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  BLE.        if( 
2d570 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
2d580 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
2d590 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2d5a0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53  opAddVirtual(&sS
2d5b0 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29  ubBuild, mExtra)
2d5c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
2d5d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
2d5e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2d5f0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2d600 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  e(&sSubBuild, mE
2d610 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  xtra);.        }
2d620 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
2d640 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20  | sCur.n==0 );. 
2d650 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e         if( sCur.
2d660 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
2d670 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
2d680 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2d690 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2d6a0 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20   once ){.       
2d6b0 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
2d6c0 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20  sSum, &sCur);.  
2d6d0 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
2d6e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d6f0 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
2d700 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20  OrSet sPrev;.   
2d710 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
2d720 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d  ve(&sPrev, &sSum
2d730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  );.          sSu
2d740 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
2d750 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50     for(i=0; i<sP
2d760 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  rev.n; i++){.   
2d770 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2d780 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29  ; j<sCur.n; j++)
2d790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2d7a0 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73  whereOrInsert(&s
2d7b0 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e  Sum, sPrev.a[i].
2d7c0 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b  prereq | sCur.a[
2d7d0 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20  j].prereq,.     
2d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
2d800 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
2d810 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b  i].rRun, sCur.a[
2d820 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20  j].rRun),.      
2d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d840 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
2d850 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
2d860 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a  ].nOut, sCur.a[j
2d870 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  ].nOut));.      
2d880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d890 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2d8a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
2d8b0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
2d8c0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2d8d0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
2d8e0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2d8f0 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
2d900 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  R;.      pNew->r
2d910 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
2d920 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2d930 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
2d940 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
2d950 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
2d960 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2d970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d980 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b   i<sSum.n; i++){
2d990 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2d9a0 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53  NG: Currently sS
2d9b0 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20  um.a[i].rRun is 
2d9c0 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  set to the sum o
2d9d0 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20  f the costs.    
2d9e0 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75      ** of all su
2d9f0 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64  b-scans required
2da00 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e   by the OR-scan.
2da10 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f   However, due to
2da20 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20   rounding.      
2da30 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20    ** errors, it 
2da40 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20  may be that the 
2da50 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73  cost of the OR-s
2da60 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20  can is equal to 
2da70 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  its.        ** m
2da80 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75  ost expensive su
2da90 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20  b-scan. Add the 
2daa0 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c  smallest possibl
2dab0 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20  e penalty .     
2dac0 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e     ** (equivalen
2dad0 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67  t to multiplying
2dae0 20 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30   the cost by 1.0
2daf0 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  7) to ensure tha
2db00 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  t .        ** th
2db10 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70  is does not happ
2db20 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66  en. Otherwise, f
2db30 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  or WHERE clauses
2db40 20 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20   such as the.   
2db50 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
2db60 67 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73  g where there is
2db70 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22   an index on "y"
2db80 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2db90 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52       **     WHER
2dba0 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f  E likelihood(x=?
2dbb0 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20  , 0.99) OR y=?. 
2dbc0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2dbd0 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72    ** the planner
2dbe0 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f   may elect to "O
2dbf0 52 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75  R" together a fu
2dc00 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e  ll-table scan an
2dc10 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  d an.        ** 
2dc20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e  index lookup. An
2dc30 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c  d other similarl
2dc40 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20  y odd results.  
2dc50 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
2dc60 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69  >rRun = sSum.a[i
2dc70 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20  ].rRun + 1;.    
2dc80 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2dc90 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b   sSum.a[i].nOut;
2dca0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2dcb0 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69  rereq = sSum.a[i
2dcc0 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ].prereq;.      
2dcd0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2dce0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2dcf0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
2dd00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2dd10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2dd20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
2dd30 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c  p objects for al
2dd40 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61  l tables .*/.sta
2dd50 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2dd60 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f  pAddAll(WhereLoo
2dd70 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
2dd80 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
2dd90 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
2dda0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42  der->pWInfo;.  B
2ddb0 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20  itmask mExtra = 
2ddc0 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  0;.  Bitmask mPr
2ddd0 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ior = 0;.  int i
2dde0 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
2ddf0 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2de00 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
2de10 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2de20 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
2de30 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
2de40 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
2de50 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20   int nTabList = 
2de60 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
2de70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2de80 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72  E_OK;.  u8 prior
2de90 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20  JoinType = 0;.  
2dea0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
2deb0 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
2dec0 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
2ded0 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65  he join, from le
2dee0 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20  ft to right */. 
2def0 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
2df00 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c  ->pNew;.  whereL
2df10 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20  oopInit(pNew);. 
2df20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74   for(iTab=0, pIt
2df30 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  em=pTabList->a; 
2df40 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69  iTab<nTabList; i
2df50 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
2df60 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20  .    pNew->iTab 
2df70 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77  = iTab;.    pNew
2df80 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74  ->maskSelf = get
2df90 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
2dfa0 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69  askSet, pItem->i
2dfb0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
2dfc0 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79   ((pItem->jointy
2dfd0 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65  pe|priorJoinType
2dfe0 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ) & (JT_LEFT|JT_
2dff0 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20  CROSS))!=0 ){.  
2e000 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72      mExtra = mPr
2e010 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ior;.    }.    p
2e020 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70  riorJoinType = p
2e030 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
2e040 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
2e050 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
2e060 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
2e070 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
2e080 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
2e090 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
2e0a0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2e0b0 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69  oopAddBtree(pBui
2e0c0 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20  lder, mExtra);. 
2e0d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2e0e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e0f0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2e100 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
2e110 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
2e120 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
2e130 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
2e140 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
2e150 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2e160 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65  break;.  }.  whe
2e170 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
2e180 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
2e190 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61  rc;.}../*.** Exa
2e1a0 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68  mine a WherePath
2e1b0 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74   (with the addit
2e1c0 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61  ion of the extra
2e1d0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68   WhereLoop of th
2e1e0 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74  e 5th.** paramet
2e1f0 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69  ers) to see if i
2e200 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
2e210 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
2e220 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
2e230 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
2e240 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
2e250 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72  parate sort oper
2e260 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e  ation.  Return N
2e270 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20  :.** .**   N>0: 
2e280 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65    N terms of the
2e290 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2e2a0 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
2e2b0 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65  *   N==0:  No te
2e2c0 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
2e2d0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73   BY clause are s
2e2e0 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c  atisfied.**   N<
2e2f0 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74  0:   Unknown yet
2e300 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20   how many terms 
2e310 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68  of ORDER BY migh
2e320 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20  t be satisfied. 
2e330 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68    .**.** Note th
2e340 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  at processing fo
2e350 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  r WHERE_GROUPBY 
2e360 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e  and WHERE_DISTIN
2e370 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a  CTBY is not as.*
2e380 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20  * strict.  With 
2e390 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
2e3a0 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72  TINCT the only r
2e3b0 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68  equirement is th
2e3c0 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  at.** equivalent
2e3d0 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d   rows appear imm
2e3e0 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e  ediately adjacen
2e3f0 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  t to one another
2e400 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61  .  GROUP BY.** a
2e410 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e  nd DISTINCT do n
2e420 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20  ot require rows 
2e430 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79  to appear in any
2e440 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
2e450 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20  r as long.** as 
2e460 65 71 75 69 76 65 6c 65 6e 74 20 72 6f 77 73 20  equivelent rows 
2e470 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65  are grouped toge
2e480 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20  ther.  Thus for 
2e490 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
2e4a0 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72  TINCT.** the pOr
2e4b0 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20  derBy terms can 
2e4c0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e  be matched in an
2e4d0 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f  y order.  With O
2e4e0 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a  RDER BY, the .**
2e4f0 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
2e500 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20  must be matched 
2e510 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74  in strict left-t
2e520 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a  o-right order..*
2e530 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72  /.static i8 wher
2e540 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
2e550 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
2e560 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
2e570 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
2e580 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
2e590 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
2e5a0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
2e5b0 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43  UP BY or DISTINC
2e5c0 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63  T clause to chec
2e5d0 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  k */.  WherePath
2e5e0 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *pPath,     /* 
2e5f0 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f  The WherePath to
2e600 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20   check */.  u16 
2e610 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
2e620 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61    /* Might conta
2e630 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  in WHERE_GROUPBY
2e640 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e   or WHERE_DISTIN
2e650 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  CTBY */.  u16 nL
2e660 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
2e670 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
2e680 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
2e690 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
2e6a0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
2e6b0 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
2e6c0 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
2e6d0 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
2e6e0 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
2e6f0 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
2e700 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
2e710 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
2e720 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
2e730 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
2e740 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
2e750 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
2e760 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
2e770 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
2e780 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
2e790 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
2e7a0 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
2e7b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2e7c0 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2e7d0 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
2e7e0 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
2e7f0 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
2e800 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2e810 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
2e820 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
2e830 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
2e840 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
2e850 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
2e860 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
2e870 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
2e880 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
2e890 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
2e8a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
2e8b0 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
2e8c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e8d0 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70  key columns in p
2e8e0 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
2e8f0 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
2e900 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2e910 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75   of ordered colu
2e920 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
2e930 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
2e940 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
2e950 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
2e960 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2e970 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
2e980 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
2e990 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
2e9a0 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
2e9b0 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
2e9c0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2e9d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2e9e0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2e9f0 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
2ea00 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2ea10 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
2ea20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
2ea30 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
2ea40 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
2ea50 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
2ea60 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
2ea70 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
2ea80 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
2ea90 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
2eaa0 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
2eab0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2eac0 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
2ead0 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
2eae0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2eaf0 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
2eb00 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
2eb10 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
2eb20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2eb30 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
2eb40 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
2eb50 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
2eb60 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
2eb70 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
2eb80 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2eb90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
2eba0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
2ebb0 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
2ebc0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2ebd0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
2ebe0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
2ebf0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
2ec00 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
2ec10 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
2ec20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
2ec30 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
2ec40 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
2ec50 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
2ec60 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
2ec70 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
2ec80 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
2ec90 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
2eca0 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
2ecb0 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
2ecc0 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ece0 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
2ecf0 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
2ed00 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
2ed10 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
2ed20 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
2ed30 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
2ed40 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
2ed50 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
2ed60 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
2ed70 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
2ed80 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
2ed90 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
2eda0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
2edb0 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
2edc0 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
2edd0 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
2ede0 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
2edf0 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
2ee00 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
2ee10 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
2ee20 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
2ee30 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
2ee40 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
2ee50 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
2ee60 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
2ee70 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
2ee80 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
2ee90 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2eea0 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
2eeb0 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
2eec0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
2eed0 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
2eee0 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
2eef0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2ef00 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
2ef10 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
2ef20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
2ef30 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
2ef40 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
2ef50 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
2ef60 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
2ef70 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
2ef80 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
2ef90 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
2efa0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2efb0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
2efc0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
2efd0 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
2efe0 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
2eff0 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
2f000 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
2f010 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
2f020 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
2f030 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
2f040 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
2f050 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
2f060 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
2f070 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
2f080 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
2f090 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
2f0a0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
2f0b0 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
2f0c0 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
2f0d0 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
2f0e0 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
2f0f0 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
2f100 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
2f110 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
2f120 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
2f130 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
2f140 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2f150 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
2f160 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
2f170 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
2f180 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
2f190 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
2f1a0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
2f1b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f  !=0 );.  if( nLo
2f1c0 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
2f1d0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
2f1e0 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
2f1f0 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
2f200 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
2f210 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
2f220 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
2f230 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
2f240 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
2f250 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
2f260 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
2f270 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
2f280 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
2f290 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f2a0 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
2f2b0 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
2f2c0 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
2f2d0 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
2f2e0 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f   ready = 0;.  fo
2f2f0 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
2f300 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
2f310 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
2f320 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
2f330 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
2f340 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
2f350 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2f360 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c  ;.    pLoop = iL
2f370 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74  oop<nLoop ? pPat
2f380 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20  h->aLoop[iLoop] 
2f390 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28  : pLast;.    if(
2f3a0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
2f3b0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2f3c0 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ABLE ){.      if
2f3d0 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  ( pLoop->u.vtab.
2f3e0 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61  isOrdered ) obSa
2f3f0 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20  t = obDone;.    
2f400 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2f410 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
2f420 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2f430 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
2f440 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
2f450 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
2f460 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
2f470 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
2f480 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
2f490 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
2f4a0 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
2f4b0 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
2f4c0 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
2f4d0 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
2f4e0 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
2f4f0 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
2f500 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
2f510 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
2f520 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2f530 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2f540 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
2f550 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
2f560 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2f570 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
2f580 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2f590 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2f5a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
2f5b0 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
2f5c0 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
2f5d0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
2f5e0 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
2f5f0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
2f600 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
2f610 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e  ndTerm(&pWInfo->
2f620 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78  sWC, iCur, pOBEx
2f630 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f650 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45      ~ready, WO_E
2f660 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b  Q|WO_ISNULL, 0);
2f670 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
2f680 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2f690 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2f6a0 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45  ->eOperator&WO_E
2f6b0 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  Q)!=0 && pOBExpr
2f6c0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
2f6d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2f6e0 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20  ar *z1, *z2;.   
2f6f0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2f700 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2f710 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2f720 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2f730 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
2f740 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
2f750 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
2f760 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  l;.        z1 = 
2f770 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
2f780 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2f790 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2f7a0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2f7b0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
2f7c0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2f7d0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2f7e0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2f7f0 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e      z2 = pColl->
2f800 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
2f810 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2f820 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63  p(z1, z2)!=0 ) c
2f830 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2f840 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20  .      obSat |= 
2f850 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
2f860 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  }..    if( (pLoo
2f870 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2f880 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b  RE_ONEROW)==0 ){
2f890 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
2f8a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2f8b0 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20  E_IPK ){.       
2f8c0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
2f8d0 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30       nKeyCol = 0
2f8e0 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
2f8f0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 1;.      }el
2f900 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d  se if( (pIndex =
2f910 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2f920 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49  pIndex)==0 || pI
2f930 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
2f940 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2f950 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
2f960 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43  e{.        nKeyC
2f970 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  ol = pIndex->nKe
2f980 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43  yCol;.        nC
2f990 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
2f9a0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  nColumn;.       
2f9b0 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
2f9c0 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21  ==nKeyCol+1 || !
2f9d0 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
2f9e0 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20  >pTable) );.    
2f9f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
2fa00 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  ex->aiColumn[nCo
2fa10 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c  lumn-1]==(-1) ||
2fa20 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65   !HasRowid(pInde
2fa30 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20  x->pTable));.   
2fa40 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2fa50 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  inct = pIndex->o
2fa60 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
2fa70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2fa80 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
2fa90 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
2faa0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
2fab0 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
2fac0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
2fad0 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
2fae0 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
2faf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
2fb00 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
2fb10 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
2fb20 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
2fb30 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
2fb40 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
2fb50 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f     u8 bOnce;   /
2fb60 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68  * True to run th
2fb70 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63  e ORDER BY searc
2fb80 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20  h loop */..     
2fb90 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20     /* Skip over 
2fba0 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74  == and IS NULL t
2fbb0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  erms */.        
2fbc0 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62  if( j<pLoop->u.b
2fbd0 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
2fbe0 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
2fbf0 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20  ree.nSkip==0.   
2fc00 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70        && ((i = p
2fc10 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d  Loop->aLTerm[j]-
2fc20 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57  >eOperator) & (W
2fc30 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29  O_EQ|WO_ISNULL))
2fc40 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
2fc50 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26           if( i &
2fc60 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
2fc70 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2fc80 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
2fc90 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
2fca0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2fcb0 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2fcc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
2fcd0 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
2fce0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2fcf0 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
2fd00 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
2fd10 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
2fd20 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
2fd30 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
2fd40 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
2fd50 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
2fd60 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2fd70 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20       if( pIndex 
2fd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ){.          iCo
2fd90 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
2fda0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
2fdb0 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
2fdc0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
2fdd0 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
2fde0 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
2fdf0 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
2fe00 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
2fe10 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2fe20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
2fe30 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2fe40 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
2fe50 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2fe60 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
2fe70 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
2fe80 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
2fe90 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
2fea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
2feb0 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
2fec0 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
2fed0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2fee0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2fef0 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
2ff00 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
2ff10 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
2ff20 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
2ff30 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
2ff40 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
2ff50 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
2ff60 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2ff70 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2ff80 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2ff90 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
2ffa0 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
2ffb0 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
2ffc0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
2ffd0 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
2ffe0 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
2fff0 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  x and mark that 
30000 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
30010 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
30020 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b        bOnce = 1;
30030 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68  .        isMatch
30040 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
30050 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20  r(i=0; bOnce && 
30060 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
30070 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
30080 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
30090 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
300a0 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72           pOBExpr
300b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
300c0 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
300d0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
300e0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
300f0 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
30100 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
30110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
30120 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
30130 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
30140 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  CTBY );.        
30150 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
30160 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50  s & (WHERE_GROUP
30170 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43  BY|WHERE_DISTINC
30180 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65  TBY))==0 ) bOnce
30190 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
301a0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
301b0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
301c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
301d0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
301e0 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
301f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
30200 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
30210 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
30220 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30230 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
30240 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
30250 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
30260 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
30270 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
30280 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
30290 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
302a0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
302b0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
302c0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
302d0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
302e0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
302f0 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
30300 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
30310 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
30320 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
30330 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
30340 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
30350 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
30360 4d 61 74 63 68 20 26 26 20 28 70 57 49 6e 66 6f  Match && (pWInfo
30370 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
30380 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
30390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
303a0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
303b0 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
303c0 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
303d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
303e0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
303f0 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
30400 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
30410 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
30420 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
30430 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
30440 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
30450 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
30460 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
30470 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20  ) isMatch = 0;. 
30480 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
30490 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
304a0 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
304b0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
304c0 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
304d0 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
304e0 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
304f0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
30500 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
30510 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
30530 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
30540 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
30550 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
30560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69      testcase( di
30570 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30  stinctColumns==0
30580 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
30590 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
305a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
305b0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
305c0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
305d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
305e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d           /* No m
305f0 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  atch found */.  
30600 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
30610 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b   || j<nKeyCol ){
30620 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
30630 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
30640 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20  stinct!=0 );.   
30650 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
30660 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
30670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30680 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
30690 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
306a0 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
306b0 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
306c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
306d0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a  tinctColumns ){.
306e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
306f0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
30700 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
30710 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
30720 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
30730 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
30740 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
30750 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
30760 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
30770 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
30780 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
30790 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
307a0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
307b0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
307c0 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
307d0 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
307e0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
307f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
30800 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42  pr *p;.        B
30810 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20  itmask mTerm;.  
30820 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
30830 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
30840 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
30850 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
30860 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
30870 20 20 20 6d 54 65 72 6d 20 3d 20 65 78 70 72 54     mTerm = exprT
30880 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66  ableUsage(&pWInf
30890 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a  o->sMaskSet,p);.
308a0 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72          if( mTer
308b0 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  m==0 && !sqlite3
308c0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
308d0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
308e0 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d        if( (mTerm
308f0 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
30900 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
30910 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
30920 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
30930 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30940 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
30950 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
30960 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
30970 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
30980 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
30990 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
309a0 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38  one ) return (i8
309b0 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  )nOrderBy;.  if(
309c0 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
309d0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  t ){.    for(i=n
309e0 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20  OrderBy-1; i>0; 
309f0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i--){.      Bitm
30a00 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28  ask m = MASKBIT(
30a10 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66  i) - 1;.      if
30a20 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29  ( (obSat&m)==m )
30a30 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
30a40 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
30a50 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
30a60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
30a70 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
30a80 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68  lag is set in th
30a90 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f  e mask passed to
30aa0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
30ab0 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61  in(),.** the pla
30ac0 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61  nner assumes tha
30ad0 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
30ae0 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73  pOrderBy list is
30af0 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55   actually a GROU
30b00 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d  P.** BY clause -
30b10 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65   and so any orde
30b20 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f  r that groups ro
30b30 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73  ws as required s
30b40 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20  atisfies the.** 
30b50 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e  request..**.** N
30b60 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73  ormally, in this
30b70 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
30b80 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
30b90 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72   caller to deter
30ba0 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
30bb0 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20  or not the rows 
30bc0 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67  are really being
30bd0 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f   delivered in so
30be0 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a  rted order, or.*
30bf0 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f  * just in some o
30c00 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20  ther order that 
30c10 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71  provides the req
30c20 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20  uired grouping. 
30c30 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74  However,.** if t
30c40 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47  he WHERE_SORTBYG
30c50 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73  ROUP flag is als
30c60 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  o passed to sqli
30c70 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
30c80 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   then.** this fu
30c90 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
30ca0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75  lled on the retu
30cb0 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f  rned WhereInfo o
30cc0 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e  bject. It return
30cd0 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  s.** true if the
30ce0 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c   rows really wil
30cf0 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74  l be sorted in t
30d00 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64  he specified ord
30d10 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20  er, or false.** 
30d20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
30d30 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
30d40 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  suming:.**.**   
30d50 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
30d60 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a  ON t1(x, Y);.**.
30d70 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20  ** then.**.**   
30d80 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
30d90 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52   GROUP BY x,y OR
30da0 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d  DER BY x,y;   --
30db0 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a   IsSorted()==1.*
30dc0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
30dd0 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c  M t1 GROUP BY y,
30de0 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20  x ORDER BY y,x; 
30df0 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
30e00 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  =0.*/.int sqlite
30e10 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57  3WhereIsSorted(W
30e20 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
30e30 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ){.  assert( pWI
30e40 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
30e50 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
30e60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  );.  assert( pWI
30e70 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
30e80 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
30e90 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OUP );.  return 
30ea0 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a  pWInfo->sorted;.
30eb0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
30ec0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
30ed0 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
30ee0 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
30ef0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
30f00 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
30f10 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
30f20 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
30f30 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
30f40 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
30f50 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
30f60 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
30f70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
30f80 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
30f90 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
30fa0 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
30fb0 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
30fc0 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
30fd0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
30fe0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
30ff0 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
31000 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
31010 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d  jects at pWInfo-
31020 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
31030 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
31040 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
31050 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
31060 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
31070 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
31080 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
31090 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
310a0 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
310b0 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
310c0 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68  .**.** Assume th
310d0 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  at the total num
310e0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
310f0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65  ws that will nee
31100 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a  d to be sorted.*
31110 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73  * will be nRowEs
31120 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67  t (in the 10*log
31130 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  2 representation
31140 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73  ).  Or, ignore s
31150 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20  orting.** costs 
31160 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a  if nRowEst==0..*
31170 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
31180 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
31190 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
311a0 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   of a memory all
311b0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72  ocation.** error
311c0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
311d0 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
311e0 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f  Solver(WhereInfo
311f0 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74   *pWInfo, LogEst
31200 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74   nRowEst){.  int
31210 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20   mxChoice;      
31220 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
31230 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  m number of simu
31240 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74  ltaneous paths t
31250 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racked */.  int 
31260 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nLoop;          
31270 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
31280 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
31290 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20  join */.  Parse 
312a0 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
312b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
312c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
312d0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
312e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
312f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
31300 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
31310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31320 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
31330 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  over the terms o
31340 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
31350 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20  int ii, jj;     
31360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
31370 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
31380 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20  int mxI = 0;    
31390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
313a0 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79  ex of next entry
313b0 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20   to replace */. 
313c0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
313d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
313e0 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
313f0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f   clause terms */
31400 0a 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b  .  LogEst rCost;
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31420 43 6f 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a  Cost of a path *
31430 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b  /.  LogEst nOut;
31440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31450 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   Number of outpu
31460 74 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  ts */.  LogEst m
31470 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20  xCost = 0;      
31480 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
31490 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
314a0 74 68 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ths */.  int nTo
314b0 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  , nFrom;        
314c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
314d0 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e  valid entries in
314e0 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d   aTo[] and aFrom
314f0 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  [] */.  WherePat
31500 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *aFrom;       
31510 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70    /* All nFrom p
31520 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76  aths at the prev
31530 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  ious level */.  
31540 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20  WherePath *aTo; 
31550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31560 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20   nTo best paths 
31570 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
31580 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
31590 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20  ath *pFrom;     
315a0 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
315b0 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61  t of aFrom[] tha
315c0 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
315d0 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61   on */.  WherePa
315e0 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20  th *pTo;        
315f0 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
31600 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77   of aTo[] that w
31610 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
31620 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
31630 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  *pWLoop;        
31640 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68  /* One of the Wh
31650 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
31660 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
31670 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *pX;           /
31680 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75  * Used to divy u
31690 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d  p the pSpace mem
316a0 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ory */.  char *p
316b0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
316c0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
316d0 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
316e0 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a  his routine */..
316f0 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
31700 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
31710 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
31720 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nLoop = pWInfo->
31730 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e  nLevel;.  /* TUN
31740 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20  ING: For simple 
31750 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68  queries, only th
31760 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74  e best path is t
31770 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  racked..  ** For
31780 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68   2-way joins, th
31790 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61  e 5 best paths a
317a0 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a  re followed..  *
317b0 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33  * For joins of 3
317c0 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c   or more tables,
317d0 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65   track the 10 be
317e0 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78  st paths */.  mx
317f0 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c  Choice = (nLoop<
31800 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70  =1) ? 1 : (nLoop
31810 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20  ==2 ? 5 : 10);. 
31820 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d   assert( nLoop<=
31830 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
31840 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52  ->nSrc );.  WHER
31850 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22  ETRACE(0x002, ("
31860 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65  ---- begin solve
31870 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c  r\n"));..  /* Al
31880 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
31890 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20  alize space for 
318a0 61 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f  aTo and aFrom */
318b0 0a 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28  .  ii = (sizeof(
318c0 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
318d0 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
318e0 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
318f0 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69  .  pSpace = sqli
31900 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
31910 62 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53  b, ii);.  if( pS
31920 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
31930 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
31940 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
31950 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
31960 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
31970 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
31980 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
31990 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
319a0 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
319b0 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
319c0 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
319d0 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
319e0 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
319f0 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
31a00 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
31a10 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20  op = pX;.  }..  
31a20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72  /* Seed the sear
31a30 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ch with a single
31a40 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61   WherePath conta
31a50 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65  ining zero Where
31a60 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Loops..  **.  **
31a70 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20   TUNING: Do not 
31a80 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  let the number o
31a90 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20  f iterations go 
31aa0 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68  above 25.  If th
31ab0 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63  e cost.  ** of c
31ac0 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f  omputing an auto
31ad0 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e  matic index is n
31ae0 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74  ot paid back wit
31af0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 35  hin the first 25
31b00 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e  .  ** rows, then
31b10 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
31b20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
31b30 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
31b40 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65  Row = MIN(pParse
31b50 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36  ->nQueryLoop, 46
31b60 29 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  );  assert( 46==
31b70 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
31b80 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
31b90 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75  ;..  /* Precompu
31ba0 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  te the cost of s
31bb0 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  orting the final
31bc0 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20   result set, if 
31bd0 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
31be0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
31bf0 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65  egin() was conce
31c00 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69  rned about sorti
31c10 6e 67 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  ng */.  if( pWIn
31c20 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
31c30 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b  || nRowEst==0 ){
31c40 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  .    aFrom[0].is
31c50 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20  Ordered = 0;.   
31c60 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
31c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 46 72 6f   }else{.    aFro
31c80 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d  m[0].isOrdered =
31c90 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20   nLoop>0 ? -1 : 
31ca0 31 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  1;.    nOrderBy 
31cb0 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  = pWInfo->pOrder
31cc0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a  By->nExpr;.  }..
31cd0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63    /* Compute suc
31ce0 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72  cessively longer
31cf0 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e   WherePaths usin
31d00 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67  g the previous g
31d10 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f  eneration.  ** o
31d20 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20  f WherePaths as 
31d30 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68  the basis for th
31d40 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72  e next.  Keep tr
31d50 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  ack of the mxCho
31d60 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61  ice.  ** best pa
31d70 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65  ths at each gene
31d80 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  ration */.  for(
31d90 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e  iLoop=0; iLoop<n
31da0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
31db0 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20      nTo = 0;.   
31dc0 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d   for(ii=0, pFrom
31dd0 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d  =aFrom; ii<nFrom
31de0 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  ; ii++, pFrom++)
31df0 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f  {.      for(pWLo
31e00 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  op=pWInfo->pLoop
31e10 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f  s; pWLoop; pWLoo
31e20 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c  p=pWLoop->pNextL
31e30 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69  oop){.        Bi
31e40 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20  tmask maskNew;. 
31e50 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72         Bitmask r
31e60 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
31e70 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65 64      i8 isOrdered
31e80 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
31e90 72 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  red;.        if(
31ea0 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   (pWLoop->prereq
31eb0 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c   & ~pFrom->maskL
31ec0 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
31ed0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
31ee0 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  (pWLoop->maskSel
31ef0 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  f & pFrom->maskL
31f00 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
31f10 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  ue;.        /* A
31f20 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57  t this point, pW
31f30 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64  Loop is a candid
31f40 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65  ate to be the ne
31f50 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20  xt loop. .      
31f60 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73    ** Compute its
31f70 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20   cost */.       
31f80 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   rCost = sqlite3
31f90 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70  LogEstAdd(pWLoop
31fa0 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d  ->rSetup,pWLoop-
31fb0 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e  >rRun + pFrom->n
31fc0 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 43  Row);.        rC
31fd0 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ost = sqlite3Log
31fe0 45 73 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46  EstAdd(rCost, pF
31ff0 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20  rom->rCost);.   
32000 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f       nOut = pFro
32010 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70  m->nRow + pWLoop
32020 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  ->nOut;.        
32030 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d  maskNew = pFrom-
32040 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
32050 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
32060 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
32070 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  red<0 ){.       
32080 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77     isOrdered = w
32090 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
320a0 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
320b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
320c0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
320d0 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c  pOrderBy, pFrom,
320e0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
320f0 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
32100 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f              iLoo
32110 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d  p, pWLoop, &revM
32120 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ask);.          
32130 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30  if( isOrdered>=0
32140 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f   && isOrdered<nO
32150 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
32160 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
32170 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   Estimated cost 
32180 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e  of a full extern
32190 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e  al sort, where N
321a0 20 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 20   is .           
321b0 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
321c0 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69  f rows to sort i
321d0 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s:.            *
321e0 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
321f0 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
32200 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20   N * log(N))..  
32210 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20            ** .  
32220 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c            ** Or,
32230 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   if the order-by
32240 20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65   clause has X te
32250 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65  rms but only the
32260 20 6c 61 73 74 20 59 20 0a 20 20 20 20 20 20 20   last Y .       
32270 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 61 72       ** terms ar
32280 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20  e out of order, 
32290 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69  then block-sorti
322a0 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74  ng will reduce t
322b0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
322c0 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20  ** sorting cost 
322d0 74 6f 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  to:.            
322e0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
322f0 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20  *   cost = (3.0 
32300 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20  * N * log(N)) * 
32310 28 59 2f 58 29 0a 20 20 20 20 20 20 20 20 20 20  (Y/X).          
32320 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
32330 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65   ** The (Y/X) te
32340 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  rm is implemente
32350 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61  d using stack va
32360 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20  riable rScale.  
32370 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 6c            ** bel
32380 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ow.  */.        
32390 20 20 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c      LogEst rScal
323a0 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20  e, rSortCost;.  
323b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
323c0 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20  ( nOrderBy>0 && 
323d0 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  66==sqlite3LogEs
323e0 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20  t(100) );.      
323f0 20 20 20 20 20 20 72 53 63 61 6c 65 20 3d 20 73        rScale = s
32400 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f  qlite3LogEst((nO
32410 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64  rderBy-isOrdered
32420 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20  )*100/nOrderBy) 
32430 2d 20 36 36 3b 0a 20 20 20 20 20 20 20 20 20 20  - 66;.          
32440 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52    rSortCost = nR
32450 6f 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e  owEst + estLog(n
32460 52 6f 77 45 73 74 29 20 2b 20 72 53 63 61 6c 65  RowEst) + rScale
32470 20 2b 20 31 36 3b 0a 0a 20 20 20 20 20 20 20 20   + 16;..        
32480 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54      /* TUNING: T
32490 68 65 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65  he cost of imple
324a0 6d 65 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54  menting DISTINCT
324b0 20 75 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20   using a B-TREE 
324c0 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  is.            *
324d0 2a 20 73 69 6d 69 6c 61 72 20 62 75 74 20 77 69  * similar but wi
324e0 74 68 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73  th a larger cons
324f0 74 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69  tant of proporti
32500 6f 6e 61 6c 69 74 79 2e 20 0a 20 20 20 20 20 20  onality. .      
32510 20 20 20 20 20 20 2a 2a 20 4d 75 6c 74 69 70 6c        ** Multipl
32520 79 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  y by an addition
32530 61 6c 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30  al factor of 3.0
32540 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
32550 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
32560 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
32570 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
32580 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32590 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36 3b  rSortCost += 16;
325a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
325b0 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
325c0 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20  TRACE(0x002,.   
325d0 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d              ("--
325e0 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33  -- sort cost=%-3
325f0 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61  d (%d/%d) increa
32600 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20  ses cost %3d to 
32610 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %-3d\n",.       
32620 20 20 20 20 20 20 20 20 20 72 53 6f 72 74 43 6f           rSortCo
32630 73 74 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73  st, (nOrderBy-is
32640 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72  Ordered), nOrder
32650 42 79 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  By, rCost,.     
32660 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
32670 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73  e3LogEstAdd(rCos
32680 74 2c 72 53 6f 72 74 43 6f 73 74 29 29 29 3b 0a  t,rSortCost)));.
32690 20 20 20 20 20 20 20 20 20 20 20 20 72 43 6f 73              rCos
326a0 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
326b0 74 41 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72  tAdd(rCost, rSor
326c0 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tCost);.        
326d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
326e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  e{.          rev
326f0 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
32700 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  vLoop;.        }
32710 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
32720 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
32730 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
32740 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f 69  ed to the mxChoi
32750 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  ce best so far *
32760 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
32770 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
32780 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
32790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
327a0 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
327b0 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20  maskNew.        
327c0 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f     && ((pTo->isO
327d0 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
327e0 29 26 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  )&80)==0.       
327f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
32800 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d    testcase( jj==
32810 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  nTo-1 );.       
32820 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32840 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a  }.        if( jj
32850 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20  >=nTo ){.       
32860 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
32870 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d  oice && rCost>=m
32880 78 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  xCost ){.#ifdef 
32890 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
328a0 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
328b0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
328c0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
328d0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
328e0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
328f0 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25  Printf("Skip   %
32900 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
32910 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
32920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
32930 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
32940 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
32950 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
32960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32970 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
32980 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
32990 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
329a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
329b0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
329c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
329d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
329e0 61 20 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68  a new Path to th
329f0 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20  e aTo[] set */. 
32a00 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
32a10 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  <mxChoice ){.   
32a20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
32a30 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
32a40 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20   the aTo set by 
32a50 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  one */.         
32a60 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20     jj = nTo++;. 
32a70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
32a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32a90 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73  ew path replaces
32aa0 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74   the prior worst
32ab0 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62   to keep count b
32ac0 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f  elow mxChoice */
32ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
32ae0 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20  = mxI;.         
32af0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f   }.          pTo
32b00 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66   = &aTo[jj];.#if
32b10 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
32b20 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
32b30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
32b40 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
32b50 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
32b60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32b70 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25  Printf("New    %
32b80 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
32b90 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
32ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
32bb0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
32bc0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
32bd0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
32be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
32bf0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
32c00 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
32c10 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
32c20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
32c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
32c40 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d  if( pTo->rCost<=
32c50 72 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  rCost ){.#ifdef 
32c60 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
32c70 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
32c80 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
32c90 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
32ca0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
32cb0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
32cc0 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
32cd0 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20            "Skip 
32ce0 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
32cf0 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
32d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d10 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
32d20 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
32d30 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
32d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32d50 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
32d60 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
32d70 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
32d80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
32d90 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73  bugPrintf("   vs
32da0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64   %s cost=%-3d,%d
32db0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
32dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dd0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
32de0 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
32df0 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
32e00 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
32e10 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
32e20 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f  Ordered>=0 ? pTo
32e30 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ->isOrdered+'0' 
32e40 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
32e50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
32e60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
32e70 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
32e80 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Cost );.        
32e90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
32ea0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32eb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
32ec0 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b  o->rCost==rCost+
32ed0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 );.          /
32ee0 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74  * A new and bett
32ef0 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70  er score for a p
32f00 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65  reviously create
32f10 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74  d equivalent pat
32f20 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  h */.#ifdef WHER
32f30 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
32f40 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
32f50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
32f60 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
32f70 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32f80 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
32f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fa0 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d  "Update %s cost=
32fb0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
32fc0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
32fd0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
32fe0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
32ff0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
33000 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
33010 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
33020 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
33030 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
33040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
33050 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73  bugPrintf("  was
33060 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
33070 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
33080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
33090 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
330a0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
330b0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
330c0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
330d0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
330e0 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
330f0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
33100 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
33110 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
33120 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
33130 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
33140 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
33150 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
33160 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
33170 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
33180 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
33190 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
331a0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
331b0 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
331c0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
331d0 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
331e0 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
331f0 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
33200 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
33210 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
33220 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
33230 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
33240 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
33250 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
33260 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
33270 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
33280 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
33290 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
332a0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d  .          mxI =
332b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   0;.          mx
332c0 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43  Cost = aTo[0].rC
332d0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ost;.          f
332e0 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54  or(jj=1, pTo=&aT
332f0 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63  o[1]; jj<mxChoic
33300 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  e; jj++, pTo++){
33310 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
33320 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f   pTo->rCost>mxCo
33330 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
33340 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f      mxCost = pTo
33350 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ->rCost;.       
33360 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b         mxI = jj;
33370 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
33380 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33390 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
333a0 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45   }..#ifdef WHERE
333b0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f  TRACE_ENABLED  /
333c0 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28  * >=2 */.    if(
333d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
333e0 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  ce>=2 ){.      s
333f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
33400 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f  f("---- after ro
33410 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20  und %d ----\n", 
33420 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f  iLoop);.      fo
33430 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(ii=0, pTo=aTo;
33440 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70   ii<nTo; ii++, p
33450 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  To++){.        s
33460 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
33470 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  f(" %s cost=%-3d
33480 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72   nrow=%-3d order
33490 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
334a0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
334b0 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
334c0 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
334d0 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
334e0 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
334f0 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  d>=0 ? (pTo->isO
33500 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f  rdered+'0') : '?
33510 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
33520 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30  pTo->isOrdered>0
33530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
33540 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
33550 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
33560 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
33570 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
33580 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33590 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
335a0 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
335b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
335c0 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
335d0 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
335e0 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
335f0 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
33600 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
33610 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
33620 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
33630 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
33640 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
33650 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
33660 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
33670 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
33680 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f  no query solutio
33690 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
336a0 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
336b0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
336c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
336d0 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  .  .  /* Find th
336e0 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
336f0 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20  th.  pFrom will 
33700 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
33710 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f   to that path */
33720 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d  .  pFrom = aFrom
33730 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
33740 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20  <nFrom; ii++){. 
33750 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43     if( pFrom->rC
33760 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43  ost>aFrom[ii].rC
33770 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61  ost ) pFrom = &a
33780 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20  From[ii];.  }.  
33790 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
337a0 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b  nLevel==nLoop );
337b0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c  .  /* Load the l
337c0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
337d0 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20  into pWInfo */. 
337e0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
337f0 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
33800 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65  ++){.    WhereLe
33810 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57  vel *pLevel = pW
33820 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b  Info->a + iLoop;
33830 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  .    pLevel->pWL
33840 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70  oop = pWLoop = p
33850 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  From->aLoop[iLoo
33860 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  p];.    pLevel->
33870 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e  iFrom = pWLoop->
33880 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iTab;.    pLevel
33890 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e  ->iTabCur = pWIn
338a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
338b0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
338c0 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  Cursor;.  }.  if
338d0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
338e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
338f0 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a  NT_DISTINCT)!=0.
33900 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
33910 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
33920 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30  E_DISTINCTBY)==0
33930 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  .   && pWInfo->e
33940 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
33950 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20  DISTINCT_NOOP.  
33960 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b   && nRowEst.  ){
33970 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  .    Bitmask not
33980 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  Used;.    int rc
33990 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
339a0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
339b0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65  nfo, pWInfo->pRe
339c0 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a  sultSet, pFrom,.
339d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339e0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
339f0 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  Y, nLoop-1, pFro
33a00 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
33a10 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  ], &notUsed);.  
33a20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f    if( rc==pWInfo
33a30 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45  ->pResultSet->nE
33a40 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49  xpr ){.      pWI
33a50 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
33a60 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
33a70 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20  ORDERED;.    }. 
33a80 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
33a90 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
33aa0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
33ab0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
33ac0 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20  DISTINCTBY ){.  
33ad0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69      if( pFrom->i
33ae0 73 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f  sOrdered==pWInfo
33af0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
33b00 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49  r ){.        pWI
33b10 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
33b20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
33b30 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d  ORDERED;.      }
33b40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33b50 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
33b60 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
33b70 72 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  red;.      if( p
33b80 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20  WInfo->nOBSat<0 
33b90 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ) pWInfo->nOBSat
33ba0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e   = 0;.      pWIn
33bb0 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46  fo->revMask = pF
33bc0 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
33bd0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49    }.    if( (pWI
33be0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
33bf0 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
33c00 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20  OUP).        && 
33c10 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d  pWInfo->nOBSat==
33c20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
33c30 2d 3e 6e 45 78 70 72 0a 20 20 20 20 29 7b 0a 20  ->nExpr.    ){. 
33c40 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74       Bitmask not
33c50 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  Used = 0;.      
33c60 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65  int nOrder = whe
33c70 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
33c80 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
33c90 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
33ca0 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
33cb0 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  m, 0, nLoop-1, p
33cc0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
33cd0 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 0a 20  p-1], &notUsed. 
33ce0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
33cf0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f  sert( pWInfo->so
33d00 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rted==0 );.     
33d10 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20   pWInfo->sorted 
33d20 3d 20 28 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66  = (nOrder==pWInf
33d30 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
33d40 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
33d50 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
33d60 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
33d70 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
33d80 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
33d90 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
33da0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
33db0 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
33dc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33dd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
33de0 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f  st queries use o
33df0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
33e00 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74  le (they are not
33e10 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65   joins) and have
33e20 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f  .** simple == co
33e30 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73  nstraints agains
33e40 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73  t indexed fields
33e50 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
33e60 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70  attempts.** to p
33e70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65  lan those simple
33e80 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63   cases using muc
33e90 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20  h less ceremony 
33ea0 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65  than the.** gene
33eb0 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
33ec0 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74  y planner, and t
33ed0 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73  hereby yield fas
33ee0 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ter sqlite3_prep
33ef0 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66  are().** times f
33f00 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
33f10 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  se..**.** Return
33f20 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63   non-zero on suc
33f30 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75  cess, if this qu
33f40 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c  ery can be handl
33f50 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f  ed by this.** no
33f60 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c  -frills query pl
33f70 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a  anner.  Return z
33f80 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72  ero if this quer
33f90 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20  y needs the .** 
33fa0 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
33fb0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a  query planner..*
33fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
33fd0 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65  reShortCut(Where
33fe0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
33ff0 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
34000 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73  nfo *pWInfo;.  s
34010 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
34020 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65  em *pItem;.  Whe
34030 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
34040 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
34050 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  m;.  WhereLoop *
34060 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75  pLoop;.  int iCu
34070 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61  r;.  int j;.  Ta
34080 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
34090 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70  ex *pIdx;.  .  p
340a0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
340b0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20  ->pWInfo;.  if( 
340c0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
340d0 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45  gs & WHERE_FORCE
340e0 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20  _TABLE ) return 
340f0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  0;.  assert( pWI
34100 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
34110 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65  Src>=1 );.  pIte
34120 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
34130 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20  List->a;.  pTab 
34140 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
34150 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
34160 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
34170 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49  .  if( pItem->zI
34180 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20 30 3b  ndex ) return 0;
34190 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
341a0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20  >iCursor;.  pWC 
341b0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
341c0 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64    pLoop = pBuild
341d0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f  er->pNew;.  pLoo
341e0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
341f0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
34200 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54  .nSkip = 0;.  pT
34210 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
34220 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c  WC, iCur, -1, 0,
34230 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66   WO_EQ, 0);.  if
34240 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70  ( pTerm ){.    p
34250 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
34260 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
34270 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
34280 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f  ONEROW;.    pLoo
34290 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  p->aLTerm[0] = p
342a0 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  Term;.    pLoop-
342b0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
342c0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
342d0 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20  nEq = 1;.    /* 
342e0 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
342f0 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69  a rowid lookup i
34300 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f  s 10 */.    pLoo
34310 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f  p->rRun = 33;  /
34320 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  * 33==sqlite3Log
34330 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c  Est(10) */.  }el
34340 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  se{.    for(pIdx
34350 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
34360 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
34370 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
34380 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54  sert( pLoop->aLT
34390 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d  ermSpace==pLoop-
343a0 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  >aLTerm );.     
343b0 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
343c0 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ze(pLoop->aLTerm
343d0 53 70 61 63 65 29 3d 3d 34 20 29 3b 0a 20 20 20  Space)==4 );.   
343e0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
343f0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 0a 20  rror==OE_None . 
34400 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70        || pIdx->p
34410 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
34420 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
34430 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69  >nKeyCol>ArraySi
34440 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ze(pLoop->aLTerm
34450 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20  Space) .      ) 
34460 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
34470 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
34480 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
34490 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
344a0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
344b0 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ur, pIdx->aiColu
344c0 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c  mn[j], 0, WO_EQ,
344d0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
344e0 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
344f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 4c  reak;.        pL
34500 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d  oop->aLTerm[j] =
34510 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
34520 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64        if( j!=pId
34530 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
34540 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f  tinue;.      pLo
34550 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
34560 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
34570 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45  ERE_ONEROW|WHERE
34580 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
34590 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65  if( pIdx->isCove
345a0 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e  ring || (pItem->
345b0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
345c0 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29  nsInIndex(pIdx))
345d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
345e0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
345f0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
34600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
34610 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a  Loop->nLTerm = j
34620 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
34630 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a  .btree.nEq = j;.
34640 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
34650 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
34660 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  dx;.      /* TUN
34670 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75  ING: Cost of a u
34680 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b  nique index look
34690 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20  up is 15 */.    
346a0 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
346b0 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69  39;  /* 39==sqli
346c0 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f  te3LogEst(15) */
346d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
346e0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c    }.  }.  if( pL
346f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a  oop->wsFlags ){.
34700 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
34710 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20  = (LogEst)1;.   
34720 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
34730 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  Loop = pLoop;.  
34740 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c    pLoop->maskSel
34750 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49  f = getMask(&pWI
34760 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
34770 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  Cur);.    pWInfo
34780 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d  ->a[0].iTabCur =
34790 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66   iCur;.    pWInf
347a0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a  o->nRowOut = 1;.
347b0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
347c0 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
347d0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49  o->nOBSat =  pWI
347e0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
347f0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57  Expr;.    if( pW
34800 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
34810 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
34820 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
34830 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
34840 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
34850 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
34860 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
34870 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  EBUG.    pLoop->
34880 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69  cId = '0';.#endi
34890 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
348a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
348b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
348c0 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
348d0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
348e0 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
348f0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
34900 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
34910 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
34920 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
34930 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
34940 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
34950 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
34960 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
34970 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
34980 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
34990 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
349a0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
349b0 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
349c0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
349d0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
349e0 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
349f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
34a00 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
34a10 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
34a20 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
34a30 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
34a40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
34a50 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
34a60 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
34a70 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
34a80 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
34a90 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
34aa0 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
34ab0 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
34ac0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
34ad0 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
34ae0 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
34af0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
34b00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
34b10 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
34b20 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
34b30 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
34b40 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
34b50 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
34b60 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
34b70 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
34b80 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
34b90 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
34ba0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
34bb0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
34bc0 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
34bd0 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
34be0 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
34bf0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
34c00 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
34c10 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
34c20 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
34c30 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
34c40 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
34c50 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
34c60 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
34c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c80 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
34c90 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
34ca0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
34cb0 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
34cc0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
34cd0 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
34ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cf0 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
34d00 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
34d10 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
34d20 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
34d30 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
34d40 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
34d50 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
34d60 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
34d70 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
34d80 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
34d90 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
34da0 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
34db0 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
34dc0 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
34dd0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
34de0 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
34df0 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
34e00 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
34e10 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
34e20 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
34e30 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
34e40 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
34e50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
34e60 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
34e70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
34e80 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
34e90 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
34ea0 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
34eb0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
34ec0 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
34ed0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
34ee0 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
34ef0 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
34f00 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
34f10 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
34f20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
34f30 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
34f40 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
34f50 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
34f60 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
34f70 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
34f80 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
34f90 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
34fa0 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
34fb0 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
34fc0 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
34fd0 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
34fe0 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
34ff0 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
35000 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
35010 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
35020 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
35030 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
35040 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
35050 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
35060 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
35070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
35080 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
35090 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
350a0 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
350b0 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
350c0 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
350d0 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
350e0 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
350f0 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
35100 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
35110 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
35120 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
35130 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
35140 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
35150 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
35160 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
35170 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
35180 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
35190 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
351a0 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
351b0 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
351c0 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
351d0 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
351e0 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
351f0 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
35200 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
35210 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
35220 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
35230 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
35240 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
35250 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
35260 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
35270 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
35280 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
35290 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
352a0 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
352b0 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
352c0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
352d0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
352e0 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
352f0 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
35300 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
35310 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
35320 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
35330 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
35340 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
35350 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
35360 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
35370 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
35380 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
35390 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
353a0 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
353b0 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
353c0 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
353d0 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
353e0 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
353f0 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
35400 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
35410 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
35420 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
35430 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
35440 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
35450 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
35460 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
35470 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
35480 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
35490 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
354a0 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
354b0 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
354c0 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
354d0 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
354e0 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
354f0 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
35500 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
35510 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
35520 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
35530 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
35540 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
35550 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50  se (or the GROUP
35560 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66   BY clause.** if
35570 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
35580 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
35590 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66  n wctrlFlags) of
355a0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
355b0 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ent.** if there 
355c0 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
355d0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
355e0 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
355f0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
35600 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20   called from an 
35610 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
35620 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
35630 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c   pOrderBy is NUL
35640 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64  L..**.** The iId
35650 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69  xCur parameter i
35660 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
35670 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e  ber of an index.
35680 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f    If .** WHERE_O
35690 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20  NETABLE_ONLY is 
356a0 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73 20  set, iIdxCur is 
356b0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
356c0 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  r of an index.**
356d0 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63   to use for OR c
356e0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
356f0 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  .  The WHERE cla
35700 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74  use should use t
35710 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  his.** specific 
35720 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52  cursor.  If WHER
35730 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
35740 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69  D is set, then i
35750 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65  IdxCur is.** the
35760 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e   first cursor in
35770 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72   an array of cur
35780 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  sors for all ind
35790 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20 73  ices.  iIdxCur s
357a0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64  hould.** be used
357b0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
357c0 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72 73  appropriate curs
357d0 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  or depending on 
357e0 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a  which index is.*
357f0 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  * used..*/.Where
35800 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
35810 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
35820 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
35830 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
35840 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
35850 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
35860 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
35870 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  : A list of all 
35880 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
35890 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
358a0 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
358b0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
358c0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
358d0 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
358e0 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f  * An ORDER BY (o
358f0 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
35900 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
35910 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75   ExprList *pResu
35920 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74  ltSet, /* Result
35930 20 73 65 74 20 6f 66 20 74 68 65 20 71 75 65 72   set of the quer
35940 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  y */.  u16 wctrl
35950 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
35960 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
35970 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
35980 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
35990 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
359a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
359b0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
359c0 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64  ONLY is set, ind
359d0 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ex cursor number
359e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
359f0 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  teWInfo;        
35a00 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65      /* Num. byte
35a10 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
35a20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
35a30 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69   */.  int nTabLi
35a40 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
35a50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
35a60 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69  ements in pTabLi
35a70 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  st */.  WhereInf
35a80 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
35a90 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
35aa0 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
35ab0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
35ac0 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
35ad0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
35ae0 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
35af0 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
35b00 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
35b10 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
35b20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
35b30 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
35b40 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
35b50 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
35b60 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65  sWLB;     /* The
35b70 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64   WhereLoop build
35b80 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  er */.  WhereMas
35b90 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
35ba0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
35bb0 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
35bc0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
35bd0 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a  Level;        /*
35be0 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
35bf0 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a  in pWInfo->a[] *
35c00 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
35c10 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  Loop;          /
35c20 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * Pointer to a s
35c30 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20  ingle WhereLoop 
35c40 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
35c50 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
35c60 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
35c70 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ounter */.  sqli
35c80 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
35c90 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
35ca0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
35cb0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
35cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35cd0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35ce0 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20  ..  /* Variable 
35cf0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
35d00 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
35d10 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  >db;.  memset(&s
35d20 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  WLB, 0, sizeof(s
35d30 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20  WLB));..  /* An 
35d40 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63  ORDER/GROUP BY c
35d50 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68  lause of more th
35d60 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e  an 63 terms cann
35d70 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ot be optimized 
35d80 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
35d90 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
35da0 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d  rBy->nExpr==BMS-
35db0 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  1 );.  if( pOrde
35dc0 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
35dd0 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f  >nExpr>=BMS ) pO
35de0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57  rderBy = 0;.  sW
35df0 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
35e00 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69  rderBy;..  /* Di
35e10 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e  sable the DISTIN
35e20 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CT optimization 
35e30 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  if SQLITE_Distin
35e40 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61  ctOpt is set via
35e50 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  .  ** sqlite3_te
35e60 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54  st_ctrl(SQLITE_T
35e70 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
35e80 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20  TIONS,...) */.  
35e90 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
35ea0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
35eb0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29  ITE_DistinctOpt)
35ec0 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   ){.    wctrlFla
35ed0 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e  gs &= ~WHERE_WAN
35ee0 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a  T_DISTINCT;.  }.
35ef0 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
35f00 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
35f10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
35f20 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
35f30 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
35f40 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
35f50 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
35f60 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
35f70 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
35f80 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
35f90 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
35fa0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
35fb0 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
35fc0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
35fd0 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
35fe0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
35ff0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
36000 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
36010 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
36020 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
36030 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
36040 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
36050 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
36060 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
36070 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  n we should.  **
36080 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63   only generate c
36090 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ode for the firs
360a0 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  t table in pTabL
360b0 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ist and assume t
360c0 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72  hat.  ** any cur
360d0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
360e0 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20  with subsequent 
360f0 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69  tables are unini
36100 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
36110 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74   nTabList = (wct
36120 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
36130 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f  ONETABLE_ONLY) ?
36140 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
36150 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
36160 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
36170 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
36180 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
36190 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
361a0 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
361b0 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
361c0 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
361d0 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
361e0 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
361f0 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
36200 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
36210 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
36220 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
36230 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
36240 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
36250 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
36260 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
36270 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
36280 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
36290 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
362a0 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
362b0 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
362c0 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
362d0 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
362e0 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
362f0 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f   */.  nByteWInfo
36300 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
36310 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61  (WhereInfo)+(nTa
36320 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28  bList-1)*sizeof(
36330 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
36340 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
36350 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
36360 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69   nByteWInfo + si
36370 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
36380 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
36390 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
363a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
363b0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70  , pWInfo);.    p
363c0 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67  WInfo = 0;.    g
363d0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
363e0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  ror;.  }.  pWInf
363f0 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
36400 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43  0] = pWInfo->aiC
36410 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d  urOnePass[1] = -
36420 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  1;.  pWInfo->nLe
36430 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  vel = nTabList;.
36440 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
36450 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
36460 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
36470 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
36480 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
36490 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66  OrderBy;.  pWInf
364a0 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  o->pResultSet = 
364b0 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57  pResultSet;.  pW
364c0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70  Info->iBreak = p
364d0 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
364e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
364f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57  keLabel(v);.  pW
36500 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
36510 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20   = wctrlFlags;. 
36520 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
36530 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
36540 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
36550 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
36560 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
36570 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70   sWLB.pWInfo = p
36580 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57  WInfo;.  sWLB.pW
36590 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
365a0 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20  ;.  sWLB.pNew = 
365b0 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63  (WhereLoop*)(((c
365c0 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79  har*)pWInfo)+nBy
365d0 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  teWInfo);.  asse
365e0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
365f0 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e  LIGNMENT(sWLB.pN
36600 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f  ew) );.  whereLo
36610 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77  opInit(sWLB.pNew
36620 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
36630 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e  _DEBUG.  sWLB.pN
36640 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23  ew->cId = '*';.#
36650 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69  endif..  /* Spli
36660 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
36670 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
36680 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
36690 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
366a0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
366b0 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
366c0 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
366d0 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
366e0 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(pMaskSet);.  w
366f0 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
36700 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
36710 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  nfo);.  whereSpl
36720 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
36730 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
36740 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63  ;.    .  /* Spec
36750 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52  ial case: a WHER
36760 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
36770 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c   constant.  Eval
36780 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78  uate the.  ** ex
36790 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74  pression and eit
367a0 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c  her jump over al
367b0 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72  l of the code or
367c0 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f   fall thru..  */
367d0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
367e0 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
367f0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
36800 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73  nTabList==0 || s
36810 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
36820 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42  tantNotJoin(sWLB
36830 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  .pWC->a[ii].pExp
36840 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
36850 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
36860 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d  Parse, sWLB.pWC-
36870 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57  >a[ii].pExpr, pW
36880 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20  Info->iBreak,.  
36890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55         SQLITE_JU
368b0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
368c0 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d   sWLB.pWC->a[ii]
368d0 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  .wtFlags |= TERM
368e0 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
368f0 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
36900 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c  case: No FROM cl
36910 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ause.  */.  if( 
36920 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  nTabList==0 ){. 
36930 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
36940 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ) pWInfo->nOBSat
36950 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
36960 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72  pr;.    if( wctr
36970 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
36980 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
36990 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
369a0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
369b0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
369c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
369d0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
369e0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
369f0 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
36a00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
36a10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
36a20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
36a30 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
36a40 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
36a50 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
36a60 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
36a70 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
36a80 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
36a90 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
36aa0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
36ab0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
36ac0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
36ad0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
36ae0 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
36af0 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
36b00 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
36b10 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
36b20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
36b30 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
36b40 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
36b50 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
36b60 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
36b70 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
36b80 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
36b90 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
36ba0 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
36bb0 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
36bc0 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
36bd0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
36be0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
36bf0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
36c00 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
36c10 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
36c20 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
36c30 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
36c40 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
36c50 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
36c60 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
36c70 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
36c80 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
36c90 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
36ca0 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70  tables in.  ** p
36cb0 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73  TabList, not jus
36cc0 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62  t the first nTab
36cd0 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54  List tables.  nT
36ce0 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c  abList is normal
36cf0 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  ly.  ** equal to
36d00 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
36d10 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f  but might be sho
36d20 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74  rtened to 1 if t
36d30 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e  he.  ** WHERE_ON
36d40 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
36d50 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
36d60 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
36d70 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
36d80 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
36d90 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
36da0 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
36db0 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
36dc0 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
36dd0 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
36de0 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
36df0 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
36e00 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
36e10 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
36e20 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
36e30 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
36e40 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
36e50 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d       assert( (m-
36e60 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b  1)==toTheLeft );
36e70 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74  .      toTheLeft
36e80 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d   |= m;.    }.  }
36e90 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
36ea0 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
36eb0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
36ec0 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
36ed0 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
36ee0 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
36ef0 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
36f00 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
36f10 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
36f20 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
36f30 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
36f40 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
36f50 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
36f60 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
36f70 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
36f80 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
36f90 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
36fa0 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
36fb0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
36fc0 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
36fd0 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e  (pTabList, &pWIn
36fe0 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20  fo->sWC);.  if( 
36ff0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
37000 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
37010 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
37020 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c  }..  if( wctrlFl
37030 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
37040 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
37050 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52   if( isDistinctR
37060 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c  edundant(pParse,
37070 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e   pTabList, &pWIn
37080 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74  fo->sWC, pResult
37090 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Set) ){.      /*
370a0 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61   The DISTINCT ma
370b0 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65  rking is pointle
370c0 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20  ss.  Ignore it. 
370d0 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
370e0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
370f0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
37100 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  UE;.    }else if
37110 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
37120 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  .      /* Try to
37130 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65   ORDER BY the re
37140 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65  sult set to make
37150 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73   distinct proces
37160 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20  sing easier */. 
37170 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74       pWInfo->wct
37180 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  rlFlags |= WHERE
37190 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20  _DISTINCTBY;.   
371a0 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
371b0 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74  rBy = pResultSet
371c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
371d0 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
371e0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
371f0 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43  s */.  WHERETRAC
37200 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f  E(0xffff,("*** O
37210 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a  ptimizer Start *
37220 2a 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20 44 69  **\n"));.  /* Di
37230 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20  splay all terms 
37240 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
37250 75 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  use */.#if defin
37260 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
37270 41 42 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65  ABLED) && define
37280 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
37290 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20  TREE_EXPLAIN).  
372a0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
372b0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
372c0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
372d0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
372e0 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c  ->pVdbe;.    sql
372f0 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e  ite3ExplainBegin
37300 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  (v);.    for(i=0
37310 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54  ; i<sWLB.pWC->nT
37320 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
37330 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
37340 72 69 6e 74 66 28 76 2c 20 22 23 25 2d 32 64 20  rintf(v, "#%-2d 
37350 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", i);.      sql
37360 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
37370 76 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 45  v);.      whereE
37380 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 26 73  xplainTerm(v, &s
37390 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 29 3b 0a  WLB.pWC->a[i]);.
373a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
373b0 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20  lainPop(v);.    
373c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
373d0 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NL(v);.    }.   
373e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46   sqlite3ExplainF
373f0 69 6e 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71  inish(v);.    sq
37400 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
37410 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64  ("%s", sqlite3Vd
37420 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29  beExplanation(v)
37430 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
37440 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20  if( nTabList!=1 
37450 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  || whereShortCut
37460 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20  (&sWLB)==0 ){.  
37470 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
37480 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20  AddAll(&sWLB);. 
37490 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
374a0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
374b0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70  ;.  .    /* Disp
374c0 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57  lay all of the W
374d0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
374e0 20 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69   if wheretrace i
374f0 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66  s enabled */.#if
37500 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
37510 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f  NABLED /* !=0 */
37520 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
37530 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20  WhereTrace ){.  
37540 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
37550 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
37560 20 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72       static char
37570 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32   zLabel[] = "012
37580 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69  3456789abcdefghi
37590 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78  jklmnopqrstuvwyx
375a0 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z".             
375b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375c0 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45            "ABCDE
375d0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
375e0 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f  VWYXZ";.      fo
375f0 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  r(p=pWInfo->pLoo
37600 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d  ps, i=0; p; p=p-
37610 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29  >pNextLoop, i++)
37620 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64  {.        p->cId
37630 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65   = zLabel[i%size
37640 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20  of(zLabel)];.   
37650 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
37660 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29  int(p, sWLB.pWC)
37670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37680 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68  #endif.  .    wh
37690 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
376a0 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  Info, 0);.    if
376b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
376c0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
376d0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69  eginError;.    i
376e0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
376f0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68  rBy ){.       wh
37700 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
37710 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  Info, pWInfo->nR
37720 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20  owOut+1);.      
37730 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
37740 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
37750 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
37760 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
37770 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
37780 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  0 && (db->flags 
37790 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
377a0 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20  Order)!=0 ){.   
377b0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
377c0 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31  k = (Bitmask)(-1
377d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
377e0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56  rse->nErr || NEV
377f0 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ER(db->mallocFai
37800 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  led) ){.    goto
37810 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
37820 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45  ;.  }.#ifdef WHE
37830 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
37840 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 69 66 28 20  /* !=0 */.  if( 
37850 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
37860 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  e ){.    int ii;
37870 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
37880 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f  gPrintf("---- So
37890 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c  lution nRow=%d",
378a0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
378b0 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
378c0 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  o->nOBSat>0 ){. 
378d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
378e0 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
378f0 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57  Y=%d,0x%llx", pW
37900 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57  Info->nOBSat, pW
37910 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a  Info->revMask);.
37920 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
37930 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
37940 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  nct ){.      cas
37950 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
37960 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
37970 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
37980 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
37990 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20  T=unique");.    
379a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
379b0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
379c0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
379d0 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
379e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
379f0 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f  tf("  DISTINCT=o
37a00 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
37a10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
37a20 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
37a30 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
37a40 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
37a50 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
37a60 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
37a70 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  nordered");.    
37a80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
37a90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
37aa0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
37ab0 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  "\n");.    for(i
37ac0 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e  i=0; ii<pWInfo->
37ad0 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20  nLevel; ii++){. 
37ae0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
37af0 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69  int(pWInfo->a[ii
37b00 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70  ].pWLoop, sWLB.p
37b10 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  WC);.    }.  }.#
37b20 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d  endif.  /* Attem
37b30 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65  pt to omit table
37b40 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20  s from the join 
37b50 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65  that do not effe
37b60 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  ct the result */
37b70 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e  .  if( pWInfo->n
37b80 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70  Level>=2.   && p
37b90 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20  ResultSet!=0.   
37ba0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
37bb0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
37bc0 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a  E_OmitNoopJoin).
37bd0 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
37be0 20 74 61 62 55 73 65 64 20 3d 20 65 78 70 72 4c   tabUsed = exprL
37bf0 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
37c00 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53  askSet, pResultS
37c10 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c  et);.    if( sWL
37c20 42 2e 70 4f 72 64 65 72 42 79 20 29 20 74 61 62  B.pOrderBy ) tab
37c30 55 73 65 64 20 7c 3d 20 65 78 70 72 4c 69 73 74  Used |= exprList
37c40 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
37c50 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72  Set, sWLB.pOrder
37c60 42 79 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  By);.    while( 
37c70 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d  pWInfo->nLevel>=
37c80 32 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  2 ){.      Where
37c90 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45  Term *pTerm, *pE
37ca0 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20  nd;.      pLoop 
37cb0 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e  = pWInfo->a[pWIn
37cc0 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57  fo->nLevel-1].pW
37cd0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20  Loop;.      if( 
37ce0 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  (pWInfo->pTabLis
37cf0 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62  t->a[pLoop->iTab
37d00 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
37d10 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65 61 6b  LEFT)==0 ) break
37d20 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 63 74  ;.      if( (wct
37d30 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
37d40 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d  WANT_DISTINCT)==
37d50 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f  0.       && (pLo
37d60 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37d70 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20  ERE_ONEROW)==0. 
37d80 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
37d90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
37da0 20 20 20 20 20 69 66 28 20 28 74 61 62 55 73 65       if( (tabUse
37db0 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  d & pLoop->maskS
37dc0 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  elf)!=0 ) break;
37dd0 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57  .      pEnd = sW
37de0 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42  LB.pWC->a + sWLB
37df0 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  .pWC->nTerm;.   
37e00 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c     for(pTerm=sWL
37e10 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  B.pWC->a; pTerm<
37e20 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  pEnd; pTerm++){.
37e30 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
37e40 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
37e50 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
37e60 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
37e70 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
37e80 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
37e90 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
37ea0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
37eb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
37ec0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
37ed0 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29  if( pTerm<pEnd )
37ee0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 57 48   break;.      WH
37ef0 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
37f00 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20   ("-> drop loop 
37f10 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20  %c not used\n", 
37f20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20  pLoop->cId));.  
37f30 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76      pWInfo->nLev
37f40 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62  el--;.      nTab
37f50 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  List--;.    }.  
37f60 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  }.  WHERETRACE(0
37f70 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
37f80 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
37f90 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66  **\n"));.  pWInf
37fa0 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  o->pParse->nQuer
37fb0 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d  yLoop += pWInfo-
37fc0 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20  >nRowOut;..  /* 
37fd0 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
37fe0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
37ff0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
38000 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
38010 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
38020 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
38030 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
38040 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
38050 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
38060 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
38070 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
38080 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
38090 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a   constrains.  **
380a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
380b0 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c  o update a singl
380c0 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73  e row..  */.  as
380d0 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
380e0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
380f0 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
38100 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
38110 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74  =1 );.  if( (wct
38120 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
38130 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
38140 21 3d 30 20 0a 20 20 20 2