/ Hex Artifact Content
Login

Artifact 2c2081c546c90227577c502765611555503ce3f7:


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 32 37  (p->iTable) - 27
1c40: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1c50: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c60: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72   = 1;.  }.  pTer
1c70: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
1c80: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1c90: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
1ca0: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
1cb0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
1cc0: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
1cd0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
1ce0: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
1cf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d00: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
1d10: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
1d20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
1d30: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
1d40: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
1d50: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
1d60: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
1d70: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
1d80: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
1d90: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
1da0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
1db0: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
1dc0: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
1dd0: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
1de0: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
1df0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
1e00: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
1e10: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
1e20: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
1e30: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
1e40: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
1e50: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
1e60: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1e70: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
1e80: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
1e90: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
1ea0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
1eb0: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
1ec0: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
1ed0: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
1ee0: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
1ef0: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
1f00: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
1f10: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
1f20: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
1f30: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
1f40: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
1f50: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
1f60: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
1f70: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
1f80: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
1f90: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
1fa0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
1fb0: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
1fc0: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
1fd0: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
1fe0: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
1ff0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2000: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
2010: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
2020: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2030: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
2040: 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  u8 op){.  pWC->o
2050: 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45  p = op;.  if( pE
2060: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
2070: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2080: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
2090: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
20a0: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
20b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
20c0: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
20d0: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
20e0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
20f0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2100: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
2110: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
2120: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
2130: 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ect.*/.#define i
2140: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28  nitMaskSet(P)  (
2150: 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52  P)->n=0../*.** R
2160: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
2170: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
2180: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
2190: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
21a0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
21b0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
21c0: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
21d0: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
21e0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
21f0: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
2200: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
2210: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
2220: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
2230: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2240: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
2250: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
2260: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
2270: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
2280: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
2290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22b0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
22c0: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
22d0: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
22e0: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
22f0: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
2300: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
2310: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2320: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2330: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
2340: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
2350: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
2360: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2370: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
2380: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
2390: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
23a0: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
23b0: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
23c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
23d0: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
23e0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
23f0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2400: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
2410: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
2420: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
2430: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
2440: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
2450: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
2460: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
2470: 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76  s walk (recursiv
2480: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
2490: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
24a0: 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73  rate.** a bitmas
24b0: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
24c0: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
24d0: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
24e0: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
24f0: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
2500: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2510: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2520: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
2530: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
2540: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
2550: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2560: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
2570: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
2580: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
2590: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
25a0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
25b0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
25c0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
25d0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
25e0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
25f0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
2600: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
2610: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
2620: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
2630: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
2640: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2650: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
2660: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2670: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2680: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
2690: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
26a0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
26b0: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
26c0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
26d0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
26e0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
26f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
2700: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
2710: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2720: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
2730: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2740: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2750: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
2760: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
2770: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
2780: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
2790: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
27a0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
27b0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
27c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
27d0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
27e0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
27f0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2800: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
2810: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
2820: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
2830: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
2840: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
2850: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
2860: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2870: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
2880: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
2890: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
28a0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
28b0: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
28c0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
28d0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
28e0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
28f0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
2900: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2910: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2920: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
2930: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
2940: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2950: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
2960: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
2970: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
2980: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
2990: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
29a0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
29b0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
29c0: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
29d0: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
29e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
29f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2a00: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
2a10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
2a20: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
2a30: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2a40: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
2a50: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
2a60: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2a70: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2a80: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
2a90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2aa0: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
2ab0: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
2ac0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
2ad0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2ae0: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
2af0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
2b00: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
2b10: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
2b20: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
2b30: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2b40: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
2b50: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
2b60: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
2b70: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c  <=", ">=", "IN",
2b80: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
2b90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2ba0: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
2bb0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
2bc0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<T
2bd0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2be0: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
2bf0: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
2c00: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
2c10: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
2c20: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
2c30: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
2c40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
2c50: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
2c60: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
2c70: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
2c80: 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ULL;.}../*.** Co
2c90: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
2ca0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
2cb0: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
2cc0: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
2cd0: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
2ce0: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
2cf0: 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67  *.** If left/rig
2d00: 68 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75  ht precedence ru
2d10: 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c  les come into pl
2d20: 61 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ay when determin
2d30: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61  ing the.** colla
2d40: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74  ting sequence, t
2d50: 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  hen COLLATE oper
2d60: 61 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74  ators are adjust
2d70: 65 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  ed to ensure.** 
2d80: 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
2d90: 6e 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73  ng sequence does
2da0: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f   not change.  Fo
2db0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59  r example:.** "Y
2dc0: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
2dd0: 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58  op X" becomes "X
2de0: 20 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61   op Y" because a
2df0: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
2e00: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
2e10: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
2e20: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
2e30: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
2e40: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
2e50: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
2e60: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
2e70: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
2e80: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
2e90: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
2ea0: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
2eb0: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
2ec0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2ed0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2ee0: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
2ef0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
2f00: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
2f10: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
2f20: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
2f30: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ft->flags & EP_C
2f40: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
2f50: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
2f60: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
2f70: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
2f80: 20 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65   if( expRight==e
2f90: 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a  xpLeft ){.    /*
2fa0: 20 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20   Either X and Y 
2fb0: 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54  both have COLLAT
2fc0: 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65  E operator or ne
2fd0: 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20  ither do */.    
2fe0: 69 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a  if( expRight ){.
2ff0: 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20        /* Both X 
3000: 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  and Y have COLLA
3010: 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d  TE operators.  M
3020: 61 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c  ake sure X is al
3030: 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ways.      ** us
3040: 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ed by clearing t
3050: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
3060: 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20  ag from Y. */.  
3070: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
3080: 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f  t->flags &= ~EP_
3090: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c  Collate;.    }el
30a0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  se if( sqlite3Ex
30b0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
30c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  , pExpr->pLeft)!
30d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
30e0: 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68  either X nor Y h
30f0: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
3100: 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73  ators, but X has
3110: 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20   a non-default. 
3120: 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e       ** collatin
3130: 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20  g sequence.  So 
3140: 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  add the EP_Colla
3150: 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74  te marker on X t
3160: 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  o cause.      **
3170: 20 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68   it to be search
3180: 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  ed first. */.   
3190: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
31a0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
31b0: 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  late;.    }.  }.
31c0: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
31d0: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
31e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
31f0: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
3200: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3210: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
3220: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
3230: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
3240: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
3250: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
3260: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
3270: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
3280: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
3290: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
32a0: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
32b0: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
32c0: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
32d0: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
32e0: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
32f0: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
3300: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
3310: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
3320: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
3330: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
3340: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
3350: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
3360: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
3370: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
3380: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
3390: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
33a0: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
33b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
33c0: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
33d0: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
33e0: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
33f0: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
3400: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
3410: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
3420: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
3430: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3440: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
3450: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
3460: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
3470: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
3480: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
3490: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
34a0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
34b0: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
34c0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
34d0: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
34e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
34f0: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
3500: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
3510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
3520: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57  ce to the next W
3530: 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61  hereTerm that ma
3540: 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20  tches according 
3550: 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  to the criteria.
3560: 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77  ** established w
3570: 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62  hen the pScan ob
3580: 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c  ject was initial
3590: 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61  ized by whereSca
35a0: 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75  nInit()..** Retu
35b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
35c0: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74   are no more mat
35d0: 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73  ching WhereTerms
35e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
35f0: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
3600: 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a  Next(WhereScan *
3610: 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43  pScan){.  int iC
3620: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
3630: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20  * The cursor on 
3640: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74  the LHS of the t
3650: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  erm */.  int iCo
3660: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
3670: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   The column on t
3680: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
3690: 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20  rm.  -1 for IPK 
36a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20  */.  Expr *pX;  
36b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
36c0: 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67  expression being
36d0: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65   tested */.  Whe
36e0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
36f0: 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66    /* Shorthand f
3700: 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f  or pScan->pWC */
3710: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3720: 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  erm;    /* The t
3730: 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64  erm being tested
3740: 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53   */.  int k = pS
3750: 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68  can->k;    /* Wh
3760: 65 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61  ere to start sca
3770: 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c  nning */..  whil
3780: 65 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  e( pScan->iEquiv
3790: 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  <=pScan->nEquiv 
37a0: 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53  ){.    iCur = pS
37b0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61  can->aEquiv[pSca
37c0: 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20  n->iEquiv-2];.  
37d0: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61    iColumn = pSca
37e0: 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d  n->aEquiv[pScan-
37f0: 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20  >iEquiv-1];.    
3800: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
3810: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
3820: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
3830: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
3840: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
3850: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
3860: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
3870: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
3880: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
3890: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
38a0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
38b0: 28 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d  (pScan->iEquiv<=
38c0: 32 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f  2 || !ExprHasPro
38d0: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
38e0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
38f0: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3900: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
3910: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
3920: 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20  O_EQUIV)!=0.    
3930: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
3940: 3e 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a  >nEquiv<ArraySiz
3950: 65 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29  e(pScan->aEquiv)
3960: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
3970: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20  .            pX 
3990: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
39a0: 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e  pCollate(pTerm->
39b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
39d0: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  rt( pX->op==TK_C
39e0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
39f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3a00: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a  pScan->nEquiv; j
3a10: 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +=2){.          
3a20: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61      if( pScan->a
3a30: 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54  Equiv[j]==pX->iT
3a40: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
3a50: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45      && pScan->aE
3a60: 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69  quiv[j+1]==pX->i
3a70: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
3a90: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
3aa0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
3ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3ac0: 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69   j==pScan->nEqui
3ad0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
3ae0: 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76     pScan->aEquiv
3af0: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
3b00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3b10: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
3b20: 31 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  1] = pX->iColumn
3b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3b40: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d  pScan->nEquiv +=
3b50: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   2;.            
3b60: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
3b70: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
3b80: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
3b90: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d  pScan->opMask)!=
3ba0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
3bb0: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61   /* Verify the a
3bc0: 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c  ffinity and coll
3bd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
3be0: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
3bf0: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a      if( pScan->z
3c00: 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65  CollName && (pTe
3c10: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
3c20: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
3c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
3c40: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72               Par
3c60: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
3c70: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
3c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3c90: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
3ca0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
3cb0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
3cc0: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
3cd0: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20   pScan->idxaff) 
3ce0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3cf0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
3d00: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3d10: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
3d20: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
3d40: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
3d50: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
3d60: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
3da0: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
3db0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3dc0: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
3dd0: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
3de0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3e00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
3e10: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
3e20: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
3e30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3e40: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3e50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3e60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3e70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
3e80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
3e90: 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20  _EQ)!=0.        
3ea0: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
3eb0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3ec0: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
3ed0: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
3ee0: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
3ef0: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
3f10: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
3f20: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
3f30: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
3f40: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
3f50: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
3f60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
3f70: 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20  Scan->k = k+1;. 
3f80: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
3f90: 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  n pTerm;.       
3fa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
3fb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63       }.      pSc
3fc0: 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d  an->pWC = pScan-
3fd0: 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  >pWC->pOuter;.  
3fe0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d      k = 0;.    }
3ff0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  .    pScan->pWC 
4000: 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43  = pScan->pOrigWC
4010: 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20  ;.    k = 0;.   
4020: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b   pScan->iEquiv +
4030: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
4040: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
4050: 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45  itialize a WHERE
4060: 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20   clause scanner 
4070: 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20  object.  Return 
4080: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4090: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e  .** first match.
40a0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
40b0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
40c0: 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tches..**.** The
40d0: 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65   scanner will be
40e0: 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57   searching the W
40f0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e  HERE clause pWC.
4100: 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a    It will look.*
4110: 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  * for terms of t
4120: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4130: 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20  <expr>" where X 
4140: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d  is column iColum
4150: 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43  n of table.** iC
4160: 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75  ur.  The <op> mu
4170: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
4180: 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72   operators descr
4190: 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a  ibed by opMask..
41a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61  **.** If the sea
41b0: 72 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64  rch is for X and
41c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
41d0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73  e contains terms
41e0: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
41f0: 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f  X=Y then this ro
4200: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
4210: 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66   return terms of
4220: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
4230: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54  <op> <expr>".  T
4240: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  he number of lev
4250: 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76  els of transitiv
4260: 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a  ity is limited,.
4270: 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68  ** but is enough
4280: 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20   to handle most 
4290: 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69  commonly occurri
42a0: 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ng SQL statement
42b0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  s..**.** If X is
42c0: 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52   not the INTEGER
42d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65   PRIMARY KEY the
42e0: 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70  n X must be comp
42f0: 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69  atible with.** i
4300: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74  ndex pIdx..*/.st
4310: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
4320: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20  whereScanInit(. 
4330: 20 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61   WhereScan *pSca
4340: 6e 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  n,       /* The 
4350: 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74  WhereScan object
4360: 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a   being initializ
4370: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
4380: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
4390: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
43a0: 75 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  use to be scanne
43b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43d0: 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
43e0: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
43f0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
4400: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73    /* Column to s
4410: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32  can for */.  u32
4420: 20 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20   opMask,        
4430: 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72       /* Operator
4440: 28 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  (s) to scan for 
4450: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4470: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
4480: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
4490: 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  ex */.){.  int j
44a0: 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  ;..  /* memset(p
44b0: 53 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Scan, 0, sizeof(
44c0: 2a 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70  *pScan)); */.  p
44d0: 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20  Scan->pOrigWC = 
44e0: 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57  pWC;.  pScan->pW
44f0: 43 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70  C = pWC;.  if( p
4500: 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d  Idx && iColumn>=
4510: 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  0 ){.    pScan->
4520: 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70  idxaff = pIdx->p
4530: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
4540: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
4550: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78     for(j=0; pIdx
4560: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
4570: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
4580: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e      if( NEVER(j>
4590: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  pIdx->nColumn) )
45a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
45b0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
45c0: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
45d0: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65  Coll[j];.  }else
45e0: 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78  {.    pScan->idx
45f0: 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63  aff = 0;.    pSc
4600: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
4610: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
4620: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
4630: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
4640: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
4650: 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53  [0] = iCur;.  pS
4660: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d  can->aEquiv[1] =
4670: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61   iColumn;.  pSca
4680: 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20  n->nEquiv = 2;. 
4690: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d   pScan->iEquiv =
46a0: 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65   2;.  return whe
46b0: 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e  reScanNext(pScan
46c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  );.}../*.** Sear
46d0: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
46e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
46f0: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
4700: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
4710: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
4720: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
4730: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
4740: 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64  f table iCur and
4750: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a   <op> is one of.
4760: 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65  ** the WO_xx ope
4770: 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63  rator codes spec
4780: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20  ified by the op 
4790: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65  parameter..** Re
47a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
47b0: 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74  o the term.  Ret
47c0: 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75  urn 0 if not fou
47d0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  nd..**.** The te
47e0: 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68  rm returned migh
47f0: 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66  t by Y=<expr> if
4800: 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65   there is anothe
4810: 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a  r constraint in.
4820: 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
4830: 75 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69  use that specifi
4840: 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e  es that X=Y.  An
4850: 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e  y such constrain
4860: 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64  ts will be.** id
4870: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
4880: 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20  WO_EQUIV bit in 
4890: 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  the pTerm->eOper
48a0: 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65  ator field.  The
48b0: 0a 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72  .** aEquiv[] arr
48c0: 61 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61  ay holds X and a
48d0: 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e  ll its equivalen
48e0: 74 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51  ts, with each SQ
48f0: 4c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61  L variable.** ta
4900: 6b 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74  king up two slot
4910: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20  s in aEquiv[].  
4920: 54 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69  The first slot i
4930: 73 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72  s for the cursor
4940: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74   number.** and t
4950: 68 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72  he second is for
4960: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
4970: 65 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32  er.  There are 2
4980: 32 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  2 slots in aEqui
4990: 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d  v[].** so that m
49a0: 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b  eans we can look
49b0: 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74   for X plus up t
49c0: 6f 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76  o 10 other equiv
49d0: 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a  alent values..**
49e0: 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20   Hence a search 
49f0: 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72  for X will retur
4a00: 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31  n <expr> if X=A1
4a10: 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41   and A1=A2 and A
4a20: 32 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20  2=A3.** and ... 
4a30: 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41  and A9=A10 and A
4a40: 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a  10=<expr>..**.**
4a50: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75   If there are mu
4a60: 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20  ltiple terms in 
4a70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4a80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4a90: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
4aa0: 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65  then try for the
4ab0: 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70   one with no dep
4ac0: 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78  endencies on <ex
4ad0: 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77  pr> - in other w
4ae0: 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65  ords where.** <e
4af0: 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61  xpr> is a consta
4b00: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  nt expression of
4b10: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c   some kind.  Onl
4b20: 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73  y return entries
4b30: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4b40: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
4b50: 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69   Y is a column i
4b60: 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  n another table 
4b70: 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a  if no terms of.*
4b80: 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  * the form "X <o
4b90: 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22  p> <const-expr>"
4ba0: 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20   exist.   If no 
4bb0: 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e  terms with a con
4bc0: 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69  stant RHS.** exi
4bd0: 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72  st, try to retur
4be0: 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f  n a term that do
4bf0: 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51  es not use WO_EQ
4c00: 55 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  UIV..*/.static W
4c10: 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65  hereTerm *findTe
4c20: 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  rm(.  WhereClaus
4c30: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
4c40: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4c50: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
4c60: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
4c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4c80: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  sor number of LH
4c90: 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  S */.  int iColu
4ca0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn,          /* 
4cb0: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
4cc0: 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73   LHS */.  Bitmas
4cd0: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
4ce0: 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20  /* RHS must not 
4cf0: 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69  overlap with thi
4d00: 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20  s mask */.  u32 
4d10: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
4d20: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f    /* Mask of WO_
4d30: 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69  xx values descri
4d40: 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f  bing operator */
4d50: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
4d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
4d70: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
4d80: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20  ith this index, 
4d90: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
4da0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
4db0: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68  Result = 0;.  Wh
4dc0: 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68  ereTerm *p;.  Wh
4dd0: 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20  ereScan scan;.. 
4de0: 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e   p = whereScanIn
4df0: 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69  it(&scan, pWC, i
4e00: 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70  Cur, iColumn, op
4e10: 2c 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65  , pIdx);.  while
4e20: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
4e30: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
4e40: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
4e50: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
4e60: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
4e70: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f  (p->eOperator&WO
4e80: 5f 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)!=0 ){.     
4e90: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
4ea0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
4eb0: 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73  Result==0 ) pRes
4ec0: 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ult = p;.    }. 
4ed0: 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e     p = whereScan
4ee0: 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d  Next(&scan);.  }
4ef0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c  .  return pResul
4f00: 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t;.}../* Forward
4f10: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
4f20: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
4f30: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
4f40: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
4f50: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
4f60: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
4f70: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
4f80: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f  ERE clause.  .*/
4f90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
4fa0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53  rAnalyzeAll(.  S
4fb0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
4fc0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
4fd0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
4fe0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
5000: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
5010: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
5020: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5030: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
5040: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
5050: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
5060: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
5070: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
5080: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
5090: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  OPTIMIZATION./*.
50a0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
50b0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
50c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b  ression is a LIK
50d0: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
50e0: 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  or that.** can b
50f0: 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
5100: 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  g inequality con
5110: 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72  straints.  Retur
5120: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a  n TRUE if it is.
5130: 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20  ** so and false 
5140: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  if not..**.** In
5150: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f   order for the o
5160: 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70  perator to be op
5170: 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52  timizible, the R
5180: 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72  HS must be a str
5190: 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74  ing.** literal t
51a0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  hat does not beg
51b0: 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61  in with a wildca
51c0: 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  rd.  .*/.static 
51d0: 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  int isLikeOrGlob
51e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
51f0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
5200: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5210: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5220: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
5230: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
5240: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
5250: 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78   Expr **ppPrefix
5260: 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ,  /* Pointer to
5270: 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65   TK_STRING expre
5280: 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65  ssion with patte
5290: 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  rn prefix */.  i
52a0: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c  nt *pisComplete,
52b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
52c0: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
52d0: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
52e0: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
52f0: 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20  t *pnoCase      
5300: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
5310: 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65  case is equivale
5320: 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20  nt to lowercase 
5330: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
5340: 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20  ar *z = 0;      
5350: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20     /* String on 
5360: 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  RHS of LIKE oper
5370: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ator */.  Expr *
5380: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20  pRight, *pLeft; 
5390: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e       /* Right an
53a0: 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c  d left size of L
53b0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
53c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
53d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
53e0: 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73  List of operands
53f0: 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65   to the LIKE ope
5400: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
5410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5420: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61        /* One cha
5430: 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f  racter in z[] */
5440: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
5470: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
5480: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63  haracters */.  c
5490: 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20  har wc[3];      
54a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c            /* Wil
54b0: 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73  dcard characters
54c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
54d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
54e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
54f0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  nection */.  sql
5500: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
5510: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20   = 0;.  int op; 
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20     /* Opcode of 
5540: 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28  pRight */..  if(
5550: 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46   !sqlite3IsLikeF
5560: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70  unction(db, pExp
5570: 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20  r, pnoCase, wc) 
5580: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5590: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
55a0: 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20  TE_EBCDIC.  if( 
55b0: 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72  *pnoCase ) retur
55c0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c  n 0;.#endif.  pL
55d0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
55e0: 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20  List;.  pLeft = 
55f0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
5600: 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  r;.  if( pLeft->
5610: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20  op!=TK_COLUMN . 
5620: 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
5630: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21  Affinity(pLeft)!
5640: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
5650: 20 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61   .   || IsVirtua
5660: 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20  l(pLeft->pTab). 
5670: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20   ){.    /* IMP: 
5680: 52 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68  R-02065-49465 Th
5690: 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
56a0: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20   of the LIKE or 
56b0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75  GLOB operator mu
56c0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
56d0: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65   name of an inde
56e0: 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  xed column with 
56f0: 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a  TEXT affinity. *
5700: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
5710: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
5720: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d  eft->iColumn!=(-
5730: 31 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  1) ); /* Because
5740: 20 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41   IPK never has A
5750: 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52  FF_TEXT */..  pR
5760: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
5770: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
5780: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
5790: 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d  ;.  op = pRight-
57a0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
57b0: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
57c0: 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61    Vdbe *pReprepa
57d0: 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65  re = pParse->pRe
57e0: 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74  prepare;.    int
57f0: 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e   iCol = pRight->
5800: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61  iColumn;.    pVa
5810: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  l = sqlite3VdbeG
5820: 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65  etBoundValue(pRe
5830: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
5840: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
5850: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
5860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5870: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
5880: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
5890: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
58a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
58b0: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
58c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
58d0: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
58e0: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
58f0: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
5900: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
5910: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
5920: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
5930: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
5940: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
5950: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
5960: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
5970: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
5980: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
5990: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
59a0: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
59b0: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
59c0: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
59d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
59e0: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
59f0: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
5a00: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
5a10: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
5a20: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
5a30: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
5a40: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
5a50: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
5a60: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
5a70: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
5a80: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
5a90: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
5aa0: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
5ab0: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
5ac0: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
5ad0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
5ae0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5af0: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
5b00: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
5b10: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
5b20: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
5b30: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
5b40: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
5b50: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
5b60: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
5b70: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
5b80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
5b90: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
5ba0: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
5bb0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
5bc0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
5bd0: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
5be0: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
5bf0: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
5c00: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
5c10: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
5c20: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
5c30: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
5c40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
5c50: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
5c60: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
5c70: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
5c80: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
5c90: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
5ca0: 6b 20 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61  k around them, a
5cb0: 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61  dd a dummy OP_Va
5cc0: 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20  riable here..   
5cd0: 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
5ce0: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5cf0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5d00: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
5d10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
5d20: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
5d30: 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20   pRight, r1);.  
5d40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5d50: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73  dbeChangeP3(v, s
5d60: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5d70: 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a  tAddr(v)-1, 0);.
5d80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5d90: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
5da0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
5db0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5dc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5dd0: 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  z = 0;.    }.  }
5de0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ..  sqlite3Value
5df0: 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65  Free(pVal);.  re
5e00: 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23  turn (z!=0);.}.#
5e10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5e20: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
5e30: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e  ZATION */...#ifn
5e40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5e50: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
5e60: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
5e70: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
5e80: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
5e90: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
5ea0: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43       column MATC
5eb0: 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20  H expr.**.** If 
5ec0: 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72  it is then retur
5ed0: 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c  n TRUE.  If not,
5ee0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a   return FALSE..*
5ef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d  /.static int isM
5f00: 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20  atchOfColumn(.  
5f10: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
5f20: 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78   /* Test this ex
5f30: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  pression */.){. 
5f40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5f50: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ;..  if( pExpr->
5f60: 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op!=TK_FUNCTION 
5f70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5f80: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
5f90: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
5fa0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68  >u.zToken,"match
5fb0: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")!=0 ){.    ret
5fc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
5fd0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
5fe0: 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
5ff0: 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20  ->nExpr!=2 ){.  
6000: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6010: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31    if( pList->a[1
6020: 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54  ].pExpr->op != T
6030: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
6040: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6050: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
6060: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6070: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
6080: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
6090: 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e  pBase expression
60a0: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
60b0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
60c0: 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f  lause of.** a jo
60d0: 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  in, then transfe
60e0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
60f0: 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20  e markings over 
6100: 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73  to derived..*/.s
6110: 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73  tatic void trans
6120: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
6130: 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20  Expr *pDerived, 
6140: 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20  Expr *pBase){.  
6150: 69 66 28 20 70 44 65 72 69 76 65 64 20 29 7b 0a  if( pDerived ){.
6160: 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c      pDerived->fl
6170: 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c  ags |= pBase->fl
6180: 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69  ags & EP_FromJoi
6190: 6e 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d  n;.    pDerived-
61a0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
61b0: 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74   = pBase->iRight
61c0: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d  JoinTable;.  }.}
61d0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 65 72  ../*.** Mark ter
61e0: 6d 20 69 43 68 69 6c 64 20 61 73 20 62 65 69 6e  m iChild as bein
61f0: 67 20 61 20 63 68 69 6c 64 20 6f 66 20 74 65 72  g a child of ter
6200: 6d 20 69 50 61 72 65 6e 74 0a 2a 2f 0a 73 74 61  m iParent.*/.sta
6210: 74 69 63 20 76 6f 69 64 20 6d 61 72 6b 54 65 72  tic void markTer
6220: 6d 41 73 43 68 69 6c 64 28 57 68 65 72 65 43 6c  mAsChild(WhereCl
6230: 61 75 73 65 20 2a 70 57 43 2c 20 69 6e 74 20 69  ause *pWC, int i
6240: 43 68 69 6c 64 2c 20 69 6e 74 20 69 50 61 72 65  Child, int iPare
6250: 6e 74 29 7b 0a 20 20 70 57 43 2d 3e 61 5b 69 43  nt){.  pWC->a[iC
6260: 68 69 6c 64 5d 2e 69 50 61 72 65 6e 74 20 3d 20  hild].iParent = 
6270: 69 50 61 72 65 6e 74 3b 0a 20 20 70 57 43 2d 3e  iParent;.  pWC->
6280: 61 5b 69 43 68 69 6c 64 5d 2e 74 72 75 74 68 50  a[iChild].truthP
6290: 72 6f 62 20 3d 20 70 57 43 2d 3e 61 5b 69 50 61  rob = pWC->a[iPa
62a0: 72 65 6e 74 5d 2e 74 72 75 74 68 50 72 6f 62 3b  rent].truthProb;
62b0: 0a 20 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e  .  pWC->a[iParen
62c0: 74 5d 2e 6e 43 68 69 6c 64 2b 2b 3b 0a 7d 0a 0a  t].nChild++;.}..
62d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
62e0: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
62f0: 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65  MIZATION) && !de
6300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6310: 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a  T_SUBQUERY)./*.*
6320: 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d  * Analyze a term
6330: 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
6340: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52  f two or more OR
6350: 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75  -connected.** su
6360: 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a  bterms.  So in:.
6370: 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48  **.**     ... WH
6380: 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28  ERE  (a=5) AND (
6390: 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d  b=7 OR c=9 OR d=
63a0: 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a  13) AND (d=13).*
63b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
63c0: 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e             ^^^^^
63d0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a  ^^^^^^^^^^^^^^^.
63e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
63f0: 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d  ne analyzes term
6400: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d 69  s such as the mi
6410: 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65  ddle term in the
6420: 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a   above example..
6430: 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d  ** A WhereOrTerm
6440: 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75   object is compu
6450: 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65 64  ted and attached
6460: 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64   to the term und
6470: 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20  er.** analysis, 
6480: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
6490: 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65  e outcome of the
64a0: 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63   analysis.  Henc
64b0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  e:.**.**     Whe
64c0: 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20  reTerm.wtFlags  
64d0: 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f   |=  TERM_ORINFO
64e0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
64f0: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20  m.u.pOrInfo  =  
6500: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
6510: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72 54  located WhereOrT
6520: 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a  erm object.**.**
6530: 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20   The term being 
6540: 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61  analyzed must ha
6550: 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f  ve two or more o
6560: 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73  f OR-connected s
6570: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69  ubterms..** A si
6580: 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67  ngle subterm mig
6590: 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20 41  ht be a set of A
65a0: 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62  ND-connected sub
65b0: 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78  -subterms..** Ex
65c0: 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20  amples of terms 
65d0: 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a  under analysis:.
65e0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20  **.**     (A)   
65f0: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74    t1.x=t2.y OR t
6600: 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79  1.x=t2.z OR t1.y
6610: 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61  =15 OR t1.z=t3.a
6620: 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20  +5.**     (B)   
6630: 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70    x=expr1 OR exp
6640: 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a  r2=x OR x=expr3.
6650: 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20 74  **     (C)     t
6660: 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e  1.x=t2.y OR (t1.
6670: 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d  x=t2.z AND t1.y=
6680: 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20  15).**     (D)  
6690: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79     x=expr1 OR (y
66a0: 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44  >11 AND y<22 AND
66b0: 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a   z LIKE '*hello*
66c0: 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20  ').**     (E)   
66d0: 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62    (p.a=1 AND q.b
66e0: 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52  =2 AND r.c=3) OR
66f0: 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d   (p.x=4 AND q.y=
6700: 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a  5 AND r.z=6).**.
6710: 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a  ** CASE 1:.**.**
6720: 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73   If all subterms
6730: 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d   are of the form
6740: 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73 6f   T.C=expr for so
6750: 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  me single column
6760: 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20 73   of C and.** a s
6770: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61  ingle table T (a
6780: 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70  s shown in examp
6790: 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e  le B above) then
67a0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
67b0: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68  rtual.** term th
67c0: 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c  at is an equival
67d0: 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f  ent IN expressio
67e0: 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
67f0: 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a  ds, if the term.
6800: 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ** being analyze
6810: 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d is:.**.**     
6820: 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20   x = expr1  OR  
6830: 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78  expr2 = x  OR  x
6840: 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74   = expr3.**.** t
6850: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
6860: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69   virtual term li
6870: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
6880: 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c      x IN (expr1,
6890: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a  expr2,expr3).**.
68a0: 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a  ** CASE 2:.**.**
68b0: 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73   If all subterms
68c0: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62   are indexable b
68d0: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
68e0: 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a   T, then set.**.
68f0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
6900: 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20  .eOperator      
6910: 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52          =  WO_OR
6920: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6930: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  m.u.pOrInfo->ind
6940: 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20  exable  |=  the 
6950: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
6960: 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20  r table T.**.** 
6970: 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e  A subterm is "in
6980: 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69  dexable" if it i
6990: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
69a0: 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72   "T.C <op> <expr
69b0: 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e  >" where C is an
69c0: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  y column of tabl
69d0: 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e  e T and .** <op>
69e0: 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20   is one of "=", 
69f0: 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20  "<", "<=", ">", 
6a00: 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c  ">=", "IS NULL",
6a10: 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73   or "IN"..** A s
6a20: 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69  ubterm is also i
6a30: 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69  ndexable if it i
6a40: 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20  s an AND of two 
6a50: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75  or more.** subsu
6a60: 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20  bterms at least 
6a70: 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20  one of which is 
6a80: 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65  indexable.  Inde
6a90: 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75  xable AND .** su
6aa0: 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69  bterms have thei
6ab0: 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  r eOperator set 
6ac0: 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68  to WO_AND and th
6ad0: 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e  ey have.** u.pAn
6ae0: 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64  dInfo set to a d
6af0: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
6b00: 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72  ated WhereAndTer
6b10: 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  m object..**.** 
6b20: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69  From another poi
6b30: 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64  nt of view, "ind
6b40: 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68  exable" means th
6b50: 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63  at the subterm c
6b60: 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61  ould.** potentia
6b70: 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  lly be used with
6b80: 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20   an index if an 
6b90: 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65  appropriate inde
6ba0: 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69  x exists..** Thi
6bb0: 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20  s analysis does 
6bc0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65  not consider whe
6bd0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
6be0: 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68  index exists; th
6bf0: 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65 64  at.** is decided
6c00: 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68 69   elsewhere.  Thi
6c10: 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  s analysis only 
6c20: 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72  looks at whether
6c30: 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70 70   subterms.** app
6c40: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64  ropriate for ind
6c50: 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a  exing exist..**.
6c60: 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20  ** All examples 
6c70: 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76  A through E abov
6c80: 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  e satisfy case 2
6c90: 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d  .  But if a term
6ca0: 0a 2a 2a 20 61 6c 73 6f 20 73 61 74 69 73 66 69  .** also satisfi
6cb0: 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20  es case 1 (such 
6cc0: 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68  as B) we know th
6cd0: 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  at the optimizer
6ce0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20   will.** always 
6cf0: 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73  prefer case 1, s
6d00: 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77  o in that case w
6d10: 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63  e pretend that c
6d20: 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20  ase 2 is not.** 
6d30: 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  satisfied..**.**
6d40: 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   It might be the
6d50: 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69   case that multi
6d60: 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69  ple tables are i
6d70: 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65  ndexable.  For e
6d80: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61  xample,.** (E) a
6d90: 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c  bove is indexabl
6da0: 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51  e on tables P, Q
6db0: 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54  , and R..**.** T
6dc0: 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66  erms that satisf
6dd0: 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e  y case 2 are can
6de0: 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b  didates for look
6df0: 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73  up by using.** s
6e00: 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20  eparate indices 
6e10: 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66  to find rowids f
6e20: 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20  or each subterm 
6e30: 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a  and composing.**
6e40: 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c   the union of al
6e50: 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61  l rowids using a
6e60: 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20   RowSet object. 
6e70: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
6e80: 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69  .** to "bitmap i
6e90: 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72  ndices" in other
6ea0: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
6eb0: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49  s..**.** OTHERWI
6ec0: 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  SE:.**.** If nei
6ed0: 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20  ther case 1 nor 
6ee0: 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68  case 2 apply, th
6ef0: 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70  en leave the eOp
6f00: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a  erator set to.**
6f10: 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72   zero.  This ter
6f20: 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20  m is not useful 
6f30: 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73  for search..*/.s
6f40: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
6f50: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20  nalyzeOrTerm(.  
6f60: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
6f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
6f80: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
6f90: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
6fa0: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
6fb0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52  he complete WHER
6fc0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
6fd0: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
6fe0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
6ff0: 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20   of the OR-term 
7000: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
7010: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
7020: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
7030: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f  pWInfo;        /
7040: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  * WHERE clause p
7050: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
7060: 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
7070: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
7080: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 2f  Parse;         /
7090: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
70a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
70b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70d0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
70e0: 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
70f0: 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
7100: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20  C->a[idxTerm];  
7110: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
7120: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
7130: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
7140: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20  pTerm->pExpr;   
7150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7160: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
7170: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  he term */.  int
7180: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71a0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
71b0: 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
71c0: 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
71d0: 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20       /* Breakup 
71e0: 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75  of pTerm into su
71f0: 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72  bterms */.  Wher
7200: 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20  eTerm *pOrTerm; 
7210: 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74        /* A Sub-t
7220: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70  erm within the p
7230: 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f  OrWc */.  WhereO
7240: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
7250: 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61      /* Additiona
7260: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73  l information as
7270: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
7280: 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  erm */.  Bitmask
7290: 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20   chngToIN;      
72a0: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
72b0: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
72c0: 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d  case 1 */.  Bitm
72d0: 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20  ask indexable;  
72e0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
72f0: 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62  that are indexab
7300: 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63  le, satisfying c
7310: 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  ase 2 */..  /*. 
7320: 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52   ** Break the OR
7330: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73   clause into its
7340: 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72   separate subter
7350: 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d  ms.  The subterm
7360: 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65  s are.  ** store
7370: 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75  d in a WhereClau
7380: 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  se structure con
7390: 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74  taining within t
73a0: 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20  he WhereOrInfo. 
73b0: 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20   ** object that 
73c0: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  is attached to t
73d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63  he original OR c
73e0: 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f  lause term..  */
73f0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
7400: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
7410: 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f  RM_DYNAMIC|TERM_
7420: 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49  ORINFO|TERM_ANDI
7430: 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  NFO))==0 );.  as
7440: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
7450: 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72  =TK_OR );.  pTer
7460: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70  m->u.pOrInfo = p
7470: 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  OrInfo = sqlite3
7480: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
7490: 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f   sizeof(*pOrInfo
74a0: 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66  ));.  if( pOrInf
74b0: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  o==0 ) return;. 
74c0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
74d0: 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a  |= TERM_ORINFO;.
74e0: 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e    pOrWc = &pOrIn
74f0: 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43  fo->wc;.  whereC
7500: 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c  lauseInit(pOrWc,
7510: 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72   pWInfo);.  wher
7520: 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45  eSplit(pOrWc, pE
7530: 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65  xpr, TK_OR);.  e
7540: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
7550: 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66  rc, pOrWc);.  if
7560: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
7570: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
7580: 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54  ssert( pOrWc->nT
7590: 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a  erm>=2 );..  /*.
75a0: 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    ** Compute the
75b0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
75c0: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
75d0: 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a  y cases 1 or 2..
75e0: 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65    */.  indexable
75f0: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
7600: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42    chngToIN = ~(B
7610: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
7620: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
7630: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
7640: 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65  >a; i>=0 && inde
7650: 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54  xable; i--, pOrT
7660: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
7670: 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
7680: 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29  tor & WO_SINGLE)
7690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ==0 ){.      Whe
76a0: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49  reAndInfo *pAndI
76b0: 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nfo;.      asser
76c0: 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  t( (pOrTerm->wtF
76d0: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44  lags & (TERM_AND
76e0: 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  INFO|TERM_ORINFO
76f0: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  ))==0 );.      c
7700: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
7710: 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71     pAndInfo = sq
7720: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7730: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e  (db, sizeof(*pAn
7740: 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69  dInfo));.      i
7750: 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20  f( pAndInfo ){. 
7760: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
7770: 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20  se *pAndWC;.    
7780: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
7790: 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  AndTerm;.       
77a0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
77b0: 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20  Bitmask b = 0;. 
77c0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
77d0: 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e  u.pAndInfo = pAn
77e0: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70  dInfo;.        p
77f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
7800: 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b  |= TERM_ANDINFO;
7810: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
7820: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
7830: 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41  _AND;.        pA
7840: 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f  ndWC = &pAndInfo
7850: 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68  ->wc;.        wh
7860: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41  ereClauseInit(pA
7870: 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66  ndWC, pWC->pWInf
7880: 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  o);.        wher
7890: 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70  eSplit(pAndWC, p
78a0: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54  OrTerm->pExpr, T
78b0: 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20  K_AND);.        
78c0: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
78d0: 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20  Src, pAndWC);.  
78e0: 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f        pAndWC->pO
78f0: 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
7900: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
7910: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7920: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64  ;.        if( !d
7930: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7940: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
7950: 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70  (j=0, pAndTerm=p
7960: 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64  AndWC->a; j<pAnd
7970: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
7980: 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  pAndTerm++){.   
7990: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
79a0: 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72   pAndTerm->pExpr
79b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
79c0: 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41  if( allowedOp(pA
79d0: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f  ndTerm->pExpr->o
79e0: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p) ){.          
79f0: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
7a00: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
7a10: 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65  et, pAndTerm->le
7a20: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7a30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7a40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7a50: 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65         indexable
7a60: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
7a70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
7a80: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7a90: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20  TERM_COPIED ){. 
7aa0: 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69       /* Skip thi
7ab0: 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20  s term for now. 
7ac0: 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77   We revisit it w
7ad0: 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74  hen we process t
7ae0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  he.      ** corr
7af0: 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56  esponding TERM_V
7b00: 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20  IRTUAL term */. 
7b10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b20: 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20  Bitmask b;.     
7b30: 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57   b = getMask(&pW
7b40: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
7b50: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
7b60: 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
7b70: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7b80: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
7b90: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
7ba0: 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
7bb0: 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d  pOrWc->a[pOrTerm
7bc0: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
7bd0: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
7be0: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
7bf0: 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74  et, pOther->left
7c00: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
7c10: 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65  .      indexable
7c20: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28   &= b;.      if(
7c30: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
7c40: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30  ator & WO_EQ)==0
7c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
7c60: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
7c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
7c80: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
7c90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7ca0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
7cb0: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
7cc0: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
7cd0: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
7ce0: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
7cf0: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
7d00: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
7d10: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
7d20: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7d30: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
7d40: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
7d50: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
7d60: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
7d70: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
7d80: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
7d90: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
7da0: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
7db0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
7dc0: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
7dd0: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
7de0: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
7df0: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
7e00: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
7e10: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
7e20: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
7e30: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
7e40: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
7e50: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
7e60: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
7e70: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
7e80: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
7e90: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
7ea0: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
7eb0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
7ec0: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
7ed0: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
7ee0: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
7ef0: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
7f00: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
7f10: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
7f20: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
7f30: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
7f40: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
7f50: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
7f60: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
7f70: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
7f80: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
7f90: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
7fa0: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
7fb0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
7fc0: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
7fd0: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
7fe0: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
7ff0: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
8000: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
8010: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
8020: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
8030: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
8040: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
8050: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
8060: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
8070: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
8080: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
8090: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
80a0: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
80b0: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
80c0: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
80d0: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
80e0: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
80f0: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
8100: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
8110: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
8120: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
8130: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
8140: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
8150: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
8160: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
8170: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
8180: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
8190: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
81a0: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
81b0: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
81c0: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
81d0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
81e0: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
81f0: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
8200: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
8210: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
8220: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
8230: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
8240: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
8250: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
8260: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
8270: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
8280: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
8290: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
82a0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
82b0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
82c0: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
82d0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
82e0: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
82f0: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
8300: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
8310: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
8320: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
8330: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
8340: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
8350: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
8360: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
8370: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
8380: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
8390: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
83a0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
83b0: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
83c0: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
83d0: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
83e0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
83f0: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
8400: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
8410: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
8420: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
8430: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
8440: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
8450: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
8460: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
8470: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
8480: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
8490: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
84a0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
84b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
84c0: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
84d0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
84e0: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
84f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
8500: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8510: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
8520: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
8530: 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65  s the 2-bit case
8540: 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74   and we are on t
8550: 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
8560: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
8570: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72    ** current ter
8580: 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69  m is from the fi
8590: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20  rst iteration.  
85a0: 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72  So skip this ter
85b0: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
85c0: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a  assert( j==1 );.
85d0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
85e0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
85f0: 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54        if( (chngT
8600: 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 26 70  oIN & getMask(&p
8610: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
8620: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
8630: 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20  rsor))==0 ){.   
8640: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74         /* This t
8650: 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74  erm must be of t
8660: 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32  he form t1.a==t2
8670: 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69  .b where t2 is i
8680: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
8690: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20  ** chngToIN set 
86a0: 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20  but t1 is not.  
86b0: 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62  This term will b
86c0: 65 20 65 69 74 68 65 72 20 70 72 65 63 65 64 65  e either precede
86d0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
86e0: 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20  r follwed by an 
86f0: 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74  inverted copy (t
8700: 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69  2.b==t1.a).  Ski
8710: 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20  p this term .   
8720: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73         ** and us
8730: 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e  e its inversion.
8740: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
8750: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
8760: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8770: 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20  COPIED );.      
8780: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
8790: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
87a0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
87b0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
87c0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  t( pOrTerm->wtFl
87d0: 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49  ags & (TERM_COPI
87e0: 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  ED|TERM_VIRTUAL)
87f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
8800: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8810: 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  }.        iColum
8820: 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  n = pOrTerm->u.l
8830: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
8840: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72     iCursor = pOr
8850: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8860: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8880: 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
8890: 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74    /* No candidat
88a0: 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77  e table+column w
88b0: 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20  as found.  This 
88c0: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20  can only occur. 
88d0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65         ** on the
88e0: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
88f0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
8900: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
8910: 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50       assert( IsP
8920: 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f  owerOfTwo(chngTo
8930: 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  IN) );.        a
8940: 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d  ssert( chngToIN=
8950: 3d 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  =getMask(&pWInfo
8960: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
8970: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
8980: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8990: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
89a0: 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==1 );..      /*
89b0: 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61   We have found a
89c0: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
89d0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68   and column.  Ch
89e0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
89f0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  at.      ** tabl
8a00: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  e and column is 
8a10: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
8a20: 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63  term in the OR c
8a30: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f  lause */.      o
8a40: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b  kToChngToIN = 1;
8a50: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d  .      for(; i>=
8a60: 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  0 && okToChngToI
8a70: 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  N; i--, pOrTerm+
8a80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
8a90: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
8aa0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
8ab0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
8ac0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8ad0: 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  r!=iCursor ){.  
8ae0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8af0: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8b00: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8b10: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8b20: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
8b30: 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  !=iColumn ){.   
8b40: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
8b50: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
8b60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8b70: 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61    int affLeft, a
8b80: 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  ffRight;.       
8b90: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67     /* If the rig
8ba0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
8bb0: 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  also a column, t
8bc0: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69  hen the affiniti
8bd0: 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
8be0: 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e  of both right an
8bf0: 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73  d left sides mus
8c00: 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e  t be such that n
8c10: 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20  o type.         
8c20: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20   ** conversions 
8c30: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
8c40: 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63  the right.  (Tic
8c50: 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20  ket #2249).     
8c60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
8c70: 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c    affRight = sql
8c80: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
8c90: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
8ca0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
8cb0: 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71      affLeft = sq
8cc0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
8cd0: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
8ce0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
8cf0: 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74      if( affRight
8d00: 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21  !=0 && affRight!
8d10: 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20  =affLeft ){.    
8d20: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
8d30: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
8d40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d50: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8d60: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
8d70: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  OR_OK;.         
8d80: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8d90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8da0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
8db0: 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  , okToChngToIN i
8dc0: 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e  s true if origin
8dd0: 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69  al pTerm satisfi
8de0: 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31  es.    ** case 1
8df0: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
8e00: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
8e10: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68   virtual term th
8e20: 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54  at is .    ** pT
8e30: 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  erm converted in
8e40: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
8e50: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
8e60: 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29  ( okToChngToIN )
8e70: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
8e80: 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  up;            /
8e90: 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75  * A transient du
8ea0: 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69  plicate expressi
8eb0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
8ec0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
8ed0: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66     /* The RHS of
8ee0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
8ef0: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
8f00: 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20  pLeft = 0;      
8f10: 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
8f20: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
8f30: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  /.      Expr *pN
8f40: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
8f50: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49  * The complete I
8f60: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20  N operator */.. 
8f70: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
8f80: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
8f90: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
8fa0: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
8fb0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
8fc0: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
8fd0: 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d  s & TERM_OR_OK)=
8fe0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
8ff0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9000: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9010: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
9020: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9030: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9040: 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ==iCursor );.   
9050: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9060: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
9070: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20  mn==iColumn );. 
9080: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
9090: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
90a0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
90b0: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
90c0: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
90d0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
90e0: 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  nd(pWInfo->pPars
90f0: 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b  e, pList, pDup);
9100: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d  .        pLeft =
9110: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
9120: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a  >pLeft;.      }.
9130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
9140: 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
9150: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
9160: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
9170: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20   0);.      pNew 
9180: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9190: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44  Parse, TK_IN, pD
91a0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
91b0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
91c0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
91d0: 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65  .        transfe
91e0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
91f0: 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
9200: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9210: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
9220: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
9230: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
9240: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
9250: 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65  t;.        idxNe
9260: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
9270: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c  nsert(pWC, pNew,
9280: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
9290: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
92a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
92b0: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
92c0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
92d0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
92e0: 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  w);.        pTer
92f0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
9300: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61  erm];.        ma
9310: 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57  rkTermAsChild(pW
9320: 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65  C, idxNew, idxTe
9330: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
9340: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9350: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9360: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
9370: 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d    }.      pTerm-
9380: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
9390: 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31  NOOP;  /* case 1
93a0: 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a   trumps case 2 *
93b0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  /.    }.  }.}.#e
93c0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
93d0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
93e0: 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f  TION && !SQLITE_
93f0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
9400: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75  ../*.** The inpu
9410: 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
9420: 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72  e is an WhereTer
9430: 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  m structure with
9440: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45   only the.** "pE
9450: 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65  xpr" field fille
9460: 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f  d in.  The job o
9470: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
9480: 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  s to analyze the
9490: 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f  .** subexpressio
94a0: 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  n and populate a
94b0: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65  ll the other fie
94c0: 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65  lds of the Where
94d0: 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72  Term.** structur
94e0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
94f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
9500: 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72   the form "<expr
9510: 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74  > <op> X" it get
9520: 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f  s commuted.** to
9530: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f   the standard fo
9540: 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65  rm of "X <op> <e
9550: 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xpr>"..**.** If 
9560: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9570: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
9580: 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62   <op> Y" where b
9590: 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a  oth X and Y are.
95a0: 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  ** columns, then
95b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
95c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68  pression is unch
95d0: 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20  anged and a new 
95e0: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
95f0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c  of the form "Y <
9600: 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20  op> X" is added 
9610: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
9620: 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  use and.** analy
9630: 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  zed separately. 
9640: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
9650: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
9660: 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a  h TERM_COPIED.**
9670: 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72   and the new ter
9680: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
9690: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62   TERM_DYNAMIC (b
96a0: 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70  ecause it's pExp
96b0: 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65  r.** needs to be
96c0: 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20   freed with the 
96d0: 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64  WhereClause) and
96e0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62   TERM_VIRTUAL (b
96f0: 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20  ecause it.** is 
9700: 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20  a commuted copy 
9710: 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e  of a prior term.
9720: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
9730: 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d  term has nChild=
9740: 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70  1.** and the cop
9750: 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20  y has idxParent 
9760: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
9770: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
9780: 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63   term..*/.static
9790: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
97a0: 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e(.  SrcList *pS
97b0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
97c0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
97d0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
97e0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
97f0: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
9800: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
9810: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
9820: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
9830: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  the term to be a
9840: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20  nalyzed */.){.  
9850: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
9860: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
9870: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
9880: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
9890: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
98a0: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
98b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
98c0: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
98d0: 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d  yzed */.  WhereM
98e0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
98f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
9900: 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78  t of table index
9910: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72   masks */.  Expr
9920: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20   *pExpr;        
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9940: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
9950: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
9960: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
9970: 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  qLeft;          
9980: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
9990: 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70  ites of the pExp
99a0: 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69  r->pLeft */.  Bi
99b0: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99d0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
99e0: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69  of pExpr */.  Bi
99f0: 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74  tmask extraRight
9a00: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
9a10: 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e  * Extra dependen
9a20: 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49  cies on LEFT JOI
9a30: 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74  N */.  Expr *pSt
9a40: 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  r1 = 0;         
9a50: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
9a60: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
9a70: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ator */.  int is
9a80: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20  Complete = 0;   
9a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
9aa0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65  S of LIKE/GLOB e
9ab0: 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72  nds with wildcar
9ac0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73  d */.  int noCas
9ad0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
9ae0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f          /* LIKE/
9af0: 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68  GLOB distinguish
9b00: 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  es case */.  int
9b10: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b30: 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61   Top-level opera
9b40: 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20  tor.  pExpr->op 
9b50: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
9b60: 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
9b70: 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67  rse;  /* Parsing
9b80: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
9b90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9ba0: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f  se->db;        /
9bb0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
9bc0: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
9bd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9be0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
9bf0: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
9c00: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
9c10: 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57    pMaskSet = &pW
9c20: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a  Info->sMaskSet;.
9c30: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
9c40: 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >pExpr;.  assert
9c50: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
9c60: 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  AS && pExpr->op!
9c70: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20  =TK_COLLATE );. 
9c80: 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78   prereqLeft = ex
9c90: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
9ca0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c  skSet, pExpr->pL
9cb0: 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78  eft);.  op = pEx
9cc0: 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  pr->op;.  if( op
9cd0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  ==TK_IN ){.    a
9ce0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
9cf0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
9d00: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
9d10: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
9d20: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
9d30: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
9d40: 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74  ght = exprSelect
9d50: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9d60: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Set, pExpr->x.pS
9d70: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
9d80: 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e{.      pTerm->
9d90: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
9da0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
9db0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
9dc0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
9dd0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  }.  }else if( op
9de0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
9df0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
9e00: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Right = 0;.  }el
9e10: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70  se{.    pTerm->p
9e20: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9e30: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
9e40: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  kSet, pExpr->pRi
9e50: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72  ght);.  }.  prer
9e60: 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c  eqAll = exprTabl
9e70: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
9e80: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45   pExpr);.  if( E
9e90: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9ea0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
9eb0: 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  n) ){.    Bitmas
9ec0: 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k x = getMask(pM
9ed0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  askSet, pExpr->i
9ee0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b  RightJoinTable);
9ef0: 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c  .    prereqAll |
9f00: 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69  = x;.    extraRi
9f10: 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f  ght = x-1;  /* O
9f20: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  N clause terms m
9f30: 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77  ay not be used w
9f40: 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20  ith an index.   
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f60: 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74      ** on left t
9f70: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
9f80: 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30  OIN.  Ticket #30
9f90: 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72  15 */.  }.  pTer
9fa0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
9fb0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72  rereqAll;.  pTer
9fc0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
9fd0: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  -1;.  pTerm->iPa
9fe0: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rent = -1;.  pTe
9ff0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
a000: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64  0;.  if( allowed
a010: 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78  Op(op) ){.    Ex
a020: 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr *pLeft = sqli
a030: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
a040: 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  te(pExpr->pLeft)
a050: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
a060: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
a070: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
a080: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
a090: 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54  u16 opMask = (pT
a0a0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a0b0: 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d   & prereqLeft)==
a0c0: 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f  0 ? WO_ALL : WO_
a0d0: 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70  EQUIV;.    if( p
a0e0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
a0f0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65  UMN ){.      pTe
a100: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
a110: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
a120: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c        pTerm->u.l
a130: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
a140: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
a150: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
a160: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
a170: 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a  k(op) & opMask;.
a180: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52      }.    if( pR
a190: 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e  ight && pRight->
a1a0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
a1b0: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
a1c0: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78   *pNew;.      Ex
a1d0: 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  pr *pDup;.      
a1e0: 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30  u16 eExtraOp = 0
a1f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  ;        /* Extr
a200: 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d  a bits for pNew-
a210: 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  >eOperator */.  
a220: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
a230: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
a240: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
a250: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
a260: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a270: 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
a280: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
a290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a2a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a2b0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a2c0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
a2d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
a2e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e    }.        idxN
a2f0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
a300: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
a310: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
a320: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
a330: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
a340: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a350: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
a360: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
a370: 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73        markTermAs
a380: 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65  Child(pWC, idxNe
a390: 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  w, idxTerm);.   
a3a0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
a3b0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
a3c0: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74         pTerm->wt
a3d0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
a3e0: 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  PIED;.        if
a3f0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a400: 45 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  EQ.         && !
a410: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a420: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
a430: 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  in).         && 
a440: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
a450: 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54  led(db, SQLITE_T
a460: 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20  ransitive).     
a470: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
a480: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
a490: 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20   |= WO_EQUIV;.  
a4a0: 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70          eExtraOp
a4b0: 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20   = WO_EQUIV;.   
a4c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
a4d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70  se{.        pDup
a4e0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
a4f0: 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a    pNew = pTerm;.
a500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
a510: 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65  prCommute(pParse
a520: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70  , pDup);.      p
a530: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
a540: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44  prSkipCollate(pD
a550: 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  up->pLeft);.    
a560: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73    pNew->leftCurs
a570: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
a580: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  le;.      pNew->
a590: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
a5a0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
a5b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
a5c0: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
a5d0: 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72  raRight) != prer
a5e0: 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  eqLeft );.      
a5f0: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68  pNew->prereqRigh
a600: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c  t = prereqLeft |
a610: 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20   extraRight;.   
a620: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41     pNew->prereqA
a630: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
a640: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65        pNew->eOpe
a650: 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f  rator = (operato
a660: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20  rMask(pDup->op) 
a670: 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70  + eExtraOp) & op
a680: 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Mask;.    }.  }.
a690: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a6a0: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
a6b0: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49  IMIZATION.  /* I
a6c0: 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20  f a term is the 
a6d0: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
a6e0: 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77  , create two new
a6f0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20   virtual terms. 
a700: 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20   ** that define 
a710: 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74  the range that t
a720: 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65  he BETWEEN imple
a730: 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d  ments.  For exam
a740: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
a750: 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20      a BETWEEN b 
a760: 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20  AND c.  **.  ** 
a770: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
a780: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
a790: 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41    (a BETWEEN b A
a7a0: 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29  ND c) AND (a>=b)
a7b0: 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a   AND (a<=c).  **
a7c0: 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65  .  ** The two ne
a7d0: 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  w terms are adde
a7e0: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
a7f0: 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  f the WhereClaus
a800: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  e object..  ** T
a810: 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  he new terms are
a820: 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61   "dynamic" and a
a830: 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74  re children of t
a840: 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57  he original BETW
a850: 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20  EEN.  ** term.  
a860: 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  That means that 
a870: 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74  if the BETWEEN t
a880: 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68  erm is coded, th
a890: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20  e children are. 
a8a0: 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72   ** skipped.  Or
a8b0: 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65  , if the childre
a8c0: 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20  n are satisfied 
a8d0: 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  by an index, the
a8e0: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42   original.  ** B
a8f0: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73  ETWEEN term is s
a900: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
a910: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
a920: 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26  p==TK_BETWEEN &&
a930: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
a940: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
a950: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
a960: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  >x.pList;.    in
a970: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
a980: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
a990: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
a9a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
a9b0: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
a9c0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
a9d0: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
a9e0: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
a9f0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
aa00: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
aa10: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
aa20: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
aa30: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70  PExpr(pParse, op
aa40: 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  s[i], .         
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
aa70: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  up(db, pExpr->pL
aa80: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
aab0: 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
aac0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20  a[i].pExpr, 0), 
aad0: 30 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66  0);.      transf
aae0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
aaf0: 4e 65 77 45 78 70 72 2c 20 70 45 78 70 72 29 3b  NewExpr, pExpr);
ab00: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
ab10: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
ab20: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
ab30: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
ab40: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
ab50: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
ab60: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
ab70: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
ab80: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
ab90: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
aba0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
abb0: 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73        markTermAs
abc0: 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65  Child(pWC, idxNe
abd0: 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  w, idxTerm);.   
abe0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
abf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
ac00: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
ac10: 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  N */..#if !defin
ac20: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
ac30: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
ac40: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ac50: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ac60: 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ).  /* Analyze a
ac70: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f   term that is co
ac80: 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72  mposed of two or
ac90: 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63   more subterms c
aca0: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a  onnected by.  **
acb0: 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e   an OR operator.
acc0: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
acd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
ace0: 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
acf0: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44   pWC->op==TK_AND
ad00: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
ad10: 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20  yzeOrTerm(pSrc, 
ad20: 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20  pWC, idxTerm);. 
ad30: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
ad40: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d  >a[idxTerm];.  }
ad50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ad60: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
ad70: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
ad80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
ad90: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
ada0: 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72  .  /* Add constr
adb0: 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20  aints to reduce 
adc0: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
add0: 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   on a LIKE or GL
ade0: 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  OB.  ** operator
adf0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69  ..  **.  ** A li
ae00: 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68  ke pattern of th
ae10: 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27  e form "x LIKE '
ae20: 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65  abc%'" is change
ae30: 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e  d into constrain
ae40: 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  ts.  **.  **    
ae50: 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41        x>='abc' A
ae60: 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78  ND x<'abd' AND x
ae70: 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a   LIKE 'abc%'.  *
ae80: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20  *.  ** The last 
ae90: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
aea0: 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73   prefix "abc" is
aeb0: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20   incremented to 
aec0: 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65  form the.  ** te
aed0: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74  rmination condit
aee0: 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a  ion "abd"..  */.
aef0: 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54    if( pWC->op==T
af00: 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c  K_AND .   && isL
af10: 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65  ikeOrGlob(pParse
af20: 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c  , pExpr, &pStr1,
af30: 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e   &isComplete, &n
af40: 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20  oCase).  ){.    
af50: 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20  Expr *pLeft;    
af60: 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b     /* LHS of LIK
af70: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
af80: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  */.    Expr *pSt
af90: 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  r2;       /* Cop
afa0: 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53  y of pStr1 - RHS
afb0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
afc0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
afd0: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20  pr *pNewExpr1;. 
afe0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
aff0: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  r2;.    int idxN
b000: 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  ew1;.    int idx
b010: 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  New2;.    Token 
b020: 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f  sCollSeqName;  /
b030: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  * Name of collat
b040: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
b050: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
b060: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
b070: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
b080: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
b090: 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30  Dup(db, pStr1, 0
b0a0: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
b0b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
b0c0: 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b        u8 c, *pC;
b0d0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63         /* Last c
b0e0: 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20  haracter before 
b0f0: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  the first wildca
b100: 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  rd */.      pC =
b110: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e   (u8*)&pStr2->u.
b120: 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74  zToken[sqlite3St
b130: 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e  rlen30(pStr2->u.
b140: 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20  zToken)-1];.    
b150: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
b160: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
b170: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
b180: 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d  int is to increm
b190: 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61  ent the last cha
b1a0: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b1b0: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
b1c0: 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75  ** wildcard.  Bu
b1d0: 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e  t if we incremen
b1e0: 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c  t '@', that will
b1f0: 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68   push it into th
b200: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70  e.        ** alp
b210: 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68  habetic range wh
b220: 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73  ere case convers
b230: 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75  ions will mess u
b240: 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  p the .        *
b250: 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54  * inequality.  T
b260: 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61  o avoid this, ma
b270: 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20  ke sure to also 
b280: 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20  run the full.   
b290: 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20       ** LIKE on 
b2a0: 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78  all candidate ex
b2b0: 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65  pressions by cle
b2c0: 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70  aring the isComp
b2d0: 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20  lete flag.      
b2e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
b2f0: 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f   c=='A'-1 ) isCo
b300: 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20  mplete = 0;.    
b310: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
b320: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
b330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
b340: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
b350: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
b360: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
b370: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
b380: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
b390: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
b3a0: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
b3b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b3c0: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
b3d0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b3e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b3f0: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
b400: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
b410: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
b420: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
b430: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
b440: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
b450: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
b460: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
b470: 77 45 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a  wExpr1, pExpr);.
b480: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
b490: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b4a0: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
b4b0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b4c0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b4d0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b4e0: 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  1==0 );.    expr
b4f0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b500: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
b510: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
b520: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b530: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
b540: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b550: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b560: 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_LT,.         
b570: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
b580: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
b590: 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73  rse,pNewExpr2,&s
b5a0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
b5b0: 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20           pStr2, 
b5c0: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
b5d0: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
b5e0: 77 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a  wExpr2, pExpr);.
b5f0: 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68      idxNew2 = wh
b600: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b610: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20  pWC, pNewExpr2, 
b620: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b630: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b640: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b650: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  2==0 );.    expr
b660: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b670: 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20  C, idxNew2);.   
b680: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b690: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69  [idxTerm];.    i
b6a0: 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b  f( isComplete ){
b6b0: 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41  .      markTermA
b6c0: 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e  sChild(pWC, idxN
b6d0: 65 77 31 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20  ew1, idxTerm);. 
b6e0: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
b6f0: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
b700: 32 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  2, idxTerm);.   
b710: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
b720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
b730: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
b740: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
b750: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
b760: 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57  BLE.  /* Add a W
b770: 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72  O_MATCH auxiliar
b780: 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f  y term to the co
b790: 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20  nstraint set if 
b7a0: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
b7b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
b7c0: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c  f the form:  col
b7d0: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a  umn MATCH expr..
b7e0: 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d    ** This inform
b7f0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ation is used by
b800: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
b810: 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20  methods of.  ** 
b820: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
b830: 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72   The native quer
b840: 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73  y optimizer does
b850: 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a   not attempt.  *
b860: 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  * to do anything
b870: 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63   with MATCH func
b880: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
b890: 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  ( isMatchOfColum
b8a0: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
b8b0: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
b8c0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
b8d0: 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54  Left;.    WhereT
b8e0: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
b8f0: 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
b900: 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45  qColumn, prereqE
b910: 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74  xpr;..    pRight
b920: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
b930: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
b940: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
b950: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b960: 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65  pExpr;.    prere
b970: 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c  qExpr = exprTabl
b980: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
b990: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72   pRight);.    pr
b9a0: 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70  ereqColumn = exp
b9b0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
b9c0: 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20  kSet, pLeft);.  
b9d0: 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70    if( (prereqExp
b9e0: 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  r & prereqColumn
b9f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
ba00: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
ba10: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
ba20: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
ba30: 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20  se, TK_MATCH, . 
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
ba60: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ba70: 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30  b, pRight, 0), 0
ba80: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
ba90: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
baa0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
bab0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
bac0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
bad0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
bae0: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
baf0: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
bb00: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
bb10: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
bb20: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
bb30: 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
bb40: 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
bb50: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
bb60: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
bb70: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
bb80: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
bb90: 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
bba0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
bbb0: 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 6d  O_MATCH;.      m
bbc0: 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70  arkTermAsChild(p
bbd0: 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54  WC, idxNew, idxT
bbe0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 54 65 72  erm);.      pTer
bbf0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
bc00: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
bc10: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
bc20: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
bc30: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
bc40: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
bc50: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
bc60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
bc70: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
bc80: 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
bc90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
bca0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
bcb0: 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73  /* When sqlite_s
bcc0: 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
bcd0: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
bce0: 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20   an operator of 
bcf0: 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78  the.  ** form "x
bd00: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61   IS NOT NULL" ca
bd10: 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65  n sometimes be e
bd20: 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66  valuated more ef
bd30: 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61  ficiently.  ** a
bd40: 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20  s "x>NULL" if x 
bd50: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
bd60: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
bd70: 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20  So construct a. 
bd80: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d   ** virtual term
bd90: 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20   of that form.. 
bda0: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
bdb0: 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
bdc0: 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67  erm must be tagg
bdd0: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55  ed with TERM_VNU
bde0: 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54  LL.  This.  ** T
bdf0: 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69  ERM_VNULL tag wi
be00: 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20  ll suppress the 
be10: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
be20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
be30: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70    ** of the loop
be40: 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54  .  Without the T
be50: 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20  ERM_VNULL flag, 
be60: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
be70: 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  ck at.  ** the s
be80: 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tart of the loop
be90: 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e   will prevent an
bea0: 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62  y results from b
beb0: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20  eing returned.. 
bec0: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
bed0: 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a  >op==TK_NOTNULL.
bee0: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
bef0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
bf00: 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  N.   && pExpr->p
bf10: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Left->iColumn>=0
bf20: 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
bf30: 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
bf40: 51 4c 49 54 45 5f 53 74 61 74 33 34 29 0a 20 20  QLITE_Stat34).  
bf50: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
bf60: 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
bf70: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
bf80: 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
bf90: 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
bfa0: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
bfb0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
bfc0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
bfd0: 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
c000: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
c010: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
c040: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
c050: 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
c060: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
c070: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c080: 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
c0b0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
c0c0: 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
c0d0: 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
c0e0: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
c0f0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
c100: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
c110: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
c120: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
c130: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
c140: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
c150: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
c160: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
c170: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
c180: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c190: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
c1a0: 5f 47 54 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54  _GT;.      markT
c1b0: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20  ermAsChild(pWC, 
c1c0: 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29  idxNew, idxTerm)
c1d0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
c1e0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
c1f0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
c200: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
c210: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
c220: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
c230: 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
c240: 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
c250: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c260: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
c270: 53 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50  STAT4 */..  /* P
c280: 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65  revent ON clause
c290: 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54   terms of a LEFT
c2a0: 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67   JOIN from being
c2b0: 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20   used to drive. 
c2c0: 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72   ** an index for
c2d0: 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
c2e0: 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
c2f0: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70  .  */.  pTerm->p
c300: 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78  rereqRight |= ex
c310: 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a  traRight;.}../*.
c320: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c330: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
c340: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
c350: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
c360: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
c370: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
c380: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
c390: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
c3a0: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
c3b0: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
c3c0: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
c3d0: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
c3e0: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
c3f0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
c400: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
c410: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
c420: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
c430: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
c440: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
c450: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
c460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
c470: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
c480: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
c490: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c4b0: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
c4c0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
c4d0: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
c4e0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c500: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
c510: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
c520: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c540: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
c550: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
c560: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
c570: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
c580: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
c590: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
c5a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
c5b0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
c5c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
c5d0: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
c5e0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
c5f0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
c600: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
c610: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
c620: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
c630: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
c640: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
c650: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
c660: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
c670: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
c680: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
c690: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41  pr);.      if( A
c6a0: 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20  LWAYS(pColl) && 
c6b0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
c6c0: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
c6d0: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
c6e0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20    return i;.    
c6f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
c700: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
c710: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
c720: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
c730: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
c740: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74   passed as the t
c750: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  hird argument.**
c760: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a   is redundant..*
c770: 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20  *.** A DISTINCT 
c780: 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e  list is redundan
c790: 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  t if the databas
c7a0: 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  e contains some 
c7b0: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c  subset of.** col
c7c0: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 75 6e  umns that are un
c7d0: 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c  ique and non-nul
c7e0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
c7f0: 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
c800: 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  dant(.  Parse *p
c810: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c820: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c830: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
c840: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
c850: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
c860: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
c870: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
c880: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
c890: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
c8a0: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
c8b0: 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct       /* The 
c8c0: 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74 20  result set that 
c8d0: 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53 54  needs to be DIST
c8e0: 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  INCT */.){.  Tab
c8f0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
c900: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
c910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c920: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
c930: 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49  t iBase;..  /* I
c940: 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20  f there is more 
c950: 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f  than one table o
c960: 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20  r sub-select in 
c970: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
c980: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65  of.  ** this que
c990: 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ry, then it will
c9a0: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
c9b0: 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
c9c0: 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a  e DISTINCT .  **
c9d0: 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e   clause is redun
c9e0: 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  dant. */.  if( p
c9f0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31  TabList->nSrc!=1
ca00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
ca10: 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d  Base = pTabList-
ca20: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
ca30: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
ca40: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
ca50: 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
ca60: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
ca70: 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e  an IPK column on
ca80: 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68   table iBase, th
ca90: 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20  en return .  ** 
caa0: 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20  true. Note: The 
cab0: 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73  (p->iTable==iBas
cac0: 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  e) part of this 
cad0: 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73  test may be fals
cae0: 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  e if the.  ** cu
caf0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20  rrent SELECT is 
cb00: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
cb10: 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
cb20: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
cb30: 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
cb40: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
cb50: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
cb60: 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74  ollate(pDistinct
cb70: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
cb80: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
cb90: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
cba0: 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70  able==iBase && p
cbb0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
cbc0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
cbd0: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
cbe0: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  ll indices on th
cbf0: 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e  e table, checkin
cc00: 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69 66  g each to see if
cc10: 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74   it makes.  ** t
cc20: 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
cc30: 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e  ifier redundant.
cc40: 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a   It does so if:.
cc50: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
cc60: 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73 65  he index is itse
cc70: 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20  lf UNIQUE, and. 
cc80: 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c   **.  **   2. Al
cc90: 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  l of the columns
cca0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
ccb0: 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f 66  e either part of
ccc0: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20   the pDistinct. 
ccd0: 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f   **      list, o
cce0: 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52 45  r else the WHERE
ccf0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
cd00: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
cd10: 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a  orm "col=X",.  *
cd20: 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20 69  *      where X i
cd30: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  s a constant val
cd40: 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  ue. The collatio
cd50: 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74  n sequences of t
cd60: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d  he.  **      com
cd70: 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65  parison and sele
cd80: 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69  ct-list expressi
cd90: 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74  ons must match t
cda0: 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65  hose of the inde
cdb0: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33  x..  **.  **   3
cdc0: 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69  . All of those i
cdd0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  ndex columns for
cde0: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
cdf0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
ce00: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  .  **      conta
ce10: 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72  in a "col=X" ter
ce20: 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f  m are subject to
ce30: 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73   a NOT NULL cons
ce40: 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
ce50: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
ce60: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
ce70: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
ce80: 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65     if( !IsUnique
ce90: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
cea0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
ceb0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
cec0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
ced0: 20 20 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64    i16 iCol = pId
cee0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
cef0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e        if( 0==fin
cf00: 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65  dTerm(pWC, iBase
cf10: 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73  , iCol, ~(Bitmas
cf20: 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  k)0, WO_EQ, pIdx
cf30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
cf40: 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49   iIdxCol = findI
cf50: 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20  ndexCol(pParse, 
cf60: 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65  pDistinct, iBase
cf70: 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20  , pIdx, i);.    
cf80: 20 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c      if( iIdxCol<
cf90: 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 || pTab->aCol[
cfa0: 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  iCol].notNull==0
cfb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
cfc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
cfd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cfe0: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
cff0: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
d000: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
d010: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
d020: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
d030: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
d040: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
d050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
d060: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
d070: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
d080: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
d090: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
d0a0: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
d0b0: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
d0c0: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74  LogEst N){.  ret
d0d0: 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20  urn N<=10 ? 0 : 
d0e0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
d0f0: 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 33;.}../*.** 
d100: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
d110: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
d120: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
d130: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
d140: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
d150: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
d160: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
d170: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
d180: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
d190: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
d1a0: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
d1b0: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
d1c0: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
d1d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d1e0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d1f0: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
d200: 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
d210: 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f  ABLED).static vo
d220: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
d230: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
d240: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
d250: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
d260: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
d270: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
d280: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
d290: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
d2a0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d2b0: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
d2c0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
d2d0: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
d2e0: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
d2f0: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
d300: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
d310: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
d320: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d330: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
d340: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d350: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
d360: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
d370: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
d380: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d390: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
d3a0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
d3b0: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
d3c0: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
d3d0: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
d3e0: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
d3f0: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
d400: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
d410: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
d420: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
d430: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
d440: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
d450: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
d460: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
d470: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
d480: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
d490: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
d4a0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
d4b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d4c0: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
d4d0: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
d4e0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
d4f0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d500: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
d510: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
d520: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
d530: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
d540: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
d550: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
d560: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
d570: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
d580: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
d590: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
d5a0: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
d5b0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
d5c0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
d5d0: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
d5e0: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
d5f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d600: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
d610: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
d620: 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c  atedCost);.  sql
d630: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d640: 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73  "  estimatedRows
d650: 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74  =%lld\n", p->est
d660: 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23  imatedRows);.}.#
d670: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
d680: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
d690: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
d6a0: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
d6b0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
d6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
d6d0: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
d6e0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
d6f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
d700: 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66  term pTerm is of
d710: 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74   a form where it
d720: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65  .** could be use
d730: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
d740: 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20  to access pSrc, 
d750: 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72  assuming an appr
d760: 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78  opriate.** index
d770: 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   existed..*/.sta
d780: 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44  tic int termCanD
d790: 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65  riveIndex(.  Whe
d7a0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d7c0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
d7d0: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73   to check */.  s
d7e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
d7f0: 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  em *pSrc,     /*
d800: 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72   Table we are tr
d810: 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a  ying to access *
d820: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
d830: 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20  eady            
d840: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20     /* Tables in 
d850: 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74  outer loops of t
d860: 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  he join */.){.  
d870: 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20  char aff;.  if( 
d880: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
d890: 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r!=pSrc->iCursor
d8a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d8b0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
d8c0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30  ator & WO_EQ)==0
d8d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d8e0: 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
d8f0: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
d900: 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)!=0 ) return 0
d910: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75  ;.  if( pTerm->u
d920: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20  .leftColumn<0 ) 
d930: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20  return 0;.  aff 
d940: 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43  = pSrc->pTab->aC
d950: 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  ol[pTerm->u.left
d960: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
d970: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
d980: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
d990: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66  pTerm->pExpr, af
d9a0: 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  f) ) return 0;. 
d9b0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
d9c0: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
d9d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
d9e0: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
d9f0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
da00: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
da10: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
da20: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
da30: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
da40: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
da50: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
da60: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
da70: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
da80: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
da90: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
daa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dab0: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
dac0: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
dad0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
dae0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
daf0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
db00: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
db10: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
db20: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
db30: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
db40: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
db50: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
db60: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
db70: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
db80: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
db90: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
dba0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
dbb0: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
dbc0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
dbd0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
dbe0: 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
dbf0: 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
dc00: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
dc10: 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  t nKeyCol;      
dc20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
dc30: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
dc40: 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
dc50: 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
dc60: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
dc70: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
dc80: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
dc90: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
dca0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
dcb0: 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
dcc0: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
dcd0: 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  ] */.  Index *pI
dce0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
dcf0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
dd00: 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
dd10: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
dd20: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd40: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
dd50: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
dd60: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
dd70: 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
dd80: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
dd90: 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
dda0: 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
ddb0: 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
ddc0: 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
ddd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
dde0: 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
ddf0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
de00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de10: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
de20: 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
de30: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
de40: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
de50: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
de60: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
de70: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
dea0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
deb0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
dec0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ded0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
dee0: 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
def0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
df00: 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
df10: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
df20: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df40: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
df50: 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
df60: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
df70: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
df80: 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
df90: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
dfa0: 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  *zNotUsed;      
dfb0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
dfc0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64  space on the end
dfd0: 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69   of pIdx */.  Bi
dfe0: 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
dff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
e000: 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
e010: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
e020: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
e030: 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
e040: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
e050: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
e060: 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61  s */.  u8 sentWa
e070: 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  rning = 0;      
e080: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
e090: 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65  warnning has bee
e0a0: 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78  n issued */.  Ex
e0b0: 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30  pr *pPartial = 0
e0c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
e0d0: 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65  tial Index Expre
e0e0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
e0f0: 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20  Continue = 0;   
e100: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
e110: 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c  ere to skip excl
e120: 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 0a 20 20  uded rows */..  
e130: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
e140: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68   to skip over th
e150: 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69  e creation and i
e160: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
e170: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69   the.  ** transi
e180: 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64  ent index on 2nd
e190: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
e1a0: 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  iterations of th
e1b0: 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d  e loop. */.  v =
e1c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
e1d0: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
e1e0: 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73  ;.  addrInit = s
e1f0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
e200: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
e210: 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  rage(v);..  /* C
e220: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
e230: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
e240: 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
e250: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
e260: 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
e270: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
e280: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
e290: 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nKeyCol = 0;.  p
e2a0: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
e2b0: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
e2c0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
e2d0: 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  m];.  pLoop = pL
e2e0: 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
e2f0: 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
e300: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
e310: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
e320: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
e330: 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d   pLoop->prereq==
e340: 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
e350: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
e360: 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20  _VIRTUAL)==0.   
e370: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
e380: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
e390: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 53  pTerm->pExpr, pS
e3a0: 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a  rc->iCursor) ){.
e3b0: 20 20 20 20 20 20 70 50 61 72 74 69 61 6c 20 3d        pPartial =
e3c0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
e3d0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72  pParse->db, pPar
e3e0: 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tial,.          
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e410: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
e420: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30   pTerm->pExpr, 0
e430: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
e440: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
e450: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
e460: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
e470: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
e480: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
e490: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
e4a0: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
e4b0: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
e4c0: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
e4d0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
e4e0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
e4f0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e500: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
e510: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
e520: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
e530: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
e540: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
e550: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
e560: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
e570: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
e580: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
e590: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
e5a0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
e5b0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
e5c0: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
e5d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e5e0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
e5f0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
e600: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
e610: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
e620: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
e630: 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol+1) ){.       
e640: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f     goto end_auto
e650: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
e660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e670: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
e680: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
e690: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
e6a0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
e6b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e6c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
e6d0: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
e6e0: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
e6f0: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
e700: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
e710: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
e720: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
e730: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
e740: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e760: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
e770: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
e780: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
e790: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
e7a0: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
e7b0: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
e7c0: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
e7d0: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
e7e0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
e7f0: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
e800: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
e810: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
e820: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
e830: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
e840: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
e850: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
e860: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
e870: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
e880: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
e890: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
e8a0: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
e8b0: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
e8c0: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
e8d0: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
e8e0: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
e8f0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
e900: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
e910: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
e920: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
e930: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
e940: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
e950: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
e960: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
e970: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
e980: 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c   MIN(BMS-1,pTabl
e990: 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74  e->nCol);.  test
e9a0: 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
e9b0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
e9c0: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
e9d0: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
e9e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
e9f0: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
ea00: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
ea10: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b   MASKBIT(i) ) nK
ea20: 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69  eyCol++;.  }.  i
ea30: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
ea40: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
ea50: 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c  ) ){.    nKeyCol
ea60: 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
ea70: 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
ea80: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
ea90: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
eaa0: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
eab0: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64  s index */.  pId
eac0: 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
ead0: 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70  ateIndexObject(p
eae0: 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43  Parse->db, nKeyC
eaf0: 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  ol+1, 0, &zNotUs
eb00: 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  ed);.  if( pIdx=
eb10: 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75  =0 ) goto end_au
eb20: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
eb30: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
eb40: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
eb50: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
eb60: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
eb70: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
eb80: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
eb90: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
eba0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
ebb0: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
ebc0: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
ebd0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
ebe0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
ebf0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
ec00: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
ec10: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
ec20: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
ec30: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
ec40: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
ec50: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
ec60: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
ec70: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
ec80: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
ec90: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
eca0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
ecb0: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
ecc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
ecd0: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
ece0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
ecf0: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
ed00: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
ed10: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
ed20: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
ed30: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
ed40: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
ed50: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
ed60: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
ed70: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
ed80: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
ed90: 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70  ll[n] = ALWAYS(p
eda0: 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  Coll) ? pColl->z
edb0: 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b  Name : "BINARY";
edc0: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
edd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ede0: 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
edf0: 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ==pLoop->u.btree
ee00: 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
ee10: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
ee20: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
ee30: 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
ee40: 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
ee50: 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
ee60: 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
ee70: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
ee80: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
ee90: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
eea0: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ) ){.      pIdx-
eeb0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
eec0: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
eed0: 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
eee0: 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
eef0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
ef00: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  Src->colUsed & M
ef10: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b  ASKBIT(BMS-1) ){
ef20: 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31  .    for(i=BMS-1
ef30: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
ef40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  ; i++){.      pI
ef50: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
ef60: 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
ef70: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
ef80: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
ef90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
efa0: 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c  sert( n==nKeyCol
efb0: 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f   );.  pIdx->aiCo
efc0: 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20  lumn[n] = -1;.  
efd0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
efe0: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f  = "BINARY";..  /
eff0: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
f000: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
f010: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
f020: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
f030: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
f040: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
f050: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
f060: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
f070: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
f080: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
f090: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
f0a0: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
f0b0: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
f0c0: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
f0d0: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
f0e0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
f0f0: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
f100: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
f110: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
f120: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f130: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
f140: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
f150: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f160: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
f170: 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62  l->iTabCur); Vdb
f180: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f190: 69 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a  if( pPartial ){.
f1a0: 20 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20      iContinue = 
f1b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
f1c0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
f1d0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
f1e0: 70 50 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c  pParse, pPartial
f1f0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c  , iContinue, SQL
f200: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
f210: 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
f220: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52  ags |= WHERE_PAR
f230: 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72  TIALIDX;.  }.  r
f240: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
f250: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f260: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  rse);.  sqlite3G
f270: 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
f280: 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
f290: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
f2a0: 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20  egRecord, 0, 0, 
f2b0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
f2c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f2d0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76  _IdxInsert, pLev
f2e0: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67  el->iIdxCur, reg
f2f0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
f300: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
f310: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
f320: 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70  RESULT);.  if( p
f330: 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65  Partial ) sqlite
f340: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f350: 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
f360: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f370: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
f380: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
f390: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
f3a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f3c0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
f3d0: 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
f3e0: 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
f3f0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
f400: 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
f410: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f420: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
f430: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rd);.  sqlite3Ex
f440: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
f450: 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  e);.  .  /* Jump
f460: 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
f470: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
f480: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
f490: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f4a0: 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65  v, addrInit);..e
f4b0: 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
f4c0: 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45  eate:.  sqlite3E
f4d0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
f4e0: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b  ->db, pPartial);
f4f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f500: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
f510: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
f520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f530: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
f540: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
f550: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
f560: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f570: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
f580: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
f590: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
f5a0: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
f5b0: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
f5c0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
f5d0: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
f5e0: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
f5f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
f600: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
f610: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
f620: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
f630: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
f640: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f650: 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
f660: 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
f670: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
f680: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
f690: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
f6a0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
f6b0: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
f6c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
f6d0: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
f6e0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f6f0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
f700: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
f710: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
f720: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
f730: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
f740: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f750: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
f760: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
f770: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
f780: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
f790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
f7a0: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
f7b0: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
f7c0: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
f7d0: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
f7e0: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
f7f0: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
f800: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
f810: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
f820: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
f830: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
f840: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
f850: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
f860: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
f870: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
f880: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
f890: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
f8a0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
f8b0: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
f8c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
f8d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
f8e0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
f8f0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
f900: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f910: 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  _ALL );.    if( 
f920: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
f930: 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c  r & ~(WO_ISNULL|
f940: 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20  WO_EQUIV))==0 ) 
f950: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
f960: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
f970: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
f980: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
f990: 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
f9a0: 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
f9b0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
f9c0: 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
f9d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
f9e0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
f9f0: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
fa00: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
fa10: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
fa20: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
fa30: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
fa40: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
fa50: 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
fa60: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
fa70: 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
fa80: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
fa90: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
faa0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
fab0: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
fac0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
fad0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
fae0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
faf0: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
fb00: 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
fb10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
fb20: 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
fb30: 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
fb40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
fb50: 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
fb60: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
fb70: 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
fb80: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
fb90: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
fba0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
fbb0: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
fbe0: 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
fbf0: 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
fc00: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
fc20: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
fc30: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
fc40: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
fc50: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
fc60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
fc70: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
fc80: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
fc90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
fca0: 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
fcb0: 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
fcc0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
fcd0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
fce0: 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64  .  ** many field
fcf0: 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
fd00: 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
fd10: 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
fd20: 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e  x from.  ** chan
fd30: 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
fd40: 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
fd50: 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
fd60: 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e  order to.  ** in
fd70: 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
fd80: 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ields..  */.  pI
fd90: 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
fda0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fdb0: 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
fdc0: 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f  Info[1];.  pIdxO
fdd0: 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
fde0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
fdf0: 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
fe00: 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61  s[nTerm];.  pUsa
fe10: 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
fe20: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
fe30: 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
fe40: 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
fe50: 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  By];.  *(int*)&p
fe60: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
fe70: 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
fe80: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
fe90: 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
fea0: 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
feb0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fec0: 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
fed0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
fee0: 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
fef0: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
ff00: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
ff10: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
ff20: 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
ff30: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
ff40: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
ff50: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
ff60: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
ff70: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f     pUsage;..  fo
ffd0: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
ffe0: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
fff0: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
10000 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20  +){.    u8 op;. 
10010 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
10020 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
10030 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
10040 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
10050 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
10060 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
10070 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
10080 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
10090 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
100a0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
100b0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
100c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
100d0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
100e0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
100f0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
10100 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
10110 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
10120 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
10130 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  UIV))==0 ) conti
10140 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
10150 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
10160 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
10170 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
10180 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
10190 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
101a0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
101b0 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
101c0 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
101d0 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
101e0 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
101f0 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
10200 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
10210 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
10220 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
10230 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
10240 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
10250 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
10260 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
10270 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
10280 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
10290 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
102a0 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
102b0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
102c0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
102d0 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
102e0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
102f0 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
10300 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10310 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
10320 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
10330 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10340 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
10350 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
10360 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10370 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
10380 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
10390 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
103a0 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
103b0 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
103c0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
103d0 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
103e0 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
103f0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
10400 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
10410 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
10420 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
10430 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
10440 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
10450 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
10460 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
10470 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
10480 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
10490 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
104a0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
104b0 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
104c0 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
104d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
104e0 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
104f0 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
10500 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
10510 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
10520 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
10530 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
10540 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
10550 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
10560 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
10570 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
10580 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
10590 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
105a0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
105b0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
105c0 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
105d0 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
105e0 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
105f0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
10600 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
10610 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
10620 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
10630 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
10640 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
10650 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
10660 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
10670 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
10680 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
10690 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
106a0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
106b0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
106c0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
106d0 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
106e0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
106f0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
10700 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
10710 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
10720 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
10730 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
10740 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
10750 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
10760 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
10770 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
10780 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
10790 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
107a0 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
107b0 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
107c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
107d0 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
107e0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
107f0 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
10800 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
10810 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
10820 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
10830 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
10840 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
10850 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
10860 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
10870 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
10880 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
10890 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
108a0 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
108b0 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
108c0 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
108d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
108e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
108f0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
10900 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
10910 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
10920 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
10930 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
10940 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10950 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
10960 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
10970 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
10980 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10990 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
109a0 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
109b0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
109c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
109d0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
109e0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
109f0 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
10a00 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
10a10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
10a20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
10a30 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
10a40 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
10a50 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
10a60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10a70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10a80 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
10a90 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
10aa0 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
10ab0 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
10ac0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
10ad0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
10ae0 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
10af0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
10b00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
10b10 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
10b20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10b30 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
10b40 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
10b50 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
10b60 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
10b70 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
10b80 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
10b90 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
10ba0 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
10bb0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
10bc0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
10bd0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
10be0 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
10bf0 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
10c00 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
10c10 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
10c20 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
10c30 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
10c40 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20  x of the sample 
10c50 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c  that is the smal
10c60 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  lest sample that
10c70 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
10c80 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
10c90 70 52 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pRec..*/.static 
10ca0 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74  int whereKeyStat
10cb0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
10cc0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
10cd0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
10ce0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  nection */.  Ind
10cf0 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
10d00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10d10 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f  x to consider do
10d20 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70  main of */.  Unp
10d30 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
10d40 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74  c,       /* Vect
10d50 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  or of values to 
10d60 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e  consider */.  in
10d70 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20  t roundUp,      
10d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75            /* Rou
10d90 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20  nd up if true.  
10da0 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61  Round down if fa
10db0 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  lse */.  tRowcnt
10dc0 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20   *aStat         
10dd0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61       /* OUT: sta
10de0 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ts written here 
10df0 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d  */.){.  IndexSam
10e00 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70  ple *aSample = p
10e10 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20  Idx->aSample;.  
10e20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
10e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10e40 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64  ndex of required
10e50 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d   stats in anEq[]
10e60 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   etc. */.  int i
10e70 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Min = 0;        
10e80 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65         /* Smalle
10e90 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65  st sample not ye
10ea0 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  t tested */.  in
10eb0 74 20 69 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d  t i = pIdx->nSam
10ec0 70 6c 65 3b 20 20 20 20 20 20 2f 2a 20 53 6d 61  ple;      /* Sma
10ed0 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72  llest sample lar
10ee0 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ger than or equa
10ef0 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69  l to pRec */.  i
10f00 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20 20  nt iTest;       
10f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
10f20 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73  xt sample to tes
10f30 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20  t */.  int res; 
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
10f60 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
10f70 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
10f80 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
10f90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10fa0 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64  ( pParse );.#end
10fb0 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  if.  assert( pRe
10fc0 63 21 3d 30 20 29 3b 0a 20 20 69 43 6f 6c 20 3d  c!=0 );.  iCol =
10fd0 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d 20   pRec->nField - 
10fe0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  1;.  assert( pId
10ff0 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
11000 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
11010 6e 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f 6c  nField>0 && iCol
11020 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  <pIdx->nSampleCo
11030 6c 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  l );.  do{.    i
11040 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29 2f  Test = (iMin+i)/
11050 32 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  2;.    res = sql
11060 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
11070 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 54  mpare(aSample[iT
11080 65 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  est].n, aSample[
11090 69 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29 3b  iTest].p, pRec);
110a0 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
110b0 7b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  {.      iMin = i
110c0 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  Test+1;.    }els
110d0 65 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54 65  e{.      i = iTe
110e0 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  st;.    }.  }whi
110f0 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c  le( res && iMin<
11100 69 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  i );..#ifdef SQL
11110 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
11120 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
11130 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63  ert statements c
11140 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69  heck that the bi
11150 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65  nary search code
11160 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e  .  ** above foun
11170 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77  d the right answ
11180 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73  er. This block s
11190 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65  erves no purpose
111a0 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
111b0 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61   to invoke the a
111c0 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66  sserts.  */.  if
111d0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
111e0 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69  /* If (res==0) i
111f0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61 6d  s true, then sam
11200 70 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20 65  ple $i must be e
11210 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a  qual to pRec */.
11220 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49      assert( i<pI
11230 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->nSample );. 
11240 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
11250 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
11260 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
11270 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
11280 70 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20 20  p, pRec).       
11290 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
112a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
112b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
112c0 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63   Otherwise, pRec
112d0 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
112e0 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20   than sample $i 
112f0 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a  and larger than.
11300 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24      ** sample ($
11310 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  i-1).  */.    as
11320 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
11330 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
11340 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
11350 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
11360 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
11370 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30  le[i].p, pRec)>0
11380 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61  .         || pPa
11390 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
113a0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73  ailed );.    ass
113b0 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20  ert( i==0.      
113c0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
113d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
113e0 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61  Sample[i-1].n, a
113f0 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70  Sample[i-1].p, p
11400 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20  Rec)<0.         
11410 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
11420 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
11430 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64   }.#endif /* ifd
11440 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
11450 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  */..  /* At this
11460 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b   point, aSample[
11470 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20  i] is the first 
11480 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67  sample that is g
11490 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a  reater than.  **
114a0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61   or equal to pVa
114b0 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64  l.  Or if i==pId
114c0 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e  x->nSample, then
114d0 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65   all samples are
114e0 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
114f0 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c  pVal.  If aSampl
11500 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e  e[i]==pVal, then
11510 20 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20   res==0..  */.  
11520 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
11530 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61    aStat[0] = aSa
11540 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
11550 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  l];.    aStat[1]
11560 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
11570 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73  Eq[iCol];.  }els
11580 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  e{.    tRowcnt i
11590 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69  Lower, iUpper, i
115a0 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  Gap;.    if( i==
115b0 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
115c0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
115d0 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d  per = aSample[0]
115e0 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
115f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
11600 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65  4 nRow0 = sqlite
11610 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64  3LogEstToInt(pId
11620 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  x->aiRowLogEst[0
11630 5d 29 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72  ]);.      iUpper
11640 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d   = i>=pIdx->nSam
11650 70 6c 65 20 3f 20 6e 52 6f 77 30 20 3a 20 61 53  ple ? nRow0 : aS
11660 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
11670 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65  ol];.      iLowe
11680 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  r = aSample[i-1]
11690 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61 53  .anEq[iCol] + aS
116a0 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74 5b  ample[i-1].anLt[
116b0 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  iCol];.    }.   
116c0 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78   aStat[1] = pIdx
116d0 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a  ->aAvgEq[iCol];.
116e0 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
116f0 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
11700 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
11710 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
11720 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
11730 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
11740 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
11750 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
11760 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
11770 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
11780 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
11790 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
117a0 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72   + iGap;.  }.  r
117b0 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69  eturn i;.}.#endi
117c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
117d0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
117e0 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69  4 */../*.** If i
117f0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70  t is not NULL, p
11800 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74  Term is a term t
11810 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20  hat provides an 
11820 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a  upper or lower.*
11830 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e  * bound on a ran
11840 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74  ge scan. Without
11850 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65   considering pTe
11860 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61  rm, it is estima
11870 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65  ted .** that the
11880 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74   scan will visit
11890 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73   nNew rows. This
118a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
118b0 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
118c0 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
118d0 76 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61  visited after ta
118e0 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20  king pTerm into 
118f0 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  account..**.** I
11900 66 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69  f the user expli
11910 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
11920 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76  a likelihood() v
11930 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65  alue for this te
11940 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  rm,.** then the 
11950 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
11960 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d  the likelihood m
11970 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65  ultiplied by the
11980 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e   number of.** in
11990 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77  put rows. Otherw
119a0 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ise, this functi
119b0 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
119c0 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  an "IS NOT NULL"
119d0 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c   term.** has a l
119e0 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35  ikelihood of 0.5
119f0 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  0, and any other
11a00 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f   term a likeliho
11a10 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73  od of 0.25..*/.s
11a20 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
11a30 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68  reRangeAdjust(Wh
11a40 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
11a50 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20  LogEst nNew){.  
11a60 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e  LogEst nRet = nN
11a70 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  ew;.  if( pTerm 
11a80 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
11a90 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
11aa0 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20  {.      nRet += 
11ab0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
11ac0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11ad0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
11ae0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
11af0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d   ){.      nRet -
11b00 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 20;        ass
11b10 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
11b20 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
11b30 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11b40 6e 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  nRet;.}..#ifdef 
11b50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
11b60 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20  AT3_OR_STAT4./* 
11b70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11b80 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  n is called to e
11b90 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
11ba0 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
11bb0 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65  ed by a.** range
11bc0 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d  -scan on a skip-
11bd0 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20  scan index. For 
11be0 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
11bf0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
11c00 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b   ON t1(a, b, c);
11c10 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
11c20 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f  ROM t1 WHERE a=?
11c30 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f   AND c BETWEEN ?
11c40 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61   AND ?;.**.** Va
11c50 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  lue pLoop->nOut 
11c60 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
11c70 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
11c80 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
11c90 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72   .** visited for
11ca0 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41   scanning (a=? A
11cb0 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75  ND b=?). This fu
11cc0 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74  nction reduces t
11cd0 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a  hat estimate .**
11ce0 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20   by some factor 
11cf0 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
11d00 68 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20  he (c BETWEEN ? 
11d10 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f  AND ?) expressio
11d20 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68  n based.** on th
11d30 65 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72  e stat4 data for
11d40 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73   the index. this
11d50 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65   scan will be pe
11d60 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20  formed multiple 
11d70 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20  .** times (once 
11d80 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63  for each (a,b) c
11d90 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20  ombination that 
11da0 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20  matches a=?) is 
11db0 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62  dealt with .** b
11dc0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
11dd0 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73  .** It does this
11de0 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72   by scanning thr
11df0 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73  ough all stat4 s
11e00 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e  amples, comparin
11e10 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72  g values.** extr
11e20 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65  acted from pLowe
11e30 72 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74  r and pUpper wit
11e40 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  h the correspond
11e50 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61  ing column in ea
11e60 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66  ch.** sample. If
11e70 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65   L and U are the
11e80 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c   number of sampl
11e90 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c  es found to be l
11ea0 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65  ess than or.** e
11eb0 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75  qual to the valu
11ec0 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
11ed0 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  m pLower and pUp
11ee0 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
11ef0 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68  , and.** N is th
11f00 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
11f10 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70  f samples, the p
11f20 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65  Loop->nOut value
11f30 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
11f40 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
11f50 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20  *   nOut = nOut 
11f60 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31  * ( min(U - L, 1
11f70 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66  ) / N ).**.** If
11f80 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c   pLower is NULL,
11f90 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e   or a value cann
11fa0 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
11fb0 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c  from the term, L
11fc0 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65   is.** set to ze
11fd0 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73  ro. If pUpper is
11fe0 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75   NULL, or a valu
11ff0 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72  e cannot be extr
12000 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a  acted from it,.*
12010 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e  * U is set to N.
12020 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
12030 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
12040 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31  ets *pbDone to 1
12050 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
12060 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69  g. However,.** i
12070 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62  f no value can b
12080 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
12090 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f   either pLower o
120a0 72 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f  r pUpper (and so
120b0 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65   the.** estimate
120c0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
120d0 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64  f rows delivered
120e0 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
120f0 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20  ed), *pbDone.** 
12100 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a  is left as is..*
12110 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
12120 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
12130 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
12140 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
12150 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  wise, .** SQLITE
12160 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
12170 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69  nt whereRangeSki
12180 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  pScanEst(.  Pars
12190 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
121a0 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
121b0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
121c0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
121d0 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
121e0 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
121f0 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
12200 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
12210 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
12220 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
12230 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
12240 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
12250 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
12260 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
12270 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
12280 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
12290 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74  .nOut value of t
122a0 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  his loop */.  in
122b0 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20  t *pbDone       
122c0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
122d0 65 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e  e if at least on
122e0 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78  e expr. value ex
122f0 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  tracted */.){.  
12300 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
12310 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
12320 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
12330 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
12340 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
12350 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
12360 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b  int nLower = -1;
12370 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20  .  int nUpper = 
12380 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20  p->nSample+1;.  
12390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
123a0 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d  OK;.  int iCol =
123b0 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71   p->aiColumn[nEq
123c0 5d 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 69 43  ];.  u8 aff = iC
123d0 6f 6c 3e 3d 30 20 3f 20 70 2d 3e 70 54 61 62 6c  ol>=0 ? p->pTabl
123e0 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66  e->aCol[iCol].af
123f0 66 69 6e 69 74 79 20 3a 20 53 51 4c 49 54 45 5f  finity : SQLITE_
12400 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 43  AFF_INTEGER;.  C
12410 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
12420 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
12430 65 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 20  e *p1 = 0;      
12440 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
12450 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
12460 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
12470 76 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20 20  value *p2 = 0;  
12480 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
12490 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
124a0 70 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69  pUpper */.  sqli
124b0 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
124c0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  = 0;        /* V
124d0 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
124e0 72 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20  rom record */.. 
124f0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
12500 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
12510 61 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b  arse, p->azColl[
12520 6e 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f  nEq]);.  if( pLo
12530 77 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  wer ){.    rc = 
12540 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75  sqlite3Stat4Valu
12550 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
12560 2c 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  , pLower->pExpr-
12570 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70  >pRight, aff, &p
12580 31 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d  1);.    nLower =
12590 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55   0;.  }.  if( pU
125a0 70 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49  pper && rc==SQLI
125b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
125c0 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61  = sqlite3Stat4Va
125d0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
125e0 73 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78 70  se, pUpper->pExp
125f0 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20  r->pRight, aff, 
12600 26 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65 72  &p2);.    nUpper
12610 20 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e   = p2 ? 0 : p->n
12620 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69  Sample;.  }..  i
12630 66 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20  f( p1 || p2 ){. 
12640 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
12650 74 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f 72  t nDiff;.    for
12660 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
12670 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d  _OK && i<p->nSam
12680 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
12690 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
126a0 74 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e  t4Column(db, p->
126b0 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d  aSample[i].p, p-
126c0 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e  >aSample[i].n, n
126d0 45 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20  Eq, &pVal);.    
126e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
126f0 5f 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20 20  _OK && p1 ){.   
12700 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73       int res = s
12710 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
12720 28 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c  (p1, pVal, pColl
12730 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
12740 65 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b  es>=0 ) nLower++
12750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12770 4b 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 20  K && p2 ){.     
12780 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c     int res = sql
12790 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
127a0 32 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b  2, pVal, pColl);
127b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
127c0 3e 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a  >=0 ) nUpper++;.
127d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
127e0 20 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70 65    nDiff = (nUppe
127f0 72 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20  r - nLower);.   
12800 20 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29 20   if( nDiff<=0 ) 
12810 6e 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20  nDiff = 1;..    
12820 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
12830 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64  oth an upper and
12840 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70 65   lower bound spe
12850 63 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20  cified, and the 
12860 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73  .    ** comparis
12870 6f 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ons indicate tha
12880 74 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  t they are close
12890 20 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20 74   together, use t
128a0 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20  he fallback.    
128b0 2a 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75 6d  ** method (assum
128c0 65 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20  e that the scan 
128d0 76 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20 74  visits 1/64 of t
128e0 68 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73 74  he rows) for est
128f0 69 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74  imating.    ** t
12900 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
12910 73 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65 72  s visited. Other
12920 77 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20 74  wise, estimate t
12930 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
12940 73 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74  s.    ** using t
12950 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
12960 62 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  bed in the heade
12970 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68  r comment for th
12980 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
12990 20 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d 31      if( nDiff!=1
129a0 20 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c   || pUpper==0 ||
129b0 20 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20   pLower==0 ){.  
129c0 20 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74 20      int nAdjust 
129d0 3d 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  = (sqlite3LogEst
129e0 28 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73  (p->nSample) - s
129f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44 69  qlite3LogEst(nDi
12a00 66 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  ff));.      pLoo
12a10 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75  p->nOut -= nAdju
12a20 73 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e  st;.      *pbDon
12a30 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45  e = 1;.      WHE
12a40 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22  RETRACE(0x10, ("
12a50 72 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e 20  range skip-scan 
12a60 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20  regions: %u..%u 
12a70 20 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d 25   adjust=%d est=%
12a80 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c   nLower, nUpper,
12ab0 20 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f   nAdjust*-1, pLo
12ac0 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20  op->nOut));.    
12ad0 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
12ae0 61 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d  assert( *pbDone=
12af0 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  =0 );.  }..  sql
12b00 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31  ite3ValueFree(p1
12b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
12b20 65 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c  eFree(p2);.  sql
12b30 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
12b40 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  al);..  return r
12b50 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
12b60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
12b70 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
12b80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12b90 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65  ion is used to e
12ba0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
12bb0 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
12bc0 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a  will be visited.
12bd0 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61  ** by scanning a
12be0 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61  n index for a ra
12bf0 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54  nge of values. T
12c00 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76  he range may hav
12c10 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f  e an upper.** bo
12c20 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75  und, a lower bou
12c30 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65  nd, or both. The
12c40 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12c50 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65  rms that set the
12c60 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f   upper.** and lo
12c70 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72  wer bounds are r
12c80 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c  epresented by pL
12c90 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
12ca0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f  respectively. Fo
12cb0 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73  r.** example, as
12cc0 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65  suming that inde
12cd0 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a  x p is on t1(a):
12ce0 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
12cf0 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
12d00 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
12d10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12d20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c       |_____|   |
12d30 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20  _____|.**       
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20  |         |.**  
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70     pLower    pUp
12d80 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  per.**.** If eit
12d90 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72  her of the upper
12da0 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20   or lower bound 
12db0 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
12dc0 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73  then NULL is pas
12dd0 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20  sed in.** place 
12de0 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
12df0 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a  ding WhereTerm..
12e00 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
12e10 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e  in (pBuilder->pN
12e20 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29  ew->u.btree.nEq)
12e30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
12e40 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63  f the index.** c
12e50 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f  olumn subject to
12e60 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
12e70 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76  raint. Or, equiv
12e80 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d  alently, the num
12e90 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69  ber of.** equali
12ea0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  ty constraints o
12eb0 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20  ptimized by the 
12ec0 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73  proposed index s
12ed0 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  can. For example
12ee0 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e  ,.** assuming in
12ef0 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
12f00 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51  , b), and the SQ
12f10 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  L query is:.**.*
12f20 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
12f30 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
12f40 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20  b > ? AND b < ? 
12f50 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
12f60 45 71 20 69 73 20 73 65 74 20 74 6f 20 31 20 28  Eq is set to 1 (
12f70 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73  as the range res
12f80 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20  tricted column, 
12f90 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  b, is the second
12fa0 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63   .** left-most c
12fb0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
12fc0 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ex). Or, if the 
12fd0 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
12fe0 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
12ff0 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
13000 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
13010 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
13020 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74   0..**.** When t
13030 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13040 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69  called, *pnOut i
13050 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c  s set to the sql
13060 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20  ite3LogEst() of 
13070 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
13080 20 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 69   rows that the i
13090 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65 78 70  ndex scan is exp
130a0 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 20 77  ected to visit w
130b0 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69  ithout .** consi
130c0 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65  dering the range
130d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66   constraints. If
130e0 20 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e 20   nEq is 0, then 
130f0 2a 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e 75  *pnOut is the nu
13100 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73  mber of .** rows
13110 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41   in the index. A
13120 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
13130 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20   occurs, *pnOut 
13140 69 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64  is adjusted (red
13150 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f  uced).** to acco
13160 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67  unt for the rang
13170 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c  e constraints pL
13180 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e  ower and pUpper.
13190 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61  .** .** In the a
131a0 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
131b0 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64  _stat4 ANALYZE d
131c0 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20  ata, or if such 
131d0 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  data cannot be.*
131e0 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65  * used, a single
131f0 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
13200 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
13210 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
13220 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
13230 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63   and a pair of c
13240 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20  onstraints (x>? 
13250 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73  AND x<?) reduces
13260 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75   the expected nu
13270 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20  mber of.** rows 
13280 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61 63  visited by a fac
13290 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74  tor of 64..*/.st
132a0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
132b0 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ngeScanEst(.  Pa
132c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
132d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
132e0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
132f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
13300 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
13310 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65  Builder,.  Where
13320 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
13330 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
13340 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
13350 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
13360 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
13370 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
13380 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
13390 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
133a0 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
133b0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
133c0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20  reLoop *pLoop   
133d0 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20    /* Modify the 
133e0 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20  .nOut and maybe 
133f0 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a  .rRun fields */.
13400 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13410 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
13420 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  Out = pLoop->nOu
13430 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77  t;.  LogEst nNew
13440 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
13450 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
13460 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a  _STAT4.  Index *
13470 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  p = pLoop->u.btr
13480 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
13490 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
134a0 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66  btree.nEq;..  if
134b0 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26  ( p->nSample>0 &
134c0 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65  & nEq<p->nSample
134d0 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  Col ){.    if( n
134e0 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52  Eq==pBuilder->nR
134f0 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  ecValid ){.     
13500 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
13510 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
13520 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52  ->pRec;.      tR
13530 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20  owcnt a[2];.    
13540 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20    u8 aff;..     
13550 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f   /* Variable iLo
13560 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20  wer will be set 
13570 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
13580 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
13590 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20   rows in .      
135a0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  ** the index tha
135b0 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  t are less than 
135c0 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
135d0 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
135e0 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ry. The.      **
135f0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
13600 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
13610 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
13620 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
13630 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d  he.      ** key-
13640 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79  prefix formed by
13650 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
13660 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
13670 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73  the nEq left-mos
13680 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
13690 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ns of the index,
136a0 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76   and $L is the v
136b0 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a  alue in pLower..
136c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
136d0 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20  * Or, if pLower 
136e0 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61  is NULL or $L ca
136f0 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
13700 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75  d from it (becau
13710 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69  se it.      ** i
13720 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
13730 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
13740 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
13750 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
13760 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65  e.      ** range
13770 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61   is $P. Due to a
13780 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61   quirk in the wa
13790 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  y whereKeyStats(
137a0 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20  ) works, even.  
137b0 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20      ** if $L is 
137c0 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65  available, where
137d0 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61  KeyStats() is ca
137e0 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24  lled for both ($
137f0 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  P) and .      **
13800 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
13810 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
13820 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
13830 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  es is used..    
13840 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69    **.      ** Si
13850 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20  milarly, iUpper 
13860 69 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  is to be set to 
13870 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20  the estimate of 
13880 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
13890 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  ws.      ** less
138a0 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
138b0 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
138c0 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20  ge query. Where 
138d0 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a  the upper bound.
138e0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
138f0 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
13900 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
13910 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
13920 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
13930 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70        ** of iUpp
13940 65 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64  er are requested
13950 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74   of whereKeyStat
13960 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c  s() and the smal
13970 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20  ler used..      
13980 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
13990 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62  number of rows b
139a0 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62  etween the two b
139b0 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75  ounds is then ju
139c0 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72  st iUpper-iLower
139d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
139e0 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b   tRowcnt iLower;
139f0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73       /* Rows les
13a00 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
13a10 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
13a20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20  tRowcnt iUpper; 
13a30 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
13a40 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20   than the upper 
13a50 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
13a60 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b  nt iLwrIdx = -2;
13a70 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
13a80 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  for the lower bo
13a90 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
13aa0 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20   iUprIdx = -1;  
13ab0 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f   /* aSample[] fo
13ac0 72 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  r the upper boun
13ad0 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  d */..      if( 
13ae0 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20  pRec ){.        
13af0 74 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e  testcase( pRec->
13b00 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72  nField!=pBuilder
13b10 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ->nRecValid );. 
13b20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
13b30 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  eld = pBuilder->
13b40 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20  nRecValid;.     
13b50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71   }.      if( nEq
13b60 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  ==p->nKeyCol ){.
13b70 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 53 51          aff = SQ
13b80 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
13b90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13ba0 20 20 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e         aff = p->
13bb0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e  pTable->aCol[p->
13bc0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61  aiColumn[nEq]].a
13bd0 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d  ffinity;.      }
13be0 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  .      /* Determ
13bf0 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69  ine iLower and i
13c00 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29  Upper using ($P)
13c10 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
13c20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20  if( nEq==0 ){.  
13c30 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
13c40 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
13c50 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a   = p->nRowEst0;.
13c60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13c70 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
13c80 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
13c90 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
13ca0 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
13cb0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
13cc0 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
13cd0 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
13ce0 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
13cf0 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
13d00 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
13d10 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
13d20 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
13d30 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
13d40 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
13d50 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
13d60 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
13d70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
13d80 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30  ssert( pLower==0
13d90 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   || (pLower->eOp
13da0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
13db0 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
13dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70      assert( pUpp
13dd0 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72  er==0 || (pUpper
13de0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
13df0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
13e00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13e10 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d   p->aSortOrder!=
13e20 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
13e30 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
13e40 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
13e50 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f  The roles of pLo
13e60 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61  wer and pUpper a
13e70 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61  re swapped for a
13e80 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20   DESC index */. 
13e90 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72         SWAP(Wher
13ea0 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20  eTerm*, pLower, 
13eb0 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d  pUpper);.      }
13ec0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
13ed0 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
13ee0 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73  on the iLower es
13ef0 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
13f00 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$L). */.      i
13f10 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
13f20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
13f50 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
13f60 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
13f70 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
13f80 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
13f90 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
13fa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
13fb0 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
13fc0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
13fd0 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
13fe0 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
13ff0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14000 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
14010 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
14020 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
14030 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
14040 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
14050 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
14060 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
14070 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
14080 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
14090 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
140a0 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
140b0 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
140c0 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
140d0 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
140e0 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
140f0 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
14100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14110 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
14120 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
14130 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
14140 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
14150 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
14160 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
14170 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
141a0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
141b0 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
141c0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
141d0 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
141e0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
141f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
14200 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
14210 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
14220 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
14230 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
14240 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14250 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
14260 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
14270 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
14280 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iUprIdx = whereK
14290 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
142a0 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a  p, pRec, 1, a);.
142b0 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
142c0 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
142d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
142e0 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
142f0 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
14300 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70      if( iNew<iUp
14310 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69  per ) iUpper = i
14320 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
14330 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
14340 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20   pUpper = 0;.   
14350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
14360 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
14370 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
14380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
143a0 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
143b0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  r ){.          n
143c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  New = sqlite3Log
143d0 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  Est(iUpper - iLo
143e0 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wer);.          
143f0 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62  /* TUNING:  If b
14400 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69  oth iUpper and i
14410 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65  Lower are derive
14420 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a  d from the same.
14430 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
14440 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  ple, then assume
14450 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72   they are 4x mor
14460 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68  e selective.  Th
14470 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20  is brings.      
14480 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d      ** the estim
14490 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79  ated selectivity
144a0 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69   more in line wi
144b0 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64  th what it would
144c0 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
144d0 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69   if estimated wi
144e0 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66  thout the use of
144f0 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e   STAT3/4 tables.
14500 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
14510 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49  ( iLwrIdx==iUprI
14520 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  dx ) nNew -= 20;
14530 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
14540 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
14550 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14560 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
14570 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 10;        ass
14580 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
14590 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
145a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
145b0 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a  f( nNew<nOut ){.
145c0 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d            nOut =
145d0 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
145e0 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
145f0 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54  ACE(0x10, ("STAT
14600 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75  4 range scan: %u
14610 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c  ..%u  est=%d\n",
14620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14630 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
14640 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
14650 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
14660 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
14670 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65  .      int bDone
14680 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
14690 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
146a0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
146b0 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70  Lower, pUpper, p
146c0 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20  Loop, &bDone);. 
146d0 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29       if( bDone )
146e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
146f0 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
14700 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
14710 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
14720 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c  _PARAMETER(pBuil
14730 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  der);.  assert( 
14740 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
14750 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
14760 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
14770 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61  | (pUpper->wtFla
14780 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
14790 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20  ==0 );.  nNew = 
147a0 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
147b0 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a  (pLower, nOut);.
147c0 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
147d0 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72  ngeAdjust(pUpper
147e0 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54  , nNew);..  /* T
147f0 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
14800 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
14810 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74   and lower limit
14820 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d   and neither lim
14830 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61  it.  ** has an a
14840 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
14850 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c  ed likelihood(),
14860 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67   assume the rang
14870 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65  e is.  ** reduce
14880 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  d by an addition
14890 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61  al 75%. This mea
148a0 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61  ns that, by defa
148b0 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64  ult, an open-end
148c0 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75  ed.  ** range qu
148d0 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20  ery (e.g. col > 
148e0 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ?) is assumed to
148f0 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68   match 1/4 of th
14900 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  e rows in the.  
14910 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20  ** index. While 
14920 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28  a closed range (
14930 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e  e.g. col BETWEEN
14940 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74   ? AND ?) is est
14950 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d  imated to.  ** m
14960 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65  atch 1/64 of the
14970 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66   index. */ .  if
14980 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77  ( pLower && pLow
14990 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
149a0 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70  && pUpper && pUp
149b0 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  per->truthProb>0
149c0 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
149d0 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20  20;.  }..  nOut 
149e0 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b  -= (pLower!=0) +
149f0 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20   (pUpper!=0);.  
14a00 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e  if( nNew<10 ) nN
14a10 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e  ew = 10;.  if( n
14a20 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20  New<nOut ) nOut 
14a30 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69  = nNew;.#if defi
14a40 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
14a50 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c  NABLED).  if( pL
14a60 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  oop->nOut>nOut )
14a70 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
14a80 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63  (0x10,("Range sc
14a90 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66  an lowers nOut f
14aa0 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
14ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ac0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
14ad0 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65  , nOut));.  }.#e
14ae0 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ndif.  pLoop->nO
14af0 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
14b00 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
14b10 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
14b20 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
14b30 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
14b40 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
14b50 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
14b60 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
14b70 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
14b80 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
14b90 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
14ba0 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
14bb0 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
14bc0 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
14bd0 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
14be0 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
14bf0 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
14c00 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
14c10 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
14c20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
14c30 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
14c40 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
14c50 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
14c60 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
14c70 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
14c80 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
14c90 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
14ca0 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
14cb0 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
14cc0 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
14cd0 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
14ce0 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
14cf0 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
14d00 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
14d10 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
14d20 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
14d30 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
14d40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
14d50 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
14d60 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
14d70 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
14d80 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
14d90 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
14da0 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
14db0 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
14dc0 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
14dd0 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
14de0 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
14df0 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
14e00 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
14e10 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
14e20 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
14e30 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
14e40 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
14e50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14e60 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
14e70 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
14e80 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14e90 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
14ea0 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70  ilder,.  Expr *p
14eb0 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
14ec0 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
14ed0 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
14ee0 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
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 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
14f70 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
14f80 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55  u.btree.nEq;.  U
14f90 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
14fa0 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
14fb0 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20  pRec;.  u8 aff; 
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fd0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
14fe0 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
14ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15000 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
15010 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
15020 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
15030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15040 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
15050 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
15060 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
15070 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
15080 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
15090 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
150a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
150b0 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
150c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
150d0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
150e0 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
150f0 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
15100 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
15110 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
15120 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
15130 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
15140 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
15150 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
15160 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
15170 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
15180 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
15190 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
151a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
151b0 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
151c0 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
151d0 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
151e0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
151f0 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
15200 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
15210 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
15220 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
15230 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
15240 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
15250 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
15260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15270 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70  ;.  }..  aff = p
15280 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
15290 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31  ->aiColumn[nEq-1
152a0 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 72  ]].affinity;.  r
152b0 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
152c0 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
152d0 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
152e0 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d  pExpr, aff, nEq-
152f0 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69  1, &bOk);.  pBui
15300 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
15310 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  c;.  if( rc!=SQL
15320 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15330 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30  rc;.  if( bOk==0
15340 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15350 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75  _NOTFOUND;.  pBu
15360 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
15370 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65   = nEq;..  where
15380 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
15390 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
153a0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
153b0 31 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  10,("equality sc
153c0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
153d0 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
153e0 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b    *pnRow = a[1];
153f0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
15400 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15410 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
15420 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69  _OR_STAT4 */..#i
15430 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15440 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
15450 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
15460 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
15470 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
15480 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
15490 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
154a0 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
154b0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
154c0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
154d0 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
154e0 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
154f0 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
15500 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
15510 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
15520 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
15530 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
15540 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
15550 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
15560 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
15570 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
15580 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
15590 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
155a0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
155b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
155c0 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
155d0 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
155e0 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
155f0 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
15600 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
15610 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
15620 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
15630 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
15640 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
15650 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
15660 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
15670 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
15680 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
15690 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
156a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
156b0 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
156c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
156d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
156e0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
156f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
15700 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
15710 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c  Builder,.  ExprL
15720 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
15730 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
15740 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
15750 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
15760 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63  ...)" */.  tRowc
15770 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
15780 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
15790 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
157a0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
157b0 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
157c0 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
157d0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20  e.pIndex;.  i64 
157e0 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c  nRow0 = sqlite3L
157f0 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69  ogEstToInt(p->ai
15800 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
15810 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
15820 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
15830 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  alid;.  int rc =
15840 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15850 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
15860 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
15870 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
15880 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15890 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
158a0 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
158b0 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
158c0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
158d0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
158e0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
158f0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
15900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15910 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
15920 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
15930 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
15940 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
15950 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
15960 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15970 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20   nEst = nRow0;. 
15980 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
15990 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
159a0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
159b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
159c0 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
159d0 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
159e0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
159f0 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
15a00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
15a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15a20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e   if( nRowEst > n
15a30 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d  Row0 ) nRowEst =
15a40 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52   nRow0;.    *pnR
15a50 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
15a60 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
15a70 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  0,("IN row estim
15a80 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20  ate: est=%d\n", 
15a90 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
15aa0 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
15ab0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52  r->nRecValid==nR
15ac0 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74  ecValid );.  ret
15ad0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
15ae0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
15af0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
15b00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62   */../*.** Disab
15b10 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
15b20 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
15b30 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
15b40 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
15b50 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
15b60 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
15b70 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
15b80 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
15b90 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
15ba0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
15bb0 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
15bc0 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
15bd0 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
15be0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
15bf0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
15c00 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
15c10 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
15c20 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
15c30 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
15c40 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
15c50 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
15c60 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
15c70 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
15c80 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
15c90 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
15ca0 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
15cb0 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
15cc0 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
15cd0 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
15ce0 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
15cf0 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
15d00 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
15d10 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
15d20 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
15d30 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
15d40 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
15d50 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
15d60 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
15d70 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
15d80 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
15d90 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
15da0 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
15db0 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
15dc0 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
15dd0 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
15de0 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
15df0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
15e00 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
15e10 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
15e20 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
15e30 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
15e40 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
15e50 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
15e60 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
15e70 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
15e80 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
15e90 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
15ea0 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
15eb0 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
15ec0 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
15ed0 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
15ee0 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
15ef0 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
15f00 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
15f10 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
15f20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
15f30 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
15f40 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
15f50 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
15f60 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
15f70 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
15f80 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
15f90 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
15fa0 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
15fb0 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
15fc0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
15fd0 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
15fe0 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
15ff0 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
16000 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
16010 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
16020 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20  romJoin)).      
16030 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  && (pLevel->notR
16040 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72  eady & pTerm->pr
16050 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b  ereqAll)==0.  ){
16060 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
16070 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
16080 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
16090 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
160a0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
160b0 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
160c0 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
160d0 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
160e0 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
160f0 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
16100 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
16110 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
16120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16130 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
16140 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79  e an OP_Affinity
16150 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79   opcode to apply
16160 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
16170 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66  nity string zAff
16180 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67  .** to the n reg
16190 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
161a0 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  at base. .**.** 
161b0 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
161c0 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  on, SQLITE_AFF_N
161d0 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69  ONE entries (whi
161e0 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61  ch are no-ops) a
161f0 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69  t the.** beginni
16200 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41  ng and end of zA
16210 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20  ff are ignored. 
16220 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   If all entries 
16230 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53  in zAff are.** S
16240 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20  QLITE_AFF_NONE, 
16250 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74  then no code get
16260 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a  s generated..**.
16270 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16280 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f  makes its own co
16290 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68  py of zAff so th
162a0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  at the caller is
162b0 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69   free.** to modi
162c0 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68  fy zAff after th
162d0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
162e0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
162f0 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
16300 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
16310 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
16320 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29  t n, char *zAff)
16330 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
16340 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
16350 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20  f( zAff==0 ){.  
16360 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
16370 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16380 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
16390 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
163a0 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  v!=0 );..  /* Ad
163b0 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20  just base and n 
163c0 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c  to skip over SQL
163d0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
163e0 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69  ries at the begi
163f0 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65  nning.  ** and e
16400 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69  nd of the affini
16410 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a  ty string..  */.
16420 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
16430 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  zAff[0]==SQLITE_
16440 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
16450 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b  n--;.    base++;
16460 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d  .    zAff++;.  }
16470 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
16480 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49   zAff[n-1]==SQLI
16490 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
164a0 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f     n--;.  }..  /
164b0 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66  * Code the OP_Af
164c0 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66  finity opcode if
164d0 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
164e0 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a  ng left to do. *
164f0 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  /.  if( n>0 ){. 
16500 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16510 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp2(v, OP_Affin
16520 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  ity, base, n);. 
16530 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
16540 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41  angeP4(v, -1, zA
16550 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
16560 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
16570 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
16580 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
16590 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
165a0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
165b0 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
165c0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
165d0 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
165e0 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
165f0 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
16600 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
16610 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
16620 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
16630 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
16640 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
16650 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
16660 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
16670 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
16680 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
16690 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
166a0 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
166b0 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
166c0 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
166d0 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
166e0 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
166f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
16700 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
16710 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
16720 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
16730 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
16740 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
16750 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
16760 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
16770 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
16780 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
16790 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
167a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
167b0 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
167c0 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
167d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
167e0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
167f0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
16800 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65  vel, /* The leve
16810 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
16820 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
16830 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
16840 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  iEq,            
16850 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
16860 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69  equality term wi
16870 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20  thin this level 
16880 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
16890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
168a0 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64   for reverse-ord
168b0 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73  er IN operations
168c0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
168d0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
168e0 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
168f0 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
16900 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
16910 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
16920 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
16930 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
16940 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16960 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
16970 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
16980 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
16990 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
169a0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
169b0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
169c0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
169d0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
169e0 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
169f0 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
16a00 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
16a10 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
16a20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16a30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
16a40 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
16a50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16a60 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
16a70 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
16a80 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
16a90 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
16aa0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65  op *pIn;.    Whe
16ab0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
16ac0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
16ad0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
16ae0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
16af0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
16b00 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70  0.      && pLoop
16b10 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
16b20 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  !=0.      && pLo
16b30 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
16b40 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
16b50 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
16b60 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d   testcase( iEq==
16b70 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
16b80 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20  ase( bRev );.   
16b90 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b     bRev = !bRev;
16ba0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
16bb0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
16bc0 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
16bd0 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
16be0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
16bf0 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
16c00 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  X, IN_INDEX_LOOP
16c10 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54  , 0);.    if( eT
16c20 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
16c30 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
16c40 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
16c50 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
16c60 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
16c70 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
16c80 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
16c90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
16ca0 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
16cb0 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
16cc0 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  0);.    VdbeCove
16cd0 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 29 3b  rageIf(v, bRev);
16ce0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
16cf0 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a 20  eIf(v, !bRev);. 
16d00 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
16d10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
16d20 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
16d30 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  );.    pLoop->ws
16d40 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
16d50 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20  N_ABLE;.    if( 
16d60 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
16d70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
16d80 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
16d90 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16da0 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  bel(v);.    }.  
16db0 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
16dc0 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c  In++;.    pLevel
16dd0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d  ->u.in.aInLoop =
16de0 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  .       sqlite3D
16df0 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
16e00 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65  Parse->db, pLeve
16e10 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c  l->u.in.aInLoop,
16e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
16e40 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e  izeof(pLevel->u.
16e50 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70  in.aInLoop[0])*p
16e60 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29  Level->u.in.nIn)
16e70 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76  ;.    pIn = pLev
16e80 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
16e90 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b  ;.    if( pIn ){
16ea0 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c  .      pIn += pL
16eb0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d  evel->u.in.nIn -
16ec0 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69   1;.      pIn->i
16ed0 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
16ee0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
16ef0 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
16f00 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
16f10 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
16f20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16f30 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65  Rowid, iTab, iRe
16f40 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
16f50 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
16f60 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
16f70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16f80 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
16f90 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  0, iReg);.      
16fa0 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e  }.      pIn->eEn
16fb0 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f  dLoopOp = bRev ?
16fc0 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a   OP_PrevIfOpen :
16fd0 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a   OP_NextIfOpen;.
16fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16ff0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
17000 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56 64 62  Null, iReg); Vdb
17010 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17030 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
17040 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
17050 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
17060 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
17070 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  m);.  return iRe
17080 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
17090 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
170a0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
170b0 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
170c0 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
170d0 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a   index scan..**.
170e0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
170f0 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
17100 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
17110 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
17120 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
17130 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
17140 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
17150 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
17160 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
17170 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
17180 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
17190 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
171a0 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
171b0 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
171c0 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
171d0 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
171e0 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
171f0 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
17200 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
17210 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
17220 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
17230 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
17240 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
17250 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
17260 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
17270 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
17280 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
17290 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
172a0 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
172b0 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
172c0 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
172d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
172e0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
172f0 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
17300 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
17310 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
17320 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
17330 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
17340 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
17350 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
17360 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
17370 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
17380 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
17390 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
173a0 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70  cell and.** comp
173b0 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ute the affinity
173c0 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
173d0 68 65 20 6e 45 78 74 72 61 52 65 67 20 70 61 72  he nExtraReg par
173e0 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20 31  ameter is 0 or 1
173f0 2e 20 20 49 74 20 69 73 20 30 20 69 66 20 61 6c  .  It is 0 if al
17400 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  l WHERE clause c
17410 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72  onstraints.** ar
17420 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61  e == or IN and a
17430 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
17440 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65  e nEq.  nExtraRe
17450 67 20 69 73 20 31 20 69 66 20 74 68 65 72 65 20  g is 1 if there 
17460 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c  is.** an inequal
17470 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
17480 73 75 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d  such as the "c>=
17490 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74  5 AND c<10" in t
174a0 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74  he example) that
174b0 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72  .** occurs after
174c0 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79   the nEq quality
174d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a   constraints..**
174e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
174f0 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e   allocates a ran
17500 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61  ge of nEq+nExtra
17510 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  Reg memory cells
17520 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
17530 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
17540 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65   first memory ce
17550 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65  ll in that range
17560 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a  . The code that.
17570 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  ** calls this ro
17580 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74  utine will use t
17590 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65  hat memory range
175a0 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66   to store keys f
175b0 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20  or.** start and 
175c0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
175d0 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  itions of the lo
175e0 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  op..** key value
175f0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
17600 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
17610 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
17620 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
17630 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
17640 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
17650 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
17660 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
17670 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f   use..**.** Befo
17680 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
17690 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70  zAff is set to p
176a0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
176b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
176c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
176d0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
176e0 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ing of the index
176f0 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
17700 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  .** sqlite3DbMal
17710 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65  loc(). Except, e
17720 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  ntries in the co
17730 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
17740 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
17750 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ith equality con
17760 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73  straints that us
17770 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20  e NONE affinity 
17780 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51  are set to.** SQ
17790 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54  LITE_AFF_NONE. T
177a0 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77  his is to deal w
177b0 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20  ith SQL such as 
177c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
177d0 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41  *.**   CREATE TA
177e0 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52  BLE t1(a TEXT PR
177f0 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a  IMARY KEY, b);.*
17800 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  *   SELECT ... F
17810 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31  ROM t1 AS t2, t1
17820 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32   WHERE t1.a = t2
17830 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  .b;.**.** In the
17840 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
17850 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28  the index on t1(
17860 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69  a) has TEXT affi
17870 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a  nity. But since.
17880 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  ** the right han
17890 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71  d side of the eq
178a0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
178b0 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e  t (t2.b) has NON
178c0 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e  E affinity,.** n
178d0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f  o conversion sho
178e0 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64  uld be attempted
178f0 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20   before using a 
17900 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61  t2.b value as pa
17910 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74  rt of.** a key t
17920 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64  o search the ind
17930 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69  ex. Hence the fi
17940 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
17950 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74  returned affinit
17960 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74  y.** string in t
17970 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c  his example woul
17980 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  d be set to SQLI
17990 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a  TE_AFF_NONE..*/.
179a0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41  static int codeA
179b0 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
179c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
179d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
179e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
179f0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
17a00 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
17a10 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
17a20 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
17a30 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  oding */.  int b
17a40 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
17a50 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65 20   /* Reverse the 
17a60 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72  order of IN oper
17a70 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ators */.  int n
17a80 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20  ExtraReg,       
17a90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
17aa0 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f  tra registers to
17ab0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
17ac0 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20  har **pzAff     
17ad0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
17ae0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66   to point to aff
17af0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
17b00 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20 20 20  ){.  u16 nEq;   
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
17b30 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
17b40 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65  straints to code
17b50 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b   */.  u16 nSkip;
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17b80 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
17b90 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ns to skip */.  
17ba0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
17bb0 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
17bc0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
17bd0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
17be0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c00 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
17c10 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
17c20 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
17c30 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
17c40 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
17c50 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
17c60 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
17c70 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
17c80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
17c90 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
17ca0 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17cd0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
17ce0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
17cf0 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
17d00 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
17d10 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
17d20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17d30 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
17d40 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
17d50 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d70 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
17d80 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
17d90 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
17da0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
17db0 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
17dc0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
17dd0 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
17de0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
17df0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
17e00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
17e10 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
17e20 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
17e30 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
17e40 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d    nSkip = pLoop-
17e50 3e 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d  >nSkip;.  pIdx =
17e60 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
17e70 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74  pIndex;.  assert
17e80 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20  ( pIdx!=0 );..  
17e90 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
17ea0 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65  w many memory ce
17eb0 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  lls we will need
17ec0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
17ed0 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42  hem..  */.  regB
17ee0 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
17ef0 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d  em + 1;.  nReg =
17f00 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
17f10 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b  nEq + nExtraReg;
17f20 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
17f30 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66  += nReg;..  zAff
17f40 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
17f50 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  up(pParse->db, s
17f60 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
17f70 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29  ityStr(v, pIdx))
17f80 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b  ;.  if( !zAff ){
17f90 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
17fa0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
17fb0 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53  1;.  }..  if( nS
17fc0 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  kip ){.    int i
17fd0 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
17fe0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71  >iIdxCur;.    sq
17ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
18000 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74  v, (bRev?OP_Last
18010 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64  :OP_Rewind), iId
18020 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43  xCur);.    VdbeC
18030 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
18040 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43  v==0);.    VdbeC
18050 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
18060 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43  v!=0);.    VdbeC
18070 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
18080 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25  n skip-scan on %
18090 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
180a0 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74  );.    j = sqlit
180b0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
180c0 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c  OP_Goto);.    pL
180d0 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d  evel->addrSkip =
180e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
180f0 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f  p4Int(v, (bRev?O
18100 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b  P_SeekLT:OP_Seek
18110 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GT),.           
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67   iIdxCur, 0, reg
18140 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20  Base, nSkip);.  
18150 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
18160 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20  (v, bRev==0);.  
18170 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
18180 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
18190 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
181a0 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20  pHere(v, j);.   
181b0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69   for(j=0; j<nSki
181c0 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  p; j++){.      s
181d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
181e0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
181f0 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61  IdxCur, j, regBa
18200 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61 73 73  se+j);.      ass
18210 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ert( pIdx->aiCol
18220 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[j]>=0 );.   
18230 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
18240 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 70  v, "%s", pIdx->p
18250 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49 64 78  Table->aCol[pIdx
18260 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  ->aiColumn[j]].z
18270 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
18280 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c  }    ..  /* Eval
18290 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
182a0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
182b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66  */.  assert( zAf
182c0 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74 72  f==0 || (int)str
182d0 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29  len(zAff)>=nEq )
182e0 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b  ;.  for(j=nSkip;
182f0 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
18300 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54    int r1;.    pT
18310 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
18320 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65  erm[j];.    asse
18330 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
18340 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
18350 77 69 6e 67 20 74 65 73 74 63 61 73 65 20 69 73  wing testcase is
18360 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65   true for indice
18370 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74  s with redundant
18380 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a   columns. .    *
18390 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44  * Ex: CREATE IND
183a0 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c  EX i1 ON t1(a,b,
183b0 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  a); SELECT * FRO
183c0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41  M t1 WHERE a=0 A
183d0 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74  ND b=0; */.    t
183e0 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d  estcase( (pTerm-
183f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
18400 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  CODED)!=0 );.   
18410 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
18420 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
18430 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
18440 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  r1 = codeEqualit
18450 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
18460 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20  erm, pLevel, j, 
18470 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29  bRev, regBase+j)
18480 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65  ;.    if( r1!=re
18490 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20  gBase+j ){.     
184a0 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
184b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
184c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
184d0 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a  arse, regBase);.
184e0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
184f0 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = r1;.      }els
18500 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
18510 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18520 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65  OP_SCopy, r1, re
18530 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
18540 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
18550 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
18560 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
18570 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
18580 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
18590 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
185a0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
185b0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
185c0 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d  ISNULL|WO_IN))==
185d0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
185e0 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
185f0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
18600 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
18610 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
18620 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
18630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18640 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
18650 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65  , regBase+j, pLe
18660 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
18670 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18680 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
18690 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
186a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
186b0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
186c0 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
186d0 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[j])==SQLITE_AF
186e0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
186f0 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
18700 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
18710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18720 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
18730 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
18740 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41  hange(pRight, zA
18750 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ff[j]) ){.      
18760 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
18770 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
18780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
187a0 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
187b0 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
187c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
187d0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
187e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
187f0 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20  is a helper for 
18800 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
18810 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20  e() below.**.** 
18820 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74  pStr holds the t
18830 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ext of an expres
18840 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65  sion that we are
18850 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65   building up one
18860 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69   term.** at a ti
18870 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  me.  This routin
18880 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72  e adds a new ter
18890 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  m to the end of 
188a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
188b0 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70  ** Terms are sep
188c0 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f  arated by AND so
188d0 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74   add the "AND" t
188e0 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ext for second a
188f0 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  nd subsequent.**
18900 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a   terms only..*/.
18910 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
18920 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  ainAppendTerm(. 
18930 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c   StrAccum *pStr,
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18950 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73  The text express
18960 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20  ion being built 
18970 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  */.  int iTerm, 
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69   /* Index of thi
189a0 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69  s term.  First i
189b0 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  s zero */.  cons
189c0 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
189d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
189e0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
189f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18a00 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op             /
18a10 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
18a20 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  erator */.){.  i
18a30 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74  f( iTerm ) sqlit
18a40 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
18a50 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20  (pStr, " AND ", 
18a60 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  5);.  sqlite3Str
18a70 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 70  AccumAppendAll(p
18a80 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20  Str, zColumn);. 
18a90 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
18aa0 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
18ab0 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
18ac0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
18ad0 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a  tr, "?", 1);.}..
18ae0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
18af0 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20  Level describes 
18b00 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73  a strategy for s
18b10 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54  canning table pT
18b20 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ab. This .** fun
18b30 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 65  ction appends te
18b40 78 74 20 74 6f 20 70 53 74 72 20 74 68 61 74 20  xt to pStr that 
18b50 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73 75  describes the su
18b60 62 73 65 74 20 6f 66 20 74 61 62 6c 65 0a 2a 2a  bset of table.**
18b70 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
18b80 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
18b90 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 20   the form of an 
18ba0 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  SQL expression..
18bb0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
18bc0 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a  e, if the query:
18bd0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
18be0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
18bf0 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a  a=1 AND b>2;.**.
18c00 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68  ** is run and th
18c10 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
18c20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20  on (a, b), then 
18c30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
18c40 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e  turns a.** strin
18c50 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  g similar to:.**
18c60 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62  .**   "a=? AND b
18c70 3e 3f 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  >?".*/.static vo
18c80 69 64 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  id explainIndexR
18c90 61 6e 67 65 28 53 74 72 41 63 63 75 6d 20 2a 70  ange(StrAccum *p
18ca0 53 74 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  Str, WhereLoop *
18cb0 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54  pLoop, Table *pT
18cc0 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ab){.  Index *pI
18cd0 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  ndex = pLoop->u.
18ce0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
18cf0 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  u16 nEq = pLoop-
18d00 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
18d10 75 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f  u16 nSkip = pLoo
18d20 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20  p->nSkip;.  int 
18d30 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
18d40 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
18d50 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f 6c 75  l;.  i16 *aiColu
18d60 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
18d70 6f 6c 75 6d 6e 3b 0a 0a 20 20 69 66 28 20 6e 45  olumn;..  if( nE
18d80 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  q==0 && (pLoop->
18d90 77 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f 42  wsFlags&(WHERE_B
18da0 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
18db0 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20  OP_LIMIT))==0 ) 
18dc0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
18dd0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
18de0 70 53 74 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a  pStr, " (", 2);.
18df0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71    for(i=0; i<nEq
18e00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
18e10 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 69   *z = aiColumn[i
18e20 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20  ] < 0 ? "rowid" 
18e30 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
18e40 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  i]].zName;.    i
18e50 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20  f( i>=nSkip ){. 
18e60 20 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65       explainAppe
18e70 6e 64 54 65 72 6d 28 70 53 74 72 2c 20 69 2c 20  ndTerm(pStr, i, 
18e80 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c  z, "=");.    }el
18e90 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20  se{.      if( i 
18ea0 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
18eb0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20  mAppend(pStr, " 
18ec0 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20  AND ", 5);.     
18ed0 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
18ee0 70 53 74 72 2c 20 30 2c 20 22 41 4e 59 28 25 73  pStr, 0, "ANY(%s
18ef0 29 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  )", z);.    }.  
18f00 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
18f10 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
18f20 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
18f30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
18f40 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20  = aiColumn[j] < 
18f50 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  0 ? "rowid" : aC
18f60 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
18f70 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
18f80 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 70 53 74  inAppendTerm(pSt
18f90 72 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  r, i++, z, ">");
18fa0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
18fb0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
18fc0 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
18fd0 20 63 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c   char *z = aiCol
18fe0 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20 22 72 6f  umn[j] < 0 ? "ro
18ff0 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
19000 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
19010 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
19020 64 54 65 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a  dTerm(pStr, i, z
19030 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71  , "<");.  }.  sq
19040 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
19050 65 6e 64 28 70 53 74 72 2c 20 22 29 22 2c 20 31  end(pStr, ")", 1
19060 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
19070 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
19080 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72  o-op unless curr
19090 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
190a0 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
190b0 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e  Y PLAN.** comman
190c0 64 2c 20 6f 72 20 69 66 20 65 69 74 68 65 72 20  d, or if either 
190d0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 6f 72 20  SQLITE_DEBUG or 
190e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
190f0 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 20 77 61  MT_SCANSTATUS wa
19100 73 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 74 20  s.** defined at 
19110 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 49 66  compile-time. If
19120 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d   it is not a no-
19130 6f 70 2c 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  op, a single OP_
19140 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 0a  Explain opcode .
19150 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
19160 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73  he output to des
19170 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20  cribe the table 
19180 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e  scan strategy in
19190 20 70 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49   pLevel..**.** I
191a0 66 20 61 6e 20 4f 50 5f 45 78 70 6c 61 69 6e 20  f an OP_Explain 
191b0 6f 70 63 6f 64 65 20 69 73 20 61 64 64 65 64 20  opcode is added 
191c0 74 6f 20 74 68 65 20 56 4d 2c 20 69 74 73 20 61  to the VM, its a
191d0 64 64 72 65 73 73 20 69 73 20 72 65 74 75 72 6e  ddress is return
191e0 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
191f0 2c 20 69 66 20 6e 6f 20 4f 50 5f 45 78 70 6c 61  , if no OP_Expla
19200 69 6e 20 69 73 20 63 6f 64 65 64 2c 20 7a 65 72  in is coded, zer
19210 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
19220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
19230 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50  lainOneScan(.  P
19240 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19260 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
19270 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
19280 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
19290 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69       /* Table li
192a0 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66  st this loop ref
192b0 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72  ers to */.  Wher
192c0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
192d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
192e0 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f  can to write OP_
192f0 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66  Explain opcode f
19300 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  or */.  int iLev
19310 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
19320 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
19330 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c   for "level" col
19340 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
19350 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
19360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19370 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
19380 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66  "from" column of
19390 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36   output */.  u16
193a0 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
193c0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  Flags passed to 
193d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
193e0 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n() */.){.  int 
193f0 72 65 74 20 3d 20 30 3b 0a 23 69 66 20 21 64 65  ret = 0;.#if !de
19400 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
19410 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
19420 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
19430 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 20  MT_SCANSTATUS). 
19440 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
19450 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66  lain==2 ).#endif
19460 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
19470 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
19480 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
19490 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
194a0 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ];.    Vdbe *v =
194b0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
194c0 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67       /* VM being
194d0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a   constructed */.
194e0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
194f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
19500 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
19510 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndle */.    int 
19520 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  iId = pParse->iS
19530 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c  electId;  /* Sel
19540 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73  ect id (left-mos
19550 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29  t output column)
19560 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65   */.    int isSe
19570 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  arch;           
19580 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
19590 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73  r a SEARCH. Fals
195a0 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20  e for SCAN. */. 
195b0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
195c0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
195d0 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c   /* The controll
195e0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ing WhereLoop ob
195f0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20  ject */.    u32 
19600 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
19610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
19620 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
19630 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
19640 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20    char *zMsg;   
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74  /* Text to add t
19670 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a  o EQP output */.
19680 20 20 20 20 53 74 72 41 63 63 75 6d 20 73 74 72      StrAccum str
19690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
196a0 20 20 2f 2a 20 45 51 50 20 6f 75 74 70 75 74 20    /* EQP output 
196b0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68  string */.    ch
196c0 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20 20 20  ar zBuf[100];   
196d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
196e0 6e 69 74 69 61 6c 20 73 70 61 63 65 20 66 6f 72  nitial space for
196f0 20 45 51 50 20 6f 75 74 70 75 74 20 73 74 72 69   EQP output stri
19700 6e 67 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70  ng */..    pLoop
19710 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
19720 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70  p;.    flags = p
19730 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
19740 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
19750 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
19760 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
19770 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
19780 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
19790 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66     isSearch = (f
197a0 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
197b0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
197c0 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
197d0 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67         || ((flag
197e0 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  s&WHERE_VIRTUALT
197f0 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f  ABLE)==0 && (pLo
19800 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e  op->u.btree.nEq>
19810 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
19820 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28  || (wctrlFlags&(
19830 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
19840 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
19850 4d 41 58 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69  MAX));..    sqli
19860 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
19870 26 73 74 72 2c 20 7a 42 75 66 2c 20 73 69 7a 65  &str, zBuf, size
19880 6f 66 28 7a 42 75 66 29 2c 20 53 51 4c 49 54 45  of(zBuf), SQLITE
19890 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20  _MAX_LENGTH);.  
198a0 20 20 73 74 72 2e 64 62 20 3d 20 64 62 3b 0a 20    str.db = db;. 
198b0 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
198c0 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73 74 72  umAppendAll(&str
198d0 2c 20 69 73 53 65 61 72 63 68 20 3f 20 22 53 45  , isSearch ? "SE
198e0 41 52 43 48 22 20 3a 20 22 53 43 41 4e 22 29 3b  ARCH" : "SCAN");
198f0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
19900 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
19910 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
19920 26 73 74 72 2c 20 30 2c 20 22 20 53 55 42 51 55  &str, 0, " SUBQU
19930 45 52 59 20 25 64 22 2c 20 70 49 74 65 6d 2d 3e  ERY %d", pItem->
19940 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  iSelectId);.    
19950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
19960 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72  ite3XPrintf(&str
19970 2c 20 30 2c 20 22 20 54 41 42 4c 45 20 25 73 22  , 0, " TABLE %s"
19980 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
19990 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
199a0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
199b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
199c0 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22  rintf(&str, 0, "
199d0 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e   AS %s", pItem->
199e0 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20  zAlias);.    }. 
199f0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
19a00 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
19a10 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d  _VIRTUALTABLE))=
19a20 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
19a30 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 30  t char *zFmt = 0
19a40 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
19a50 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Idx;..      asse
19a60 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  rt( pLoop->u.btr
19a70 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 3b 0a  ee.pIndex!=0 );.
19a80 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f        pIdx = pLo
19a90 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
19aa0 65 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ex;.      assert
19ab0 28 20 21 28 66 6c 61 67 73 26 57 48 45 52 45 5f  ( !(flags&WHERE_
19ac0 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28  AUTO_INDEX) || (
19ad0 66 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f  flags&WHERE_IDX_
19ae0 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20 20 69  ONLY) );.      i
19af0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74  f( !HasRowid(pIt
19b00 65 6d 2d 3e 70 54 61 62 29 20 26 26 20 49 73 50  em->pTab) && IsP
19b10 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
19b20 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
19b30 69 66 28 20 69 73 53 65 61 72 63 68 20 29 7b 0a  if( isSearch ){.
19b40 20 20 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d            zFmt =
19b50 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a   "PRIMARY KEY";.
19b60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19b70 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
19b80 26 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49  & WHERE_PARTIALI
19b90 44 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46  DX ){.        zF
19ba0 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20  mt = "AUTOMATIC 
19bb0 50 41 52 54 49 41 4c 20 43 4f 56 45 52 49 4e 47  PARTIAL COVERING
19bc0 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20 20 7d   INDEX";.      }
19bd0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
19be0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
19bf0 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  X ){.        zFm
19c00 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 43  t = "AUTOMATIC C
19c10 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 22 3b 0a  OVERING INDEX";.
19c20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19c30 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
19c40 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  X_ONLY ){.      
19c50 20 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45 52 49    zFmt = "COVERI
19c60 4e 47 20 49 4e 44 45 58 20 25 73 22 3b 0a 20 20  NG INDEX %s";.  
19c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19c80 20 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44 45 58     zFmt = "INDEX
19c90 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
19ca0 20 20 20 20 69 66 28 20 7a 46 6d 74 20 29 7b 0a      if( zFmt ){.
19cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
19cc0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73  trAccumAppend(&s
19cd0 74 72 2c 20 22 20 55 53 49 4e 47 20 22 2c 20 37  tr, " USING ", 7
19ce0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19cf0 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
19d00 30 2c 20 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a  0, zFmt, pIdx->z
19d10 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 65  Name);.        e
19d20 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
19d30 28 26 73 74 72 2c 20 70 4c 6f 6f 70 2c 20 70 49  (&str, pLoop, pI
19d40 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
19d50 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
19d60 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
19d70 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61  _IPK)!=0 && (fla
19d80 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
19d90 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20  RAINT)!=0 ){.   
19da0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19db0 52 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66 28  Range;.      if(
19dc0 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f   flags&(WHERE_CO
19dd0 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f  LUMN_EQ|WHERE_CO
19de0 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20  LUMN_IN) ){.    
19df0 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72      zRange = "(r
19e00 6f 77 69 64 3d 3f 29 22 3b 0a 20 20 20 20 20 20  owid=?)";.      
19e10 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
19e20 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  &WHERE_BOTH_LIMI
19e30 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c  T)==WHERE_BOTH_L
19e40 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
19e50 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69 64  zRange = "(rowid
19e60 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22  >? AND rowid<?)"
19e70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19e80 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
19e90 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
19ea0 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f     zRange = "(ro
19eb0 77 69 64 3e 3f 29 22 3b 0a 20 20 20 20 20 20 7d  wid>?)";.      }
19ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
19ed0 73 65 72 74 28 20 66 6c 61 67 73 26 57 48 45 52  sert( flags&WHER
19ee0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a 20 20  E_TOP_LIMIT);.  
19ef0 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22        zRange = "
19f00 28 72 6f 77 69 64 3c 3f 29 22 3b 0a 20 20 20 20  (rowid<?)";.    
19f10 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
19f20 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
19f30 6c 6c 28 26 73 74 72 2c 20 22 20 55 53 49 4e 47  ll(&str, " USING
19f40 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
19f50 20 4b 45 59 20 22 29 3b 0a 20 20 20 20 20 20 73   KEY ");.      s
19f60 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
19f70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20 7a 52  pendAll(&str, zR
19f80 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  ange);.    }.#if
19f90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19fa0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
19fb0 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
19fc0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
19fd0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
19fe0 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
19ff0 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20 56 49  tf(&str, 0, " VI
1a000 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1a010 58 20 25 64 3a 25 73 22 2c 0a 20 20 20 20 20 20  X %d:%s",.      
1a020 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1a030 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
1a040 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1a050 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
1a060 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1a070 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49  ITE_EXPLAIN_ESTI
1a080 4d 41 54 45 44 5f 52 4f 57 53 0a 20 20 20 20 69  MATED_ROWS.    i
1a090 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d  f( pLoop->nOut>=
1a0a0 31 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  10 ){.      sqli
1a0b0 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c  te3XPrintf(&str,
1a0c0 20 30 2c 20 22 20 28 7e 25 6c 6c 75 20 72 6f 77   0, " (~%llu row
1a0d0 73 29 22 2c 20 73 71 6c 69 74 65 33 4c 6f 67 45  s)", sqlite3LogE
1a0e0 73 74 54 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e 6e  stToInt(pLoop->n
1a0f0 4f 75 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Out));.    }else
1a100 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
1a110 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73  trAccumAppend(&s
1a120 74 72 2c 20 22 20 28 7e 31 20 72 6f 77 29 22 2c  tr, " (~1 row)",
1a130 20 39 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   9);.    }.#endi
1a140 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  f.    zMsg = sql
1a150 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
1a160 73 68 28 26 73 74 72 29 3b 0a 20 20 20 20 72 65  sh(&str);.    re
1a170 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
1a180 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
1a190 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c  ain, iId, iLevel
1a1a0 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 50 34  , iFrom, zMsg,P4
1a1b0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 20  _DYNAMIC);.  }. 
1a1c0 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 23   return ret;.}.#
1a1d0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
1a1e0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76  plainOneScan(u,v
1a1f0 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 65 6e 64  ,w,x,y,z) 0.#end
1a200 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1a210 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
1a220 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a230 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
1a240 55 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  US./*.** Configu
1a250 72 65 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  re the VM passed
1a260 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1a270 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a  gument with an.*
1a280 2a 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  * sqlite3_stmt_s
1a290 63 61 6e 73 74 61 74 75 73 28 29 20 65 6e 74 72  canstatus() entr
1a2a0 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  y corresponding 
1a2b0 74 6f 20 74 68 65 20 73 63 61 6e 20 75 73 65 64  to the scan used
1a2c0 20 74 6f 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   to .** implemen
1a2d0 74 20 6c 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72  t level pLvl. Ar
1a2e0 67 75 6d 65 6e 74 20 70 53 72 63 6c 69 73 74 20  gument pSrclist 
1a2f0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1a300 74 68 65 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61  the FROM .** cla
1a310 75 73 65 20 74 68 61 74 20 74 68 65 20 73 63 61  use that the sca
1a320 6e 20 72 65 61 64 73 20 64 61 74 61 20 66 72 6f  n reads data fro
1a330 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  m..**.** If argu
1a340 6d 65 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e  ment addrExplain
1a350 20 69 73 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75   is not 0, it mu
1a360 73 74 20 62 65 20 74 68 65 20 61 64 64 72 65 73  st be the addres
1a370 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45  s of an .** OP_E
1a380 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
1a390 6f 6e 20 74 68 61 74 20 64 65 73 63 72 69 62 65  on that describe
1a3a0 73 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e  s the same loop.
1a3b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a3c0 61 64 64 53 63 61 6e 53 74 61 74 75 73 28 0a 20  addScanStatus(. 
1a3d0 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3f0 20 2f 2a 20 56 64 62 65 20 74 6f 20 61 64 64 20   /* Vdbe to add 
1a400 73 63 61 6e 73 74 61 74 75 73 20 65 6e 74 72 79  scanstatus entry
1a410 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74   to */.  SrcList
1a420 20 2a 70 53 72 63 6c 69 73 74 2c 20 20 20 20 20   *pSrclist,     
1a430 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
1a440 20 63 6c 61 75 73 65 20 70 4c 76 6c 20 72 65 61   clause pLvl rea
1a450 64 73 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ds data from */.
1a460 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1a470 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  vl,             
1a480 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 61 64    /* Level to ad
1a490 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 65  d scanstatus() e
1a4a0 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  ntry for */.  in
1a4b0 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 20 20  t addrExplain   
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a4d0 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45   Address of OP_E
1a4e0 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f  xplain (or 0) */
1a4f0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1a500 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20 69 36   *zObj = 0;.  i6
1a510 34 20 6e 45 73 74 20 3d 20 31 3b 0a 20 20 57 68  4 nEst = 1;.  Wh
1a520 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
1a530 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20   pLvl->pWLoop;. 
1a540 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1a550 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 50  lags & (WHERE_IP
1a560 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  K|WHERE_VIRTUALT
1a570 41 42 4c 45 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ABLE))==0 ){.   
1a580 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f 70 2d 3e 75   zObj = pLoop->u
1a590 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
1a5a0 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Name;.  }else{. 
1a5b0 20 20 20 7a 4f 62 6a 20 3d 20 70 53 72 63 6c 69     zObj = pSrcli
1a5c0 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e 69 46 72 6f  st->a[pLvl->iFro
1a5d0 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  m].zName;.  }.  
1a5e0 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e  if( pLoop->nOut>
1a5f0 3d 31 30 20 29 7b 0a 20 20 20 20 6e 45 73 74 20  =10 ){.    nEst 
1a600 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
1a610 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  oInt(pLoop->nOut
1a620 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1a630 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
1a640 20 20 20 20 20 20 76 2c 20 61 64 64 72 45 78 70        v, addrExp
1a650 6c 61 69 6e 2c 20 70 4c 76 6c 2d 3e 61 64 64 72  lain, pLvl->addr
1a660 42 6f 64 79 2c 20 70 4c 76 6c 2d 3e 61 64 64 72  Body, pLvl->addr
1a670 56 69 73 69 74 2c 20 6e 45 73 74 2c 20 7a 4f 62  Visit, nEst, zOb
1a680 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  j.  );.}.#else.#
1a690 20 64 65 66 69 6e 65 20 61 64 64 53 63 61 6e 53   define addScanS
1a6a0 74 61 74 75 73 28 61 2c 20 62 2c 20 63 2c 20 64  tatus(a, b, c, d
1a6b0 29 20 28 28 76 6f 69 64 29 64 29 0a 23 65 6e 64  ) ((void)d).#end
1a6c0 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if..../*.** Gene
1a6d0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1a6e0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69  e start of the i
1a6f0 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e  Level-th loop in
1a700 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1a710 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1a720 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
1a730 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74   pWInfo..*/.stat
1a740 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f  ic Bitmask codeO
1a750 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57  neLoopStart(.  W
1a760 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1a770 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20  ,   /* Complete 
1a780 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
1a790 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
1a7a0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  se */.  int iLev
1a7b0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  el,          /* 
1a7c0 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70  Which level of p
1a7d0 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c  WInfo->a[] shoul
1a7e0 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  d be coded */.  
1a7f0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
1a800 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61       /* Which ta
1a810 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
1a820 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
1a830 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
1a840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1a850 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1a860 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
1a870 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1a880 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1a890 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
1a8a0 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
1a8b0 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
1a8c0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1a8d0 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
1a8e0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
1a8f0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
1a900 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
1a910 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
1a920 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
1a930 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a940 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
1a950 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
1a960 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
1a970 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
1a980 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
1a990 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
1a9a0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1a9b0 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68  op;    /* The Wh
1a9c0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62  ereLoop object b
1a9d0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1a9e0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1a9f0 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73  ;    /* Decompos
1aa00 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74  ition of the ent
1aa10 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ire WHERE clause
1aa20 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1aa30 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
1aa40 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45        /* A WHERE
1aa50 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1aa60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa80 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1aa90 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
1aaa0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1aab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1aac0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1aad0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
1ab00 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72  pared stmt under
1ab10 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a   constructions *
1ab20 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1ab30 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
1ab40 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
1ab50 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f  se term being co
1ab60 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ded */.  int add
1ab70 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  rBrk;           
1ab80 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1ab90 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
1aba0 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  ut of the loop *
1abb0 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
1abc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1abd0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1abe0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1abf0 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  h next cycle */.
1ac00 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20    int iRowidReg 
1ac10 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  = 0;        /* R
1ac20 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69  owid is stored i
1ac30 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c  n this register,
1ac40 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a   if not zero */.
1ac50 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65    int iReleaseRe
1ac60 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  g = 0;      /* T
1ac70 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20  emp register to 
1ac80 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75  free before retu
1ac90 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72  rning */..  pPar
1aca0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
1acb0 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  rse;.  v = pPars
1acc0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20  e->pVdbe;.  pWC 
1acd0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
1ace0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1acf0 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  b;.  pLevel = &p
1ad00 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d  WInfo->a[iLevel]
1ad10 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
1ad20 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54  el->pWLoop;.  pT
1ad30 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f  abItem = &pWInfo
1ad40 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
1ad50 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1ad60 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
1ad70 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76  >iCursor;.  pLev
1ad80 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e  el->notReady = n
1ad90 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61  otReady & ~getMa
1ada0 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1adb0 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62  kSet, iCur);.  b
1adc0 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72  Rev = (pWInfo->r
1add0 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26  evMask>>iLevel)&
1ade0 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  1;.  omitTable =
1adf0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1ae00 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
1ae10 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  Y)!=0 .         
1ae20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
1ae30 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1ae40 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
1ae50 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  ;.  VdbeModuleCo
1ae60 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
1ae70 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25   WHERE-loop%d: %
1ae80 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74  s",iLevel,pTabIt
1ae90 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
1aea0 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  );..  /* Create 
1aeb0 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
1aec0 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
1aed0 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
1aee0 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ns.  ** for the 
1aef0 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
1af00 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74  ump to addrBrk t
1af10 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61  o break out of a
1af20 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70   loop..  ** Jump
1af30 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
1af40 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
1af50 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
1af60 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f   of the.  ** loo
1af70 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  p..  **.  ** Whe
1af80 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  n there is an IN
1af90 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c   operator, we al
1afa0 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e  so have a "addrN
1afb0 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20  xt" label that. 
1afc0 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e   ** means to con
1afd0 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
1afe0 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d  ext IN value com
1aff0 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a  bination.  When.
1b000 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e    ** there are n
1b010 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69  o IN operators i
1b020 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
1b030 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22  s, the "addrNxt"
1b040 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74   label.  ** is t
1b050 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72  he same as "addr
1b060 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  Brk"..  */.  add
1b070 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
1b080 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
1b090 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
1b0a0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1b0b0 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d  v);.  addrCont =
1b0c0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
1b0d0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1b0e0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
1b0f0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1b100 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
1b110 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
1b120 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  IN, allocate and
1b130 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
1b140 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74   a memory cell t
1b150 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74  hat records if t
1b160 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65  his table matche
1b170 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  s any.  ** row o
1b180 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
1b190 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
1b1a0 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
1b1b0 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61  >iFrom>0 && (pTa
1b1c0 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70  bItem[0].jointyp
1b1d0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
1b1e0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ){.    pLevel->i
1b1f0 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61  LeftJoin = ++pPa
1b200 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1b210 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b220 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1b230 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  0, pLevel->iLeft
1b240 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
1b250 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74  omment((v, "init
1b260 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61   LEFT JOIN no-ma
1b270 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d  tch flag"));.  }
1b280 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
1b290 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c  ase of a FROM cl
1b2a0 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d  ause subquery im
1b2b0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63  plemented as a c
1b2c0 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  o-routine */.  i
1b2d0 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61  f( pTabItem->via
1b2e0 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
1b2f0 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20   int regYield = 
1b300 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74  pTabItem->regRet
1b310 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
1b320 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1b330 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1b340 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61  regYield, 0, pTa
1b350 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  bItem->addrFillS
1b360 75 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ub);.    pLevel-
1b370 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64  >p2 =  sqlite3Vd
1b380 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b390 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20  ield, regYield, 
1b3a0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64  addrBrk);.    Vd
1b3b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b3c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1b3d0 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20  v, "next row of 
1b3e0 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65  \"%s\"", pTabIte
1b3f0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
1b400 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1b410 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65   = OP_Goto;.  }e
1b420 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
1b430 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1b440 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
1b450 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1b460 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1b470 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  E)!=0 ){.    /* 
1b480 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62  Case 1:  The tab
1b490 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d  le is a virtual-
1b4a0 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20  table.  Use the 
1b4b0 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78  VFilter and VNex
1b4c0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1b4d0 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20    to access the 
1b4e0 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
1b4f0 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
1b500 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
1b510 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69  VFilter */.    i
1b520 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b  nt addrNotFound;
1b530 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1b540 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c  aint = pLoop->nL
1b550 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Term;..    sqlit
1b560 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1b570 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65  pParse);.    iRe
1b580 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1b590 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1b5a0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
1b5b0 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
1b5c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
1b5d0 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  rk;.    for(j=0;
1b5e0 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   j<nConstraint; 
1b5f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1b600 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a  iTarget = iReg+j
1b610 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  +2;.      pTerm 
1b620 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1b630 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  j];.      if( pT
1b640 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
1b650 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  e;.      if( pTe
1b660 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1b670 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
1b680 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1b690 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1b6a0 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
1b6b0 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
1b6c0 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
1b6d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1b6e0 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
1b6f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b700 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1b710 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
1b720 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
1b730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b750 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1b760 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  er, pLoop->u.vta
1b770 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b  b.idxNum, iReg);
1b780 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b790 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1b7a0 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  eger, nConstrain
1b7b0 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  t, iReg+1);.    
1b7c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b7d0 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
1b7e0 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f   iCur, addrNotFo
1b7f0 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20  und, iReg,.     
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1b820 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
1b830 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1b840 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  op->u.vtab.needF
1b850 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  ree ? P4_MPRINTF
1b860 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
1b870 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1b880 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  v);.    pLoop->u
1b890 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1b8a0 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
1b8b0 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26   j<nConstraint &
1b8c0 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20  & j<16; j++){.  
1b8d0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
1b8e0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e  u.vtab.omitMask>
1b8f0 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20  >j)&1 ){.       
1b900 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1b910 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  vel, pLoop->aLTe
1b920 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rm[j]);.      }.
1b930 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
1b940 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
1b950 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1b960 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
1b970 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
1b980 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1b990 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
1b9a0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
1b9b0 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
1b9c0 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
1b9d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1b9e0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1b9f0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
1ba00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1ba10 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
1ba20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1ba30 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1ba40 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70  !=0.   && (pLoop
1ba50 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
1ba60 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45  RE_COLUMN_IN|WHE
1ba70 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d  RE_COLUMN_EQ))!=
1ba80 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  0.  ){.    /* Ca
1ba90 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69  se 2:  We can di
1baa0 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
1bab0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
1bac0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  ing an.    **   
1bad0 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
1bae0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
1baf0 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
1bb00 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20  ld.  Or.    **  
1bb10 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
1bb20 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
1bb30 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
1bb40 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
1bb50 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
1bb60 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
1bb70 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
1bb80 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20  >u.btree.nEq==1 
1bb90 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  );.    pTerm = p
1bba0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
1bbb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1bbc0 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
1bbd0 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
1bbe0 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
1bbf0 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
1bc00 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1bc10 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1bc20 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1bc30 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52  );.    iReleaseR
1bc40 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
1bc50 4d 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52  Mem;.    iRowidR
1bc60 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  eg = codeEqualit
1bc70 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
1bc80 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20  erm, pLevel, 0, 
1bc90 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65  bRev, iReleaseRe
1bca0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77  g);.    if( iRow
1bcb0 69 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52  idReg!=iReleaseR
1bcc0 65 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65  eg ) sqlite3Rele
1bcd0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1bce0 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  e, iReleaseReg);
1bcf0 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
1bd00 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
1bd10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bd20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
1bd30 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67  BeInt, iRowidReg
1bd40 2c 20 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65  , addrNxt); Vdbe
1bd50 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1bd60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bd70 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
1bd80 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
1bd90 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
1bda0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1bdb0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  v);.    sqlite3E
1bdc0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1bdd0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
1bde0 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20  RowidReg, 1);.  
1bdf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1be00 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1be10 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1be20 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
1be30 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1be40 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1be50 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65   = OP_Noop;.  }e
1be60 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  lse if( (pLoop->
1be70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1be80 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IPK)!=0.        
1be90 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
1bea0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1beb0 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29  MN_RANGE)!=0.  )
1bec0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a  {.    /* Case 3:
1bed0 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
1bee0 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
1bef0 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
1bf00 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
1bf10 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f  */.    int testO
1bf20 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1bf30 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
1bf40 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20  int memEndValue 
1bf50 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
1bf60 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
1bf70 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  d;..    assert( 
1bf80 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
1bf90 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70      j = 0;.    p
1bfa0 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30  Start = pEnd = 0
1bfb0 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
1bfc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1bfd0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74  _BTM_LIMIT ) pSt
1bfe0 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
1bff0 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66  erm[j++];.    if
1c000 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1c010 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
1c020 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f  IT ) pEnd = pLoo
1c030 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
1c040 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
1c050 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30  rt!=0 || pEnd!=0
1c060 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76   );.    if( bRev
1c070 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   ){.      pTerm 
1c080 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
1c090 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
1c0a0 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
1c0b0 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  m;.    }.    if(
1c0c0 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
1c0d0 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
1c0e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
1c0f0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65  pression that de
1c100 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20  fines the start 
1c110 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
1c120 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20  nt r1, rTemp;   
1c130 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1c140 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68  s for holding th
1c150 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79  e start boundary
1c160 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
1c170 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1c180 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20  tant maps TK_xx 
1c190 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65  codes into corre
1c1a0 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20  sponding .      
1c1b0 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e  ** seek opcodes.
1c1c0 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20    It depends on 
1c1d0 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  a particular ord
1c1e0 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20  ering of TK_xx. 
1c1f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1c200 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
1c210 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
1c220 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f  /* TK_GT */  OP_
1c230 53 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20  SeekGT,.        
1c240 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20     /* TK_LE */  
1c250 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20  OP_SeekLE,.     
1c260 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a        /* TK_LT *
1c270 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20  /  OP_SeekLT,.  
1c280 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
1c290 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a  E */  OP_SeekGE.
1c2a0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61        };.      a
1c2b0 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b  ssert( TK_LE==TK
1c2c0 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+1 );      /*
1c2d0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
1c2e0 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20  rdering.. */.   
1c2f0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
1c300 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20  ==TK_GT+2 );    
1c310 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65    /*  ... of the
1c320 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e   TK_xx values...
1c330 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1c340 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
1c350 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1c360 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
1c370 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1c380 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  (pStart->wtFlags
1c390 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
1c3a0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1c3b0 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46  ase( pStart->wtF
1c3c0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1c3d0 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20  UAL );.      pX 
1c3e0 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
1c3f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c400 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  X!=0 );.      te
1c410 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
1c420 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
1c430 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76   ); /* transitiv
1c440 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
1c450 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1c460 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1c470 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1c480 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20  ht, &rTemp);.   
1c490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c4a0 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b  dOp3(v, aMoveOp[
1c4b0 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69  pX->op-TK_GT], i
1c4c0 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31  Cur, addrBrk, r1
1c4d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1c4e0 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1c4f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1c500 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d  ageIf(v, pX->op=
1c510 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56  =TK_GT);.      V
1c520 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c530 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b   pX->op==TK_LE);
1c540 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1c550 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d  ageIf(v, pX->op=
1c560 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56  =TK_LT);.      V
1c570 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c580 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b   pX->op==TK_GE);
1c590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c5a0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1c5b0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
1c5c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
1c5d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1c5e0 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29  g(pParse, rTemp)
1c5f0 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  ;.      disableT
1c600 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61  erm(pLevel, pSta
1c610 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rt);.    }else{.
1c620 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c630 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
1c640 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
1c650 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  ewind, iCur, add
1c660 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62  rBrk);.      Vdb
1c670 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1c680 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56  Rev==0);.      V
1c690 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c6a0 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d   bRev!=0);.    }
1c6b0 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
1c6c0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1c6d0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
1c6e0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
1c6f0 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
1c700 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1c710 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1c720 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
1c730 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c740 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
1c750 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72  r!=iCur ); /* Tr
1c760 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1c770 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65  ints */.      te
1c780 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
1c790 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1c7a0 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65  TUAL );.      me
1c7b0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
1c7c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1c7d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c7e0 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
1c7f0 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
1c800 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
1c810 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
1c820 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
1c830 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1c840 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
1c850 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
1c860 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
1c870 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
1c880 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
1c890 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
1c8a0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
1c8b0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
1c8c0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
1c8d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1c8e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1c8f0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1c900 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1c910 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1c920 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1c930 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61  2 = start;.    a
1c940 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
1c950 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  5==0 );.    if( 
1c960 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
1c970 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
1c980 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
1c990 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
1c9a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c9b0 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
1c9c0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1c9d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1c9e0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1c9f0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1ca00 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1ca10 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1ca20 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
1ca30 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
1ca40 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1ca50 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ca60 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65  v, testOp==OP_Le
1ca70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1ca80 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f  erageIf(v, testO
1ca90 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
1caa0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1cab0 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65  v, testOp==OP_Ge
1cac0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1cad0 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f  erageIf(v, testO
1cae0 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
1caf0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1cb00 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
1cb10 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
1cb20 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1cb30 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1cb40 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1cb50 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1cb60 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  D ){.    /* Case
1cb70 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   4: A scan using
1cb80 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
1cb90 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1cba0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1cbb0 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
1cbc0 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
1cbd0 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
1cbe0 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
1cbf0 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
1cc00 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
1cc10 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
1cc20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
1cc30 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1cc40 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
1cc50 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
1cc60 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
1cc70 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1cc80 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
1cc90 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
1cca0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1ccb0 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
1ccc0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
1ccd0 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
1cce0 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
1ccf0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
1cd00 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
1cd10 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
1cd20 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
1cd30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1cd40 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
1cd50 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
1cd60 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1cd70 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
1cd80 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
1cd90 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
1cda0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
1cdb0 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
1cdc0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
1cdd0 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
1cde0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1cdf0 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
1ce00 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1ce10 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
1ce20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
1ce30 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1ce40 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
1ce50 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1ce70 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
1ce80 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1ce90 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
1cea0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
1ceb0 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
1cec0 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
1ced0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
1cee0 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
1cef0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1cf00 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
1cf10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1cf20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
1cf30 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
1cf40 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1cf50 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
1cf60 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
1cf70 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
1cf80 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
1cf90 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
1cfa0 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
1cfb0 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
1cfc0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
1cfd0 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
1cfe0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
1cff0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
1d000 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1d010 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
1d020 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
1d030 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
1d040 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
1d050 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
1d060 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
1d070 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
1d080 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
1d090 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
1d0a0 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
1d0b0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
1d0c0 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
1d0d0 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
1d0e0 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
1d0f0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
1d100 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
1d110 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1d120 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
1d130 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
1d140 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1d150 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
1d160 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1d170 65 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20 20  ekGT,           
1d180 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
1d190 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
1d1a0 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1d1b0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1d1c0 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  LT,           /*
1d1d0 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
1d1e0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1d1f0 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1d200 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45  .      OP_SeekGE
1d210 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
1d220 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1d230 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
1d240 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1d250 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20       OP_SeekLE  
1d260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
1d270 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1d280 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1d290 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1d2a0 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1d2b0 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
1d2c0 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64   = {.      OP_Id
1d2d0 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGE,            
1d2e0 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 0: (end_const
1d2f0 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20  raints && !bRev 
1d300 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20  && !endEq) */.  
1d310 20 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20      OP_IdxGT,   
1d320 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28           /* 1: (
1d330 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
1d340 26 26 20 21 62 52 65 76 20 26 26 20 20 65 6e 64  && !bRev &&  end
1d350 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  Eq) */.      OP_
1d360 49 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20  IdxLE,          
1d370 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
1d380 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65  straints &&  bRe
1d390 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a  v && !endEq) */.
1d3a0 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20        OP_IdxLT, 
1d3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
1d3c0 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
1d3d0 73 20 26 26 20 20 62 52 65 76 20 26 26 20 20 65  s &&  bRev &&  e
1d3e0 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  ndEq) */.    };.
1d3f0 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c      u16 nEq = pL
1d400 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1d410 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1d420 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
1d430 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  s */.    int reg
1d440 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
1d450 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
1d460 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
1d470 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73  onstraint values
1d480 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
1d490 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d  m *pRangeStart =
1d4a0 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69   0;  /* Inequali
1d4b0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
1d4c0 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a   range start */.
1d4d0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1d4e0 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20  RangeEnd = 0;   
1d4f0 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
1d500 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
1d510 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  ge end */.    in
1d520 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20  t startEq;      
1d530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d540 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72  ue if range star
1d550 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  t uses ==, >= or
1d560 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65   <= */.    int e
1d570 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  ndEq;           
1d580 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d590 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65  if range end use
1d5a0 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
1d5b0 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f  /.    int start_
1d5c0 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20  constraints;    
1d5d0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72     /* Start of r
1d5e0 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69  ange is constrai
1d5f0 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ned */.    int n
1d600 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
1d610 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d620 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20  r of constraint 
1d630 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64  terms */.    Ind
1d640 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1d650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d660 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62   index we will b
1d670 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  e using */.    i
1d680 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
1d690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d6a0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
1d6b0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
1d6c0 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65      int nExtraRe
1d6d0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1d6e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
1d6f0 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65  tra registers ne
1d700 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eded */.    int 
1d710 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1d720 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74           /* Inst
1d730 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ruction opcode *
1d740 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61  /.    char *zSta
1d750 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  rtAff;          
1d760 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
1d770 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67  or start of rang
1d780 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
1d790 20 20 20 20 63 68 61 72 20 63 45 6e 64 41 66 66      char cEndAff
1d7a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d7b0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
1d7c0 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f   end of range co
1d7d0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
1d7e0 75 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c  u8 bSeekPastNull
1d7f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1d800 54 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73  True to seek pas
1d810 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20  t initial nulls 
1d820 2a 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41  */.    u8 bStopA
1d830 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  tNull = 0;      
1d840 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69      /* Add condi
1d850 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74  tion to terminat
1d860 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20  e at NULLs */.. 
1d870 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
1d880 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
1d890 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
1d8a0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
1d8b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e      assert( nEq>
1d8c0 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b  =pLoop->nSkip );
1d8d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1d8e0 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
1d8f0 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
1d900 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
1d910 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
1d920 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1d930 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
1d940 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
1d950 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
1d960 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
1d970 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1d980 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
1d990 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
1d9a0 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
1d9b0 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
1d9c0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
1d9d0 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
1d9e0 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
1d9f0 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
1da00 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
1da10 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
1da20 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
1da30 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
1da40 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
1da50 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
1da60 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
1da70 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
1da80 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
1da90 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
1daa0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
1dab0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20  ->pOrderBy==0.  
1dac0 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f         || pWInfo
1dad0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1dae0 72 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  r==1.         ||
1daf0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1db00 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
1db10 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20  BY_MIN)==0 );.  
1db20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1db30 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1db40 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
1db50 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e       && pWInfo->
1db60 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26  nOBSat>0.     &&
1db70 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e   (pIdx->nKeyCol>
1db80 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
1db90 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
1dba0 3e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20  >nSkip==0 );.   
1dbb0 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c     bSeekPastNull
1dbc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74   = 1;.      nExt
1dbd0 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
1dbe0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e  ..    /* Find an
1dbf0 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  y inequality con
1dc00 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f  straint terms fo
1dc10 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  r the start and 
1dc20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  end .    ** of t
1dc30 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a  he range. .    *
1dc40 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20  /.    j = nEq;. 
1dc50 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1dc60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
1dc70 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
1dc80 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70   pRangeStart = p
1dc90 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
1dca0 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  ];.      nExtraR
1dcb0 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  eg = 1;.    }.  
1dcc0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1dcd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
1dce0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1dcf0 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f 6f  pRangeEnd = pLoo
1dd00 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
1dd10 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
1dd20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
1dd30 52 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20 20  RangeStart==0.  
1dd40 20 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49 64       && (j = pId
1dd50 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
1dd60 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )>=0 .       && 
1dd70 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
1dd80 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  ol[j].notNull==0
1dd90 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1dda0 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20    bSeekPastNull 
1ddb0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1ddc0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1ddd0 52 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20 28  RangeEnd==0 || (
1dde0 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
1ddf0 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
1de00 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  ==0 );..    /* G
1de10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1de20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
1de30 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
1de40 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
1de50 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68   ** and store th
1de60 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
1de70 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72  e terms in an ar
1de80 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
1de90 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
1dea0 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20   at regBase..   
1deb0 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20   */.    regBase 
1dec0 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  = codeAllEqualit
1ded0 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c  yTerms(pParse,pL
1dee0 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61  evel,bRev,nExtra
1def0 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b  Reg,&zStartAff);
1df00 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 53 74  .    assert( zSt
1df10 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71 6c  artAff==0 || sql
1df20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
1df30 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a  artAff)>=nEq );.
1df40 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66      if( zStartAf
1df50 66 20 29 20 63 45 6e 64 41 66 66 20 3d 20 7a 53  f ) cEndAff = zS
1df60 74 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20 20  tartAff[nEq];.  
1df70 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
1df80 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20  el->addrNxt;..  
1df90 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1dfa0 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f  oing a reverse o
1dfb0 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20  rder scan on an 
1dfc0 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  ascending index,
1dfd0 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72   or.    ** a for
1dfe0 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
1dff0 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
1e000 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
1e010 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  ge the .    ** s
1e020 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72  tart and end ter
1e030 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20  ms (pRangeStart 
1e040 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a  and pRangeEnd)..
1e050 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1e060 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  nEq<pIdx->nKeyCo
1e070 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78  l && bRev==(pIdx
1e080 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
1e090 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
1e0a0 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76  )).     || (bRev
1e0b0 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   && pIdx->nKeyCo
1e0c0 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  l==nEq).    ){. 
1e0d0 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
1e0e0 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64  erm *, pRangeEnd
1e0f0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
1e100 20 20 20 20 20 20 53 57 41 50 28 75 38 2c 20 62        SWAP(u8, b
1e110 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62 53  SeekPastNull, bS
1e120 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20 20  topAtNull);.    
1e130 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  }..    testcase(
1e140 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
1e150 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f  (pRangeStart->eO
1e160 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
1e170 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1e180 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
1e190 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74   && (pRangeStart
1e1a0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e1b0 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _GE)!=0 );.    t
1e1c0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
1e1d0 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64  nd && (pRangeEnd
1e1e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e1f0 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _LE)!=0 );.    t
1e200 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
1e210 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e 64  nd && (pRangeEnd
1e220 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e230 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 73  _GE)!=0 );.    s
1e240 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
1e250 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
1e260 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
1e270 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
1e280 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
1e290 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
1e2a0 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
1e2b0 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
1e2c0 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
1e2d0 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
1e2e0 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
1e2f0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
1e300 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
1e310 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1e320 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
1e330 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
1e340 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
1e350 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
1e360 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
1e370 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78  pRangeStart->pEx
1e380 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1e390 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1e3a0 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
1e3b0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
1e3c0 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
1e3d0 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
1e3e0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
1e3f0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
1e400 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
1e410 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b  pRight).      ){
1e420 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e430 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e440 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65  _IsNull, regBase
1e450 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
1e460 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1e470 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
1e480 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72  .      if( zStar
1e490 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  tAff ){.        
1e4a0 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
1e4b0 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
1e4c0 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
1e4d0 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
1e4e0 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ONE){.          
1e4f0 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
1e500 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
1e510 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
1e520 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
1e530 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
1e540 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
1e550 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
1e560 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
1e570 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
1e580 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
1e590 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
1e5a0 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
1e5b0 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
1e5c0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
1e5d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1e5e0 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
1e5f0 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
1e600 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  e(pRight, zStart
1e610 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
1e620 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
1e630 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
1e640 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1e650 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
1e660 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
1e670 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e680 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77  ( pRangeStart->w
1e690 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1e6a0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c  RTUAL );.    }el
1e6b0 73 65 20 69 66 28 20 62 53 65 65 6b 50 61 73 74  se if( bSeekPast
1e6c0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Null ){.      sq
1e6d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e6e0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
1e6f0 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
1e700 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
1e710 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20  ;.      startEq 
1e720 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74  = 0;.      start
1e730 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31  _constraints = 1
1e740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65  ;.    }.    code
1e750 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
1e760 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
1e770 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53 65  Constraint - bSe
1e780 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74 61  ekPastNull, zSta
1e790 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d  rtAff);.    op =
1e7a0 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74   aStartOp[(start
1e7b0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29  _constraints<<2)
1e7c0 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20   + (startEq<<1) 
1e7d0 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73  + bRev];.    ass
1e7e0 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20  ert( op!=0 );.  
1e7f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e800 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
1e810 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
1e820 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
1e830 61 69 6e 74 29 3b 0a 20 20 20 20 56 64 62 65 43  aint);.    VdbeC
1e840 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1e850 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e860 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 29  , op==OP_Rewind)
1e870 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1e880 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20  =OP_Rewind );.  
1e890 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e8a0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29  (v, op==OP_Last)
1e8b0 3b 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  ;    testcase( o
1e8c0 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20  p==OP_Last );.  
1e8d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e8e0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  (v, op==OP_SeekG
1e8f0 54 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  T);  testcase( o
1e900 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b 0a  p==OP_SeekGT );.
1e910 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1e920 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
1e930 6b 47 45 29 3b 20 20 74 65 73 74 63 61 73 65 28  kGE);  testcase(
1e940 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 29   op==OP_SeekGE )
1e950 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1e960 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
1e970 65 65 6b 4c 45 29 3b 20 20 74 65 73 74 63 61 73  eekLE);  testcas
1e980 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45  e( op==OP_SeekLE
1e990 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65   );.    VdbeCove
1e9a0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1e9b0 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74 63  _SeekLT);  testc
1e9c0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
1e9d0 4c 54 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  LT );..    /* Lo
1e9e0 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ad the value for
1e9f0 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
1ea00 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68  constraint at th
1ea10 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
1ea20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e   ** range (if an
1ea30 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  y)..    */.    n
1ea40 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
1ea50 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
1ea60 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
1ea70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
1ea80 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52  geEnd->pExpr->pR
1ea90 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
1eaa0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1eab0 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ve(pParse, regBa
1eac0 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20  se+nEq, 1);.    
1ead0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1eae0 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
1eaf0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
1eb00 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
1eb10 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
1eb20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20  TERM_VNULL)==0. 
1eb30 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1eb40 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52  ExprCanBeNull(pR
1eb50 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  ight).      ){. 
1eb60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1eb70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1eb80 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
1eb90 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
1eba0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ebb0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
1ebc0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1ebd0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1ebe0 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29  pRight, cEndAff)
1ebf0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  !=SQLITE_AFF_NON
1ec00 45 0a 20 20 20 20 20 20 20 26 26 20 21 73 71 6c  E.       && !sql
1ec10 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
1ec20 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
1ec30 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20  ight, cEndAff). 
1ec40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1ec50 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
1ec60 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
1ec70 65 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41  e+nEq, 1, &cEndA
1ec80 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
1ec90 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
1eca0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ecb0 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46  ( pRangeEnd->wtF
1ecc0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1ecd0 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  UAL );.    }else
1ece0 20 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c   if( bStopAtNull
1ecf0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ed00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ed10 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
1ed20 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 65  se+nEq);.      e
1ed30 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndEq = 0;.      
1ed40 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
1ed50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1ed60 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72  DbFree(db, zStar
1ed70 74 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  tAff);..    /* T
1ed80 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62  op of the loop b
1ed90 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65  ody */.    pLeve
1eda0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
1edb0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1edc0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
1edd0 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75   if the index cu
1ede0 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65  rsor is past the
1edf0 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67   end of the rang
1ee00 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43  e. */.    if( nC
1ee10 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20  onstraint ){.   
1ee20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 62     op = aEndOp[b
1ee30 52 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b 0a  Rev*2 + endEq];.
1ee40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ee50 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
1ee60 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
1ee70 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
1ee80 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20  nstraint);.     
1ee90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1eea0 50 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62 65  P_IdxGT );  Vdbe
1eeb0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1eec0 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20  ==OP_IdxGT );.  
1eed0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1eee0 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20 56  ==OP_IdxGE );  V
1eef0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ef00 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b   op==OP_IdxGE );
1ef10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ef20 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b   op==OP_IdxLT );
1ef30 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1ef40 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  (v, op==OP_IdxLT
1ef50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ef60 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45  se( op==OP_IdxLE
1ef70 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
1ef80 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64  eIf(v, op==OP_Id
1ef90 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  xLE );.    }..  
1efa0 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61    /* Seek the ta
1efb0 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72  ble cursor, if r
1efc0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64  equired */.    d
1efd0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1efe0 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  l, pRangeStart);
1eff0 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
1f000 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45  (pLevel, pRangeE
1f010 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69  nd);.    if( omi
1f020 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
1f030 2f 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f 76  /* pIdx is a cov
1f040 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f  ering index.  No
1f050 20 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73 20   need to access 
1f060 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20  the main table. 
1f070 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
1f080 20 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e   HasRowid(pIdx->
1f090 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
1f0a0 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70   iRowidReg = ++p
1f0b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1f0c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f0d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
1f0e0 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
1f0f0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1f100 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f110 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1f120 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1f130 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1f140 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f150 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
1f160 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
1f170 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
1f180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75     }else if( iCu
1f190 72 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20  r!=iIdxCur ){.  
1f1a0 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
1f1b0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
1f1c0 65 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54  eyIndex(pIdx->pT
1f1d0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f  able);.      iRo
1f1e0 77 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33  widReg = sqlite3
1f1f0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1f200 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  rse, pPk->nKeyCo
1f210 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  l);.      for(j=
1f220 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
1f230 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
1f240 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   k = sqlite3Colu
1f250 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
1f260 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
1f270 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f280 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1f290 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
1f2a0 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67  ur, k, iRowidReg
1f2b0 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
1f2c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f2d0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
1f2e0 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64  tFound, iCur, ad
1f2f0 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20  drCont,.        
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50     iRowidReg, pP
1f320 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  k->nKeyCol); Vdb
1f330 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1f340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f    }..    /* Reco
1f350 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
1f360 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
1f370 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44  nate the loop. D
1f380 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57  isable .    ** W
1f390 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
1f3a0 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74  s made redundant
1f3b0 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61   by the index ra
1f3c0 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f  nge scan..    */
1f3d0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1f3e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1f3f0 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  ONEROW ){.      
1f400 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1f410 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Noop;.    }else 
1f420 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
1f430 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1f440 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  P_Prev;.    }els
1f450 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
1f460 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
1f470 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1f480 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
1f490 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20     pLevel->p3 = 
1f4a0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26  (pLoop->wsFlags&
1f4b0 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
1f4c0 29 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20  )!=0 ? 1:0;.    
1f4d0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1f4e0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
1f4f0 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20  TRAINT)==0 ){.  
1f500 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
1f510 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
1f520 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
1f530 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f540 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
1f550 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
1f560 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  }.  }else..#ifnd
1f570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ef SQLITE_OMIT_O
1f580 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  R_OPTIMIZATION. 
1f590 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1f5a0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
1f5b0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43  I_OR ){.    /* C
1f5c0 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d  ase 5:  Two or m
1f5d0 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69  ore separately i
1f5e0 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
1f5f0 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20  nected by OR.   
1f600 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
1f610 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1f620 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
1f630 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20   t1(a,b,c,d);.  
1f640 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
1f650 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b  DEX i1 ON t1(a);
1f660 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1f670 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28   INDEX i2 ON t1(
1f680 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  b);.    **   CRE
1f690 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20  ATE INDEX i3 ON 
1f6a0 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  t1(c);.    **.  
1f6b0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20    **   SELECT * 
1f6c0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
1f6d0 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31  5 OR b=7 OR (c=1
1f6e0 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20  1 AND d=13).    
1f6f0 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65  **.    ** In the
1f700 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20   example, there 
1f710 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65  are three indexe
1f720 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  d terms connecte
1f730 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20  d by OR..    ** 
1f740 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  The top of the l
1f750 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  oop looks like t
1f760 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
1f770 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
1f780 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
1f790 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
1f7a0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
1f7b0 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   1.    **.    **
1f7c0 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20   Then, for each 
1f7d0 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68  indexed term, th
1f7e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65  e following. The
1f7f0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20   arguments to.  
1f800 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20    ** RowSetTest 
1f810 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68  are such that th
1f820 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63  e rowid of the c
1f830 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e  urrent row is in
1f840 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e  serted.    ** in
1f850 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49  to the RowSet. I
1f860 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
1f870 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c  present, control
1f880 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a   skips the.    *
1f890 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61  * Gosub opcode a
1f8a0 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68  nd jumps straigh
1f8b0 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  t to the code ge
1f8c0 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65  nerated by Where
1f8d0 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  End()..    **.  
1f8e0 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
1f8f0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74  te3WhereBegin(<t
1f900 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20  erm>).    **    
1f910 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74        RowSetTest
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64    # Insert rowid
1f940 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20   into rowset.   
1f950 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73   **          Gos
1f960 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20  ub      2 A.    
1f970 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
1f980 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20  3WhereEnd().    
1f990 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77  **.    ** Follow
1f9a0 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63  ing the above, c
1f9b0 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ode to terminate
1f9c0 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c   the loop. Label
1f9d0 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20   A, the target. 
1f9e0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73     ** of the Gos
1f9f0 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20  ub above, jumps 
1fa00 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  to the instructi
1fa10 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74  on right after t
1fa20 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a  he Goto..    **.
1fa30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1fa40 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
1fa60 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
1fa70 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20   reg 1.    **   
1fa80 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20         Goto     
1fa90 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20    B             
1faa0 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73     # The loop is
1fab0 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a   finished..    *
1fac0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  *.    **       A
1fad0 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20  : <loop body>   
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1faf0 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61  Return data, wha
1fb00 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  tever..    **.  
1fb10 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65    **          Re
1fb20 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20  turn     2      
1fb30 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70            # Jump
1fb40 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73   back to the Gos
1fb50 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ub.    **.    **
1fb60 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72         B: <after
1fb70 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a   the loop>.    *
1fb80 2a 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32  *.    ** Added 2
1fb90 30 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68  014-05-26: If th
1fba0 65 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54  e table is a WIT
1fbb0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1fbc0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73  , then.    ** us
1fbd0 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  e an ephemeral i
1fbe0 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
1fbf0 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f  a RowSet to reco
1fc00 72 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20  rd the primary. 
1fc10 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68     ** keys of th
1fc20 65 20 72 6f 77 73 20 77 65 20 68 61 76 65 20 61  e rows we have a
1fc30 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20  lready seen..   
1fc40 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
1fc50 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
1fc60 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
1fc70 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
1fc80 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
1fc90 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
1fca0 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
1fcb0 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
1fcc0 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
1fcd0 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
1fce0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76  .    Index *pCov
1fcf0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1fd00 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63    /* Potential c
1fd10 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f  overing index (o
1fd20 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69  r NULL) */.    i
1fd30 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61  nt iCovCur = pPa
1fd40 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a  rse->nTab++;  /*
1fd50 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   Cursor used for
1fd60 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66   index scans (if
1fd70 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e   any) */..    in
1fd80 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
1fd90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
1fda0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1fdb0 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
1fdc0 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
1fdd0 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1fe00 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
1fe10 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
1fe20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe40 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1fe50 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
1fe60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
1fe70 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
1fe80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1fe90 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
1fea0 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
1feb0 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fed0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1fee0 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
1fef0 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
1ff00 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
1ff10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ff20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
1ff30 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
1ff40 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
1ff50 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff70 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1ff80 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c  .    u16 wctrlFl
1ff90 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1ffa0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1ffb0 20 66 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63   for sub-WHERE c
1ffc0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 45 78 70  lause */.    Exp
1ffd0 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b  r *pAndExpr = 0;
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e  /* An ".. AND (.
20000 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
20010 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
20020 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
20030 54 61 62 3b 0a 20 20 20 0a 20 20 20 20 70 54 65  Tab;.   .    pTe
20040 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
20050 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[0];.    asser
20060 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
20070 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
20080 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
20090 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _OR );.    asser
200a0 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
200b0 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
200c0 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57  )!=0 );.    pOrW
200d0 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  c = &pTerm->u.pO
200e0 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70  rInfo->wc;.    p
200f0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52  Level->op = OP_R
20100 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65  eturn;.    pLeve
20110 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72  l->p1 = regRetur
20120 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  n;..    /* Set u
20130 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  p a new SrcList 
20140 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69  in pOrTab contai
20150 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62  ning the table b
20160 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20  eing scanned.   
20170 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70   ** by this loop
20180 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f   in the a[0] slo
20190 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61  t and all notRea
201a0 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31  dy tables in a[1
201b0 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  ..] slots..    *
201c0 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74  * This becomes t
201d0 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68  he SrcList in th
201e0 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
201f0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
20200 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  Begin()..    */.
20210 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
20220 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20  nLevel>1 ){.    
20230 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b    int nNotReady;
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
20260 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  f notReady table
20270 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
20280 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20290 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20  origSrc;     /* 
202a0 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66  Original list of
202b0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
202c0 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49   nNotReady = pWI
202d0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c  nfo->nLevel - iL
202e0 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20  evel - 1;.      
202f0 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33  pOrTab = sqlite3
20300 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62  StackAllocRaw(db
20310 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
20330 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e  zeof(*pOrTab)+ n
20340 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28  NotReady*sizeof(
20350 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a  pOrTab->a[0]));.
20360 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62        if( pOrTab
20370 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74  ==0 ) return not
20380 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72  Ready;.      pOr
20390 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75  Tab->nAlloc = (u
203a0 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31  8)(nNotReady + 1
203b0 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  );.      pOrTab-
203c0 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e  >nSrc = pOrTab->
203d0 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65  nAlloc;.      me
203e0 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20  mcpy(pOrTab->a, 
203f0 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66  pTabItem, sizeof
20400 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20  (*pTabItem));.  
20410 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57      origSrc = pW
20420 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
20430 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31  a;.      for(k=1
20440 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20  ; k<=nNotReady; 
20450 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  k++){.        me
20460 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b  mcpy(&pOrTab->a[
20470 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65  k], &origSrc[pLe
20480 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73  vel[k].iFrom], s
20490 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b  izeof(pOrTab->a[
204a0 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  k]));.      }.  
204b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
204c0 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  OrTab = pWInfo->
204d0 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  pTabList;.    }.
204e0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
204f0 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65  ze the rowset re
20500 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69  gister to contai
20510 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e  n NULL. An SQL N
20520 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  ULL is .    ** e
20530 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20  quivalent to an 
20540 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20 4f  empty rowset.  O
20550 72 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70 68  r, create an eph
20560 65 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20 20  emeral index.   
20570 20 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20 68   ** capable of h
20580 6f 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b  olding primary k
20590 65 79 73 20 69 6e 20 74 68 65 20 63 61 73 65 20  eys in the case 
205a0 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  of a WITHOUT ROW
205b0 49 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ID..    **.    *
205c0 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a  * Also initializ
205d0 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63  e regReturn to c
205e0 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65  ontain the addre
205f0 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75  ss of the instru
20600 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d  ction .    ** im
20610 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
20620 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72  ing the OP_Retur
20630 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  n at the bottom 
20640 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69  of the loop. Thi
20650 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75  s.    ** is requ
20660 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62  ired in a few ob
20670 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20  scure LEFT JOIN 
20680 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74  cases where cont
20690 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a  rol jumps.    **
206a0 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66   over the top of
206b0 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74   the loop into t
206c0 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49  he body of it. I
206d0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
206e0 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20  .    ** correct 
206f0 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65  response for the
20700 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64   end-of-loop cod
20710 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  e (the OP_Return
20720 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  ) is to .    ** 
20730 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
20740 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
20750 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e  tion, just as an
20760 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66   OP_Next does if
20770 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f  .    ** called o
20780 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a  n an uninitializ
20790 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a  ed cursor..    *
207a0 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  /.    if( (pWInf
207b0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
207c0 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
207d0 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
207e0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
207f0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ab) ){.        r
20800 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61  egRowset = ++pPa
20810 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
20820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20830 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
20840 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
20850 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20860 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
20870 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
20880 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
20890 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65          regRowse
208a0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
208b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ++;.        sqli
208c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
208d0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
208e0 6c 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70 50  l, regRowset, pP
208f0 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20  k->nKeyCol);.   
20900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20910 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
20920 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20  rse, pPk);.     
20930 20 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69   }.      regRowi
20940 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
20950 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52  em;.    }.    iR
20960 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  etInit = sqlite3
20970 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20980 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
20990 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a  Return);..    /*
209a0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
209b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
209c0 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20   z of the form: 
209d0 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e   (x1 OR x2 OR ..
209e0 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20  .) AND y.    ** 
209f0 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74  Then for every t
20a00 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65  erm xN, evaluate
20a10 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65   as the subexpre
20a20 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a  ssion: xN AND z.
20a30 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c      ** That way,
20a40 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74   terms in y that
20a50 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e   are factored in
20a60 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69  to the disjuncti
20a70 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  on will.    ** b
20a80 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74  e picked up by t
20a90 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
20aa0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ls to sqlite3Whe
20ab0 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e  reBegin() below.
20ac0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
20ad0 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75  ctually, each su
20ae0 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63  bexpression is c
20af0 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20  onverted to "xN 
20b00 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69  AND w" where w i
20b10 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e  s.    ** the "in
20b20 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73  teresting" terms
20b30 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68   of z - terms th
20b40 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  at did not origi
20b50 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  nate in the.    
20b60 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ** ON or USING c
20b70 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
20b80 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20  JOIN, and terms 
20b90 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20  that are usable 
20ba0 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  as .    ** indic
20bb0 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
20bc0 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * This optimizat
20bd0 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70  ion also only ap
20be0 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31  plies if the (x1
20bf0 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74   OR x2 OR ...) t
20c00 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  erm.    ** is no
20c10 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
20c20 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
20c30 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20  a LEFT JOIN..   
20c40 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68   ** See ticket h
20c50 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
20c60 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32  .org/src/info/f2
20c70 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a  369304e4.    */.
20c80 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65      if( pWC->nTe
20c90 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  rm>1 ){.      in
20ca0 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  t iTerm;.      f
20cb0 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72  or(iTerm=0; iTer
20cc0 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54  m<pWC->nTerm; iT
20cd0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
20ce0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57  Expr *pExpr = pW
20cf0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70  C->a[iTerm].pExp
20d00 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26  r;.        if( &
20d10 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d  pWC->a[iTerm] ==
20d20 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75   pTerm ) continu
20d30 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  e;.        if( E
20d40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
20d50 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
20d60 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  n) ) continue;. 
20d70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20d80 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77   pWC->a[iTerm].w
20d90 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
20da0 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20 20  INFO );.        
20db0 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61  testcase( pWC->a
20dc0 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20  [iTerm].wtFlags 
20dd0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
20de0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
20df0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c  C->a[iTerm].wtFl
20e00 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e  ags & (TERM_ORIN
20e10 46 4f 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  FO|TERM_VIRTUAL)
20e20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20e30 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61       if( (pWC->a
20e40 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f  [iTerm].eOperato
20e50 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29  r & WO_ALL)==0 )
20e60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20e70 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
20e80 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
20e90 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
20ea0 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69   pAndExpr = sqli
20eb0 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
20ec0 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b  AndExpr, pExpr);
20ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20ee0 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20  f( pAndExpr ){. 
20ef0 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20         pAndExpr 
20f00 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
20f10 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30  Parse, TK_AND, 0
20f20 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a  , pAndExpr, 0);.
20f30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20f40 20 20 20 2f 2a 20 52 75 6e 20 61 20 73 65 70 61     /* Run a sepa
20f50 72 61 74 65 20 57 48 45 52 45 20 63 6c 61 75 73  rate WHERE claus
20f60 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
20f70 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
20f80 2e 20 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  .  After.    ** 
20f90 65 6c 69 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c  eliminating dupl
20fa0 69 63 61 74 65 73 20 66 72 6f 6d 20 6f 74 68 65  icates from othe
20fb0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c  r WHERE clauses,
20fc0 20 74 68 65 20 61 63 74 69 6f 6e 20 66 6f 72 20   the action for 
20fd0 65 61 63 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d  each.    ** sub-
20fe0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
20ff0 74 6f 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  to to invoke the
21000 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
21010 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  as a subroutine.
21020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 63 74 72  .    */.    wctr
21030 6c 46 6c 61 67 73 20 3d 20 20 57 48 45 52 45 5f  lFlags =  WHERE_
21040 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 0a  OMIT_OPEN_CLOSE.
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21060 7c 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  | WHERE_FORCE_TA
21070 42 4c 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  BLE.            
21080 20 20 20 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54      | WHERE_ONET
21090 41 42 4c 45 5f 4f 4e 4c 59 3b 0a 20 20 20 20 66  ABLE_ONLY;.    f
210a0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57  or(ii=0; ii<pOrW
210b0 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  c->nTerm; ii++){
210c0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
210d0 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72   *pOrTerm = &pOr
210e0 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20  Wc->a[ii];.     
210f0 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
21100 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c  ftCursor==iCur |
21110 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  | (pOrTerm->eOpe
21120 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
21130 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  =0 ){.        Wh
21140 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e  ereInfo *pSubWIn
21150 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
21160 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65   Info for single
21170 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f   OR-term scan */
21180 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
21190 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d  OrExpr = pOrTerm
211a0 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75 72 72  ->pExpr; /* Curr
211b0 65 6e 74 20 4f 52 20 63 6c 61 75 73 65 20 74 65  ent OR clause te
211c0 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  rm */.        in
211d0 74 20 6a 31 20 3d 20 30 3b 20 20 20 20 20 20 20  t j1 = 0;       
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
211f0 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70   Address of jump
21200 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
21210 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
21220 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
21230 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
21240 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
21250 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
21260 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
21270 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
21280 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
21290 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
212a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
212b0 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
212c0 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
212d0 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
212e0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
212f0 45 28 30 78 66 66 66 66 2c 20 28 22 53 75 62 70  E(0xffff, ("Subp
21300 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c 61 75 73  lan for OR-claus
21310 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  e:\n"));.       
21320 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c   pSubWInfo = sql
21330 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
21340 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70  Parse, pOrTab, p
21350 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20  OrExpr, 0, 0,.  
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20      wctrlFlags, 
21390 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20 20  iCovCur);.      
213a0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49    assert( pSubWI
213b0 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  nfo || pParse->n
213c0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
213d0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
213e0 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
213f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
21400 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f  ereLoop *pSubLoo
21410 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  p;.          int
21420 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 65   addrExplain = e
21430 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
21450 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53  rse, pOrTab, &pS
21460 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69  ubWInfo->a[0], i
21470 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69  Level, pLevel->i
21480 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20  From, 0.        
21490 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61    );.          a
214a0 64 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20  ddScanStatus(v, 
214b0 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e  pOrTab, &pSubWIn
214c0 66 6f 2d 3e 61 5b 30 5d 2c 20 61 64 64 72 45 78  fo->a[0], addrEx
214d0 70 6c 61 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20  plain);..       
214e0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
214f0 65 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75  e sub-WHERE clau
21500 73 65 20 62 6f 64 79 2e 20 20 46 69 72 73 74 20  se body.  First 
21510 73 6b 69 70 20 6f 76 65 72 0a 20 20 20 20 20 20  skip over.      
21520 20 20 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65      ** duplicate
21530 20 72 6f 77 73 20 66 72 6f 6d 20 70 72 69 6f 72   rows from prior
21540 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73   sub-WHERE claus
21550 65 73 2c 20 61 6e 64 20 72 65 63 6f 72 64 20 74  es, and record t
21560 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
21570 72 6f 77 69 64 20 28 6f 72 20 50 52 49 4d 41 52  rowid (or PRIMAR
21580 59 20 4b 45 59 29 20 66 6f 72 20 74 68 65 20 63  Y KEY) for the c
21590 75 72 72 65 6e 74 20 72 6f 77 20 73 6f 20 74 68  urrent row so th
215a0 61 74 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  at the same.    
215b0 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 77 69 6c        ** row wil
215c0 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69 6e 20  l be skipped in 
215d0 73 75 62 73 65 71 75 65 6e 74 20 73 75 62 2d 57  subsequent sub-W
215e0 48 45 52 45 20 63 6c 61 75 73 65 73 2e 0a 20 20  HERE clauses..  
215f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21600 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
21610 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
21620 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
21630 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
21640 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20        int r;.   
21650 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65           int iSe
21660 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d  t = ((ii==pOrWc-
21670 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29  >nTerm-1)?-1:ii)
21680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21690 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
216a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
216b0 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70    r = sqlite3Exp
216c0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
216d0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 2d 31 2c  Parse, pTab, -1,
216e0 20 69 43 75 72 2c 20 72 65 67 52 6f 77 69 64 2c   iCur, regRowid,
216f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
21700 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
21710 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
21720 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
21730 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 69  egRowset, 0, r,i
21740 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Set);.          
21750 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
21760 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
21770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21780 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
21790 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
217a0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
217b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
217c0 6e 74 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b  nt nPk = pPk->nK
217d0 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  eyCol;.         
217e0 20 20 20 20 20 69 6e 74 20 69 50 6b 3b 0a 0a 20       int iPk;.. 
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21800 52 65 61 64 20 74 68 65 20 50 4b 20 69 6e 74 6f  Read the PK into
21810 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 65 6d   an array of tem
21820 70 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  p registers. */.
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 20                r 
21840 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
21850 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50  Range(pParse, nP
21860 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
21870 20 20 66 6f 72 28 69 50 6b 3d 30 3b 20 69 50 6b    for(iPk=0; iPk
21880 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20 20  <nPk; iPk++){.  
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
218a0 74 20 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61 69  t iCol = pPk->ai
218b0 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20 20  Column[iPk];.   
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
218d0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
218e0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54  olumn(pParse, pT
218f0 61 62 2c 20 69 43 6f 6c 2c 20 69 43 75 72 2c 20  ab, iCol, iCur, 
21900 72 2b 69 50 6b 2c 20 30 29 3b 0a 20 20 20 20 20  r+iPk, 0);.     
21910 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
21920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
21930 63 6b 20 69 66 20 74 68 65 20 74 65 6d 70 20 74  ck if the temp t
21940 61 62 6c 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  able already con
21950 74 61 69 6e 73 20 74 68 69 73 20 6b 65 79 2e 20  tains this key. 
21960 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 20  If so,.         
21970 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 20       ** the row 
21980 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
21990 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
219a0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 0a   result set and.
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
219c0 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 20   can be ignored 
219d0 28 62 79 20 6a 75 6d 70 69 6e 67 20 70 61 73 74  (by jumping past
219e0 20 74 68 65 20 47 6f 73 75 62 20 62 65 6c 6f 77   the Gosub below
219f0 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  ). Otherwise,.  
21a00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
21a10 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20 69 6e  nsert the key in
21a20 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
21a30 65 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69  e and proceed wi
21a40 74 68 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  th processing.  
21a50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
21a60 68 65 20 72 6f 77 2e 0a 20 20 20 20 20 20 20 20  he row..        
21a70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
21a80 20 20 20 20 20 20 20 2a 2a 20 55 73 65 20 73 6f         ** Use so
21a90 6d 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f  me of the same o
21aa0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61 73 20  ptimizations as 
21ab0 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 49  OP_RowSetTest: I
21ac0 66 20 69 53 65 74 0a 20 20 20 20 20 20 20 20 20  f iSet.         
21ad0 20 20 20 20 20 2a 2a 20 69 73 20 7a 65 72 6f 2c       ** is zero,
21ae0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
21af0 20 6b 65 79 20 63 61 6e 6e 6f 74 20 61 6c 72 65   key cannot alre
21b00 61 64 79 20 62 65 20 70 72 65 73 65 6e 74 20 69  ady be present i
21b10 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
21b20 2a 2a 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  ** the temp tabl
21b30 65 2e 20 41 6e 64 20 69 66 20 69 53 65 74 20 69  e. And if iSet i
21b40 73 20 2d 31 2c 20 61 73 73 75 6d 65 20 74 68 61  s -1, assume tha
21b50 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 0a 20  t there is no . 
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
21b70 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74  need to insert t
21b80 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20  he key into the 
21b90 74 65 6d 70 20 74 61 62 6c 65 2c 20 61 73 20 69  temp table, as i
21ba0 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 0a 20 20  t will never .  
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
21bc0 65 20 74 65 73 74 65 64 20 66 6f 72 2e 20 20 2a  e tested for.  *
21bd0 2f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  / .             
21be0 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20 20 20   if( iSet ){.   
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 31 20               j1 
21c00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
21c10 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
21c20 6e 64 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30  nd, regRowset, 0
21c30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20  , r, nPk);.     
21c40 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
21c50 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
21c60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21c70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53            if( iS
21c80 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et>=0 ){.       
21c90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21ca0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
21cb0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 2c 20  _MakeRecord, r, 
21cc0 6e 50 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  nPk, regRowid);.
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21cf0 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  3(v, OP_IdxInser
21d00 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 72 65  t, regRowset, re
21d10 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20  gRowid, 0);.    
21d20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21d30 69 53 65 74 20 29 20 73 71 6c 69 74 65 33 56 64  iSet ) sqlite3Vd
21d40 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
21d50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
21d60 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LT);.           
21d70 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
21d80 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
21d90 68 65 20 61 72 72 61 79 20 6f 66 20 74 65 6d 70  he array of temp
21da0 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
21db0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21dc0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
21dd0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 2c 20 6e  nge(pParse, r, n
21de0 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pk);.           
21df0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
21e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 76            /* Inv
21e10 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  oke the main loo
21e20 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62 72  p body as a subr
21e30 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
21e40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21e50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
21e60 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c  b, regReturn, iL
21e70 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20  oopBody);..     
21e80 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
21e90 65 20 28 73 6b 69 70 70 69 6e 67 20 74 68 65 20  e (skipping the 
21ea0 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 73  main loop body s
21eb0 75 62 72 6f 75 74 69 6e 65 29 20 69 66 20 74 68  ubroutine) if th
21ec0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
21ed0 75 72 72 65 6e 74 20 73 75 62 2d 57 48 45 52 45  urrent sub-WHERE
21ee0 20 72 6f 77 20 69 73 20 61 20 64 75 70 6c 69 63   row is a duplic
21ef0 61 74 65 20 66 72 6f 6d 20 70 72 69 6f 72 20 73  ate from prior s
21f00 75 62 2d 57 48 45 52 45 73 2e 20 2a 2f 0a 20 20  ub-WHEREs. */.  
21f10 20 20 20 20 20 20 20 20 69 66 28 20 6a 31 20 29          if( j1 )
21f20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
21f30 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
21f40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
21f50 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
21f60 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61  edTerms flag mea
21f70 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20  ns that this OR 
21f80 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a  term.          *
21f90 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20  * contained one 
21fa0 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d  or more AND term
21fb0 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79   from a notReady
21fc0 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20   table.  The.   
21fd0 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20         ** terms 
21fe0 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64  from the notRead
21ff0 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f  y table could no
22000 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20  t be tested and 
22010 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  will.          *
22020 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73  * need to be tes
22030 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20  ted later..     
22040 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22050 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d    if( pSubWInfo-
22060 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  >untestedTerms )
22070 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
22080 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   1;..          /
22090 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
220a0 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
220b0 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64  ms are optimized
220c0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a   using the same.
220d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
220e0 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ex, and the inde
220f0 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  x is opened usin
22100 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f  g the same curso
22110 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  r number.       
22120 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61     ** by each ca
22130 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
22140 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62  reBegin() made b
22150 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20  y this loop, it 
22160 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  may.          **
22170 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
22180 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 61  use that index a
22190 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
221a0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ex..          **
221b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
221c0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
221d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
221e0 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20   above resulted 
221f0 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20  in a scan that. 
22200 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73           ** uses
22210 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   an index, and t
22220 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74 68  his is either th
22230 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65  e first OR-conne
22240 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20  cted term.      
22250 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
22260 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69 73   or the index is
22270 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61   the same as tha
22280 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72  t used by all pr
22290 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
222a0 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70   ** terms, set p
222b0 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69  Cov to the candi
222c0 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
222d0 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  dex. Otherwise, 
222e0 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  set .          *
222f0 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74  * pCov to NULL t
22300 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
22310 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  no candidate cov
22320 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c  ering index will
22330 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
22340 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20  e available..   
22350 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22360 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70      pSubLoop = p
22370 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  SubWInfo->a[0].p
22380 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  WLoop;.         
22390 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f   assert( (pSubLo
223a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
223b0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d  ERE_AUTO_INDEX)=
223c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
223d0 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77  if( (pSubLoop->w
223e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
223f0 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
22400 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20        && (ii==0 
22410 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62  || pSubLoop->u.b
22420 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f  tree.pIndex==pCo
22430 76 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  v).           &&
22440 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
22450 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
22460 79 49 6e 64 65 78 28 70 53 75 62 4c 6f 6f 70 2d  yIndex(pSubLoop-
22470 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
22480 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
22490 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
224a0 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  t( pSubWInfo->a[
224b0 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76  0].iIdxCur==iCov
224c0 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Cur );.         
224d0 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f     pCov = pSubLo
224e0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
224f0 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ex;.            
22500 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
22510 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 3b 0a  ERE_REOPEN_IDX;.
22520 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
22530 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
22540 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
22550 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
22560 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70   Finish the loop
22570 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
22580 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
22590 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
225a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
225b0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75  ite3WhereEnd(pSu
225c0 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  bWInfo);.       
225d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
225e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  .    pLevel->u.p
225f0 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20  Covidx = pCov;. 
22600 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c     if( pCov ) pL
22610 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
22620 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28  iCovCur;.    if(
22630 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
22640 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
22650 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ft = 0;.      sq
22660 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
22670 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20  db, pAndExpr);. 
22680 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22690 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
226a0 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65  iRetInit, sqlite
226b0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
226c0 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (v));.    sqlite
226d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
226e0 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
226f0 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
22700 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
22710 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f  lveLabel(v, iLoo
22720 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28  pBody);..    if(
22730 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
22740 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b  1 ) sqlite3Stack
22750 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62 29  Free(db, pOrTab)
22760 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73  ;.    if( !untes
22770 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62  tedTerms ) disab
22780 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
22790 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Term);.  }else.#
227a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
227b0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
227c0 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20  TION */..  {.   
227d0 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65   /* Case 6:  The
227e0 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20  re is no usable 
227f0 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20  index.  We must 
22800 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20  do a complete.  
22810 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63    **          sc
22820 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  an of the entire
22830 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
22840 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
22850 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f  u8 aStep[] = { O
22860 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20  P_Next, OP_Prev 
22870 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
22880 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20  nst u8 aStart[] 
22890 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f  = { OP_Rewind, O
228a0 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73  P_Last };.    as
228b0 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c  sert( bRev==0 ||
228c0 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20   bRev==1 );.    
228d0 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 73  if( pTabItem->is
228e0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
228f0 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61 72     /* Tables mar
22900 6b 65 64 20 69 73 52 65 63 75 72 73 69 76 65 20  ked isRecursive 
22910 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67  have only a sing
22920 6c 65 20 72 6f 77 20 74 68 61 74 20 69 73 20 73  le row that is s
22930 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 20 20 2a  tored in.      *
22940 2a 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73 6f  * a pseudo-curso
22950 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 52  r.  No need to R
22960 65 77 69 6e 64 20 6f 72 20 4e 65 78 74 20 73 75  ewind or Next su
22970 63 68 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a 20  ch cursors. */. 
22980 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
22990 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
229a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
229b0 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
229c0 52 65 76 5d 3b 0a 20 20 20 20 20 20 70 4c 65 76  Rev];.      pLev
229d0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
229e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
229f0 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
22a00 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72  eAddOp2(v, aStar
22a10 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61  t[bRev], iCur, a
22a20 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56  ddrBrk);.      V
22a30 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
22a40 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20   bRev==0);.     
22a50 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
22a60 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20  v, bRev!=0);.   
22a70 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
22a80 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
22a90 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
22aa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
22ab0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
22ac0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
22ad0 0a 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 56  .  pLevel->addrV
22ae0 69 73 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  isit = sqlite3Vd
22af0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
22b00 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
22b10 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
22b20 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
22b30 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
22b40 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
22b50 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
22b60 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
22b70 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a  t of tables..  *
22b80 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
22b90 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65  C->a, j=pWC->nTe
22ba0 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
22bb0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
22bc0 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61   *pE;.    testca
22bd0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
22be0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
22bf0 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
22c00 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
22c10 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
22c20 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
22c30 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
22c40 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
22c50 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
22c60 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
22c70 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65  >prereqAll & pLe
22c80 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d  vel->notReady)!=
22c90 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
22ca0 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ase( pWInfo->unt
22cb0 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20  estedTerms==0.  
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
22cd0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
22ce0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
22cf0 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b  ABLE_ONLY)!=0 );
22d00 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75  .      pWInfo->u
22d10 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
22d20 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
22d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d  ;.    }.    pE =
22d40 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
22d50 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
22d60 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
22d70 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
22d80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
22d90 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
22da0 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  n) ){.      cont
22db0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
22dc0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
22dd0 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61  se(pParse, pE, a
22de0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
22df0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
22e00 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
22e10 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
22e20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20   }..  /* Insert 
22e30 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72  code to test for
22e40 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61   implied constra
22e50 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72  ints based on tr
22e60 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20  ansitivity.  ** 
22e70 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72  of the "==" oper
22e80 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
22e90 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20  Example: If the 
22ea0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
22eb0 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62  tains "t1.a=t2.b
22ec0 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22  " and "t2.b=123"
22ed0 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  .  ** and we are
22ee0 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c   coding the t1 l
22ef0 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c  oop and the t2 l
22f00 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20  oop has not yet 
22f10 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  coded,.  ** then
22f20 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74   we cannot use t
22f30 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63  he "t1.a=t2.b" c
22f40 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77  onstraint, but w
22f50 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20  e can code.  ** 
22f60 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e  the implied "t1.
22f70 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e  a=123" constrain
22f80 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54  t..  */.  for(pT
22f90 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
22fa0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
22fb0 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
22fc0 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 45 41    Expr *pE, *pEA
22fd0 6c 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  lt;.    WhereTer
22fe0 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69 66 28  m *pAlt;.    if(
22ff0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
23000 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
23010 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
23020 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
23030 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
23040 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45  !=(WO_EQUIV|WO_E
23050 51 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  Q) ) continue;. 
23060 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
23070 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
23080 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
23090 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
230a0 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Join ) continue;
230b0 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
230c0 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
230d0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
230e0 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
230f0 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  Join) );.    ass
23100 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65  ert( (pTerm->pre
23110 72 65 71 52 69 67 68 74 20 26 20 70 4c 65 76 65  reqRight & pLeve
23120 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
23130 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20 66 69  );.    pAlt = fi
23140 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
23150 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  , pTerm->u.leftC
23160 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c  olumn, notReady,
23170 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
23180 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d  ;.    if( pAlt==
23190 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
231a0 20 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c    if( pAlt->wtFl
231b0 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45  ags & (TERM_CODE
231c0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
231d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c     testcase( pAl
231e0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
231f0 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74  O_EQ );.    test
23200 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65  case( pAlt->eOpe
23210 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
23220 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  .    VdbeModuleC
23230 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
23240 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  n transitive con
23250 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20  straint"));.    
23260 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53  pEAlt = sqlite3S
23270 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
23280 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29   sizeof(*pEAlt))
23290 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74 20  ;.    if( pEAlt 
232a0 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20  ){.      *pEAlt 
232b0 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a  = *pAlt->pExpr;.
232c0 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65        pEAlt->pLe
232d0 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a  ft = pE->pLeft;.
232e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
232f0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
23300 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74   pEAlt, addrCont
23310 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
23320 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
23330 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c  te3StackFree(db,
23340 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20   pEAlt);.    }. 
23350 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c   }..  /* For a L
23360 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
23370 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
23380 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
23390 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a  he fact that.  *
233a0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
233b0 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
233c0 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
233d0 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
233e0 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
233f0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
23400 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
23410 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
23420 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
23430 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
23440 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23450 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
23460 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
23470 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
23480 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
23490 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
234a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
234b0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
234c0 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  e);.    for(pTer
234d0 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a  m=pWC->a, j=0; j
234e0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  <pWC->nTerm; j++
234f0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
23500 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
23510 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
23520 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
23530 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
23540 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
23550 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
23560 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
23570 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
23580 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
23590 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
235a0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
235b0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
235c0 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
235d0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
235e0 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
235f0 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
23600 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
23610 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
23620 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
23630 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
23640 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
23650 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
23660 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
23670 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
23680 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
23690 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
236a0 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  DED;.    }.  }..
236b0 20 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d    return pLevel-
236c0 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69  >notReady;.}..#i
236d0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
236e0 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72  ENABLED./*.** Pr
236f0 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  int the content 
23700 6f 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f  of a WhereTerm o
23710 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
23720 76 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72  void whereTermPr
23730 69 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  int(WhereTerm *p
23740 54 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29  Term, int iTerm)
23750 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30  {.  if( pTerm==0
23760 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
23770 65 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d  ebugPrintf("TERM
23780 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69  -%-3d NULL\n", i
23790 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Term);.  }else{.
237a0 20 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34      char zType[4
237b0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  ];.    memcpy(zT
237c0 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a  ype, "...", 4);.
237d0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
237e0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
237f0 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d  RTUAL ) zType[0]
23800 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20   = 'V';.    if( 
23810 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
23820 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a   & WO_EQUIV  ) z
23830 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20  Type[1] = 'E';. 
23840 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
23850 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
23860 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
23870 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27  ) ) zType[2] = '
23880 4c 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  L';.    sqlite3D
23890 65 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d  ebugPrintf("TERM
238a0 2d 25 2d 33 64 20 25 70 20 25 73 20 63 75 72 73  -%-3d %p %s curs
238b0 6f 72 3d 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33  or=%-3d prob=%-3
238c0 64 20 6f 70 3d 30 78 25 30 33 78 5c 6e 22 2c 0a  d op=0x%03x\n",.
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 20 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54         iTerm, pT
238f0 65 72 6d 2c 20 7a 54 79 70 65 2c 20 70 54 65 72  erm, zType, pTer
23900 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70  m->leftCursor, p
23910 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c  Term->truthProb,
23920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23930 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65          pTerm->e
23940 4f 70 65 72 61 74 6f 72 29 3b 0a 20 20 20 20 73  Operator);.    s
23950 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
23960 70 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78  pr(0, pTerm->pEx
23970 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pr, 0);.  }.}.#e
23980 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45  ndif..#ifdef WHE
23990 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
239a0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68  /*.** Print a Wh
239b0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66  ereLoop object f
239c0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72  or debugging pur
239d0 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
239e0 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72  void whereLoopPr
239f0 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  int(WhereLoop *p
23a00 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
23a10 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  WC){.  WhereInfo
23a20 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
23a30 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62  pWInfo;.  int nb
23a40 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54   = 1+(pWInfo->pT
23a50 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f  abList->nSrc+7)/
23a60 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  8;.  struct SrcL
23a70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
23a80 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
23a90 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b  st->a + p->iTab;
23aa0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
23ab0 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
23ac0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23ad0 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78  tf("%c%2d.%0*llx
23ae0 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64  .%0*llx", p->cId
23af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23b00 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20         p->iTab, 
23b10 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c  nb, p->maskSelf,
23b20 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b   nb, p->prereq);
23b30 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
23b40 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20  rintf(" %12s",. 
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b60 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
23b70 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s ? pItem->zAlia
23b80 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s : pTab->zName)
23b90 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
23ba0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
23bb0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
23bc0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23bd0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70  zName;.    if( p
23be0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
23bf0 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e   && (zName = p->
23c00 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
23c10 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
23c20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
23c30 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75  Name, "sqlite_au
23c40 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d  toindex_", 17)==
23c50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
23c60 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   i = sqlite3Strl
23c70 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b  en30(zName) - 1;
23c80 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
23c90 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20  zName[i]!='_' ) 
23ca0 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  i--;.        zNa
23cb0 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d  me += i;.      }
23cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
23cd0 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36  bugPrintf(".%-16
23ce0 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70  s %2d", zName, p
23cf0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a  ->u.btree.nEq);.
23d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23d10 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23d20 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a  ntf("%20s","");.
23d30 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
23d40 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
23d50 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  if( p->u.vtab.id
23d60 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20  xStr ){.      z 
23d70 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
23d80 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78  f("(%d,\"%s\",%x
23d90 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
23da0 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
23db0 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xNum, p->u.vtab.
23dc0 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61  idxStr, p->u.vta
23dd0 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20  b.omitMask);.   
23de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
23df0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
23e00 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e  f("(%d,%x)", p->
23e10 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
23e20 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
23e30 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  k);.    }.    sq
23e40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23e50 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20  (" %-19s", z);. 
23e60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23e70 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  z);.  }.  if( p-
23e80 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
23e90 5f 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20  _SKIPSCAN ){.   
23ea0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23eb0 6e 74 66 28 22 20 66 20 25 30 35 78 20 25 64 2d  ntf(" f %05x %d-
23ec0 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
23ed0 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53   p->nLTerm,p->nS
23ee0 6b 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  kip);.  }else{. 
23ef0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23f00 72 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e  rintf(" f %05x N
23f10 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73   %d", p->wsFlags
23f20 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20  , p->nLTerm);.  
23f30 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
23f40 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64  Printf(" cost %d
23f50 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53  ,%d,%d\n", p->rS
23f60 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70  etup, p->rRun, p
23f70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70  ->nOut);.  if( p
23f80 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c  ->nLTerm && (sql
23f90 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
23fa0 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20   0x100)!=0 ){.  
23fb0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
23fc0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72  (i=0; i<p->nLTer
23fd0 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77  m; i++){.      w
23fe0 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d  hereTermPrint(p-
23ff0 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a  >aLTerm[i], i);.
24000 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
24010 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
24020 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e  t bulk memory in
24030 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65  to a valid Where
24040 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65  Loop that can be
24050 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68   passed.** to wh
24060 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72  ereLoopClear har
24070 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74  mlessly..*/.stat
24080 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
24090 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20  pInit(WhereLoop 
240a0 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  *p){.  p->aLTerm
240b0 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63   = p->aLTermSpac
240c0 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d  e;.  p->nLTerm =
240d0 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20   0;.  p->nLSlot 
240e0 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  = ArraySize(p->a
240f0 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70  LTermSpace);.  p
24100 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d  ->wsFlags = 0;.}
24110 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
24120 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e  e WhereLoop.u un
24130 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72  ion.  Leave Wher
24140 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74  eLoop.pLTerm int
24150 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  act..*/.static v
24160 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  oid whereLoopCle
24170 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20  arUnion(sqlite3 
24180 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
24190 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46  p){.  if( p->wsF
241a0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49  lags & (WHERE_VI
241b0 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45  RTUALTABLE|WHERE
241c0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a  _AUTO_INDEX) ){.
241d0 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
241e0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
241f0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20  UALTABLE)!=0 && 
24200 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
24210 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ee ){.      sqli
24220 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74  te3_free(p->u.vt
24230 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
24240 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64    p->u.vtab.need
24250 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
24260 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
24270 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
24280 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
24290 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
242a0 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62  EX)!=0 && p->u.b
242b0 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
242c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
242d0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62  bFree(db, p->u.b
242e0 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f  tree.pIndex->zCo
242f0 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c  lAff);.      sql
24300 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
24310 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  (p->u.btree.pInd
24320 65 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ex->pKeyInfo);. 
24330 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
24340 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
24350 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
24360 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
24370 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
24380 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
24390 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
243a0 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
243b0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
243c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
243d0 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
243e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
243f0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
24400 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
24410 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
24420 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
24430 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65  ->aLTerm);.  whe
24440 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
24450 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65  (db, p);.  where
24460 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a  LoopInit(p);.}..
24470 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  /*.** Increase t
24480 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
24490 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e  tion for pLoop->
244a0 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61  aLTerm[] to be a
244b0 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74  t least n..*/.st
244c0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
244d0 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33  opResize(sqlite3
244e0 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
244f0 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68  *p, int n){.  Wh
24500 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b  ereTerm **paNew;
24510 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74  .  if( p->nLSlot
24520 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=n ) return SQL
24530 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e  ITE_OK;.  n = (n
24540 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20  +7)&~7;.  paNew 
24550 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
24560 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
24570 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29  p->aLTerm[0])*n)
24580 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30  ;.  if( paNew==0
24590 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
245a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
245b0 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
245c0 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
245d0 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
245e0 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
245f0 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
24600 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
24610 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
24620 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  m);.  p->aLTerm 
24630 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c  = paNew;.  p->nL
24640 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75  Slot = n;.  retu
24650 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
24660 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
24670 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
24680 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e   second pLoop in
24690 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f  to the first..*/
246a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
246b0 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65  eLoopXfer(sqlite
246c0 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
246d0 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70   *pTo, WhereLoop
246e0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72   *pFrom){.  wher
246f0 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
24700 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20  db, pTo);.  if( 
24710 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
24720 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
24730 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d  nLTerm) ){.    m
24740 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30  emset(&pTo->u, 0
24750 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29  , sizeof(pTo->u)
24760 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
24770 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
24780 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
24790 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
247a0 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
247b0 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
247c0 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
247d0 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
247e0 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
247f0 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
24800 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
24810 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
24820 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
24830 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
24840 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
24850 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
24860 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
24870 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
24880 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
24890 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
248a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
248b0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
248c0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
248d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
248e0 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
248f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
24900 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
24910 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
24920 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
24930 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
24940 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
24950 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
24960 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24970 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
24980 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
24990 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
249a0 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
249b0 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65  fo) ){.    where
249c0 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49  ClauseClear(&pWI
249d0 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77  nfo->sWC);.    w
249e0 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c  hile( pWInfo->pL
249f0 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68  oops ){.      Wh
24a00 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49  ereLoop *p = pWI
24a10 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20  nfo->pLoops;.   
24a20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70     pWInfo->pLoop
24a30 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  s = p->pNextLoop
24a40 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
24a50 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  pDelete(db, p);.
24a60 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24a70 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
24a80 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fo);.  }.}../*.*
24a90 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
24aa0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
24ab0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
24ac0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68  **.**   (1)  X h
24ad0 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
24ae0 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59  ower cost that Y
24af0 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73 20  .**   (2)  X is 
24b00 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
24b10 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58  of Y.**   (3)  X
24b20 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20   skips at least 
24b30 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  as many columns 
24b40 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70  as Y.**.** By "p
24b50 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77 65  roper subset" we
24b60 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73 65   mean that X use
24b70 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c  s fewer WHERE cl
24b80 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68  ause terms.** th
24b90 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76  an Y and that ev
24ba0 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
24bb0 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20   term used by X 
24bc0 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20  is also used.** 
24bd0 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58  by Y..**.** If X
24be0 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
24bf0 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20  set of Y then Y 
24c00 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69  is a better choi
24c10 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20  ce and ought.** 
24c20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20  to have a lower 
24c30 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74  cost.  This rout
24c40 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45  ine returns TRUE
24c50 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20   when that cost 
24c60 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  .** relationship
24c70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64   is inverted and
24c80 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a   needs to be adj
24c90 75 73 74 65 64 2e 20 20 54 68 65 20 74 68 69 72  usted.  The thir
24ca0 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64  d rule.** was ad
24cb0 64 65 64 20 62 65 63 61 75 73 65 20 69 66 20 58  ded because if X
24cc0 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20   uses skip-scan 
24cd0 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74 20 73  less than Y it s
24ce0 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65  till might.** de
24cf0 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f  serve a lower co
24d00 73 74 20 65 76 65 6e 20 69 66 20 69 74 20 69 73  st even if it is
24d10 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
24d20 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63   of Y..*/.static
24d30 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68   int whereLoopCh
24d40 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
24d50 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  t(.  const Where
24d60 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20  Loop *pX,       
24d70 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f  /* First WhereLo
24d80 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  op to compare */
24d90 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
24da0 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a  op *pY        /*
24db0 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   Compare against
24dc0 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20   this WhereLoop 
24dd0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
24de0 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65  ;.  if( pX->nLTe
24df0 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20  rm-pX->nSkip >= 
24e00 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e  pY->nLTerm-pY->n
24e10 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75  Skip ){.    retu
24e20 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f  rn 0; /* X is no
24e30 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
24e40 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d  */.  }.  if( pY-
24e50 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b  >nSkip > pX->nSk
24e60 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ip ) return 0;. 
24e70 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d   if( pX->rRun >=
24e80 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20   pY->rRun ){.   
24e90 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20   if( pX->rRun > 
24ea0 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72  pY->rRun ) retur
24eb0 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73  n 0;    /* X cos
24ec0 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a  ts more than Y *
24ed0 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f  /.    if( pX->nO
24ee0 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20  ut > pY->nOut ) 
24ef0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
24f00 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61  X costs more tha
24f10 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72  n Y */.  }.  for
24f20 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  (i=pX->nLTerm-1;
24f30 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
24f40 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b   if( pX->aLTerm[
24f50 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
24f60 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e  ;.    for(j=pY->
24f70 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
24f80 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j--){.      if( 
24f90 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70  pY->aLTerm[j]==p
24fa0 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62  X->aLTerm[i] ) b
24fb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24fc0 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e  if( j<0 ) return
24fd0 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20   0;  /* X not a 
24fe0 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63  subset of Y sinc
24ff0 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20  e term X[i] not 
25000 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d  used by Y */.  }
25010 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a  .  return 1;  /*
25020 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20   All conditions 
25030 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  meet */.}../*.**
25040 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74   Try to adjust t
25050 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65  he cost of Where
25060 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75  Loop pTemplate u
25070 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61  pwards or downwa
25080 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a  rds so.** that:.
25090 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d  **.**   (1) pTem
250a0 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73  plate costs less
250b0 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20   than any other 
250c0 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20  WhereLoops that 
250d0 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20  are a proper.** 
250e0 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66 20        subset of 
250f0 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20  pTemplate.**.** 
25100 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20    (2) pTemplate 
25110 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
25120 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
25130 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20 70  oops for which p
25140 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20  Template.**     
25150 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75    is a proper su
25160 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73  bset..**.** To s
25170 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20  ay "WhereLoop X 
25180 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
25190 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74  et of Y" means t
251a0 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72  hat X uses fewer
251b0 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
251c0 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e   terms than Y an
251d0 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45  d that every WHE
251e0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75  RE clause term u
251f0 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61  sed by X is.** a
25200 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a  lso used by Y..*
25210 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
25220 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73  ereLoopAdjustCos
25230 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f  t(const WhereLoo
25240 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  p *p, WhereLoop 
25250 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69  *pTemplate){.  i
25260 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  f( (pTemplate->w
25270 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
25280 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74  NDEXED)==0 ) ret
25290 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20  urn;.  for(; p; 
252a0 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  p=p->pNextLoop){
252b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
252c0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
252d0 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  b ) continue;.  
252e0 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
252f0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
25300 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  D)==0 ) continue
25310 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c  ;.    if( whereL
25320 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
25330 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c  Subset(p, pTempl
25340 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ate) ){.      /*
25350 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74   Adjust pTemplat
25360 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20  e cost downward 
25370 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 68  so that it is ch
25380 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a  eaper than its .
25390 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20        ** subset 
253a0 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52  p. */.      WHER
253b0 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75  ETRACE(0x80,("su
253c0 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74  bset cost adjust
253d0 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64  ment %d,%d to %d
253e0 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ,%d\n",.        
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25400 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20  Template->rRun, 
25410 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c  pTemplate->nOut,
25420 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
25430 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65  t-1));.      pTe
25440 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70  mplate->rRun = p
25450 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54  ->rRun;.      pT
25460 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20  emplate->nOut = 
25470 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20  p->nOut - 1;.   
25480 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65   }else if( where
25490 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
254a0 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74  rSubset(pTemplat
254b0 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f  e, p) ){.      /
254c0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
254d0 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73  te cost upward s
254e0 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73  o that it is cos
254f0 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e  tlier than p sin
25500 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d  ce.      ** pTem
25510 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65  plate is a prope
25520 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f  r subset of p */
25530 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
25540 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20  E(0x80,("subset 
25550 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20  cost adjustment 
25560 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e  %d,%d to %d,%d\n
25570 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
25580 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c            pTempl
25590 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70  ate->rRun, pTemp
255a0 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72  late->nOut, p->r
255b0 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29  Run, p->nOut+1))
255c0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
255d0 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75  e->rRun = p->rRu
255e0 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  n;.      pTempla
255f0 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f  te->nOut = p->nO
25600 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ut + 1;.    }.  
25610 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  }.}../*.** Searc
25620 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  h the list of Wh
25630 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50  ereLoops in *ppP
25640 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  rev looking for 
25650 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a  one that can be.
25660 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79  ** supplanted by
25670 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a   pTemplate..**.*
25680 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
25690 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c   the WhereLoop l
256a0 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ist contains an 
256b0 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73  entry that can s
256c0 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70  upplant.** pTemp
256d0 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  late, in other w
256e0 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74  ords if pTemplat
256f0 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e  e does not belon
25700 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  g on the list..*
25710 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20  *.** If pX is a 
25720 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70  WhereLoop that p
25730 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70  Template can sup
25740 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75  plant, then retu
25750 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74  rn the.** link t
25760 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58  hat points to pX
25770 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70  ..**.** If pTemp
25780 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70  late cannot supp
25790 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e  lant any existin
257a0 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  g element of the
257b0 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a   list but needs.
257c0 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ** to be added t
257d0 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e  o the list, then
257e0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
257f0 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66  r to the tail of
25800 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
25810 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a  atic WhereLoop *
25820 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65  *whereLoopFindLe
25830 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  sser(.  WhereLoo
25840 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f  p **ppPrev,.  co
25850 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
25860 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68  Template.){.  Wh
25870 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f  ereLoop *p;.  fo
25880 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70  r(p=(*ppPrev); p
25890 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65  ; ppPrev=&p->pNe
258a0 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65  xtLoop, p=*ppPre
258b0 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  v){.    if( p->i
258c0 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Tab!=pTemplate->
258d0 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74  iTab || p->iSort
258e0 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Idx!=pTemplate->
258f0 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20  iSortIdx ){.    
25900 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74    /* If either t
25910 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74  he iTab or iSort
25920 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74  Idx values for t
25930 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65  wo WhereLoop are
25940 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20   different.     
25950 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57   ** then those W
25960 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74  hereLoops need t
25970 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  o be considered 
25980 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69  separately.  Nei
25990 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ther is.      **
259a0 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
259b0 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65  replace the othe
259c0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  r. */.      cont
259d0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
259e0 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  /* In the curren
259f0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
25a00 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c  , the rSetup val
25a10 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ue is either zer
25a20 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20  o.    ** or the 
25a30 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67  cost of building
25a40 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
25a50 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20  dex (NlogN) and 
25a60 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a  the NlogN.    **
25a70 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72   is the same for
25a80 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72   compatible Wher
25a90 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61  eLoops. */.    a
25aa0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
25ab0 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65  ==0 || pTemplate
25ac0 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20  ->rSetup==0 .   
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
25ae0 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d   p->rSetup==pTem
25af0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
25b00 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f  ..    /* whereLo
25b10 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77  opAddBtree() alw
25b20 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e  ays generates an
25b30 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75  d inserts the au
25b40 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20  tomatic index.  
25b50 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e    ** case first.
25b60 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62    Hence compatib
25b70 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65  le candidate Whe
25b80 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61  reLoops never ha
25b90 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20  ve a larger.    
25ba0 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20  ** rSetup. Call 
25bb0 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52  this SETUP-INVAR
25bc0 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65  IANT */.    asse
25bd0 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
25be0 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
25bf0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20   );..    /* Any 
25c00 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70  loop using an ap
25c10 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  pliation-defined
25c20 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41   index (or PRIMA
25c30 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a  RY KEY or.    **
25c40 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
25c50 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20  nt) with one or 
25c60 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  more == constrai
25c70 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20 20  nts is better.  
25c80 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74    ** than an aut
25c90 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f  omatic index. */
25ca0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
25cb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
25cc0 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20  O_INDEX)!=0.    
25cd0 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
25ce0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25cf0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
25d00 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
25d10 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25d20 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20  COLUMN_EQ)!=0.  
25d30 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71     && (p->prereq
25d40 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
25d50 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
25d60 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a  ->prereq.    ){.
25d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25d80 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78   }..    /* If ex
25d90 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
25da0 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61   p is better tha
25db0 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65  n pTemplate, pTe
25dc0 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20  mplate can be.  
25dd0 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20    ** discarded. 
25de0 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20   WhereLoop p is 
25df0 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a  better if:.    *
25e00 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e  *   (1)  p has n
25e10 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
25e20 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ies than pTempla
25e30 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  te, and.    **  
25e40 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65   (2)  p has an e
25e50 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f  qual or lower co
25e60 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  st than pTemplat
25e70 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
25e80 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
25e90 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
25ea0 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f  ==p->prereq    /
25eb0 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26  * (1)  */.     &
25ec0 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65  & p->rSetup<=pTe
25ed0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20  mplate->rSetup  
25ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ef0 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
25f00 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d  && p->rRun<=pTem
25f10 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20  plate->rRun     
25f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f30 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
25f40 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65   && p->nOut<=pTe
25f50 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20    /* (2c) */.   
25f80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
25f90 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20   0;  /* Discard 
25fa0 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
25fb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54   }..    /* If pT
25fc0 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79  emplate is alway
25fd0 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c  s better than p,
25fe0 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f   then cause p to
25ff0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
26000 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d      ** with pTem
26010 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74  plate.  pTemplat
26020 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  e is better than
26030 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20   p if:.    **   
26040 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (1)  pTemplate h
26050 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
26060 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61  dences than p, a
26070 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20  nd.    **   (2) 
26080 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61   pTemplate has a
26090 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72  n equal or lower
260a0 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20   cost than p..  
260b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
260c0 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
260d0 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
260e0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20  emplate->prereq 
260f0 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20    /* (1)  */.   
26100 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54    && p->rRun>=pT
26110 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61            /* (2a
26140 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
26150 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut>=pTemplate-
26160 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26180 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
26190 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
261a0 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
261b0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
261c0 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52  ; /* SETUP-INVAR
261d0 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20  IANT above */.  
261e0 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20      break;   /* 
261f0 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76  Cause p to be ov
26200 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65  erwritten by pTe
26210 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a  mplate */.    }.
26220 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50    }.  return ppP
26230 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rev;.}../*.** In
26240 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20  sert or replace 
26250 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  a WhereLoop entr
26260 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70  y using the temp
26270 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a  late supplied..*
26280 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
26290 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
262a0 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72   might be overwr
262b0 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77  itten if the new
262c0 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20   template.** is 
262d0 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66  better and has f
262e0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
262f0 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c  s.  Or the templ
26300 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ate will be igno
26310 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e  red.** and no in
26320 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20  sert will occur 
26330 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  if an existing W
26340 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74  hereLoop is fast
26350 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65  er and has.** fe
26360 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
26370 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61   than the templa
26380 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  te.  Otherwise a
26390 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69   new WhereLoop i
263a0 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64  s.** added based
263b0 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65   on the template
263c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c  ..**.** If pBuil
263d0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e  der->pOrSet is n
263e0 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
263f0 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20  care about only 
26400 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73  the.** prerequis
26410 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e  ites and rRun an
26420 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20  d nOut costs of 
26430 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73  the N best loops
26440 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72  .  That.** infor
26450 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72  mation is gather
26460 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64  ed in the pBuild
26470 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63  er->pOrSet objec
26480 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c  t.  This special
26490 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d  .** processing m
264a0 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ode is used only
264b0 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
264c0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
264d0 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   When accumulati
264e0 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70  ng multiple loop
264f0 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72  s (when pBuilder
26500 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c  ->pOrSet is NULL
26510 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
26520 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
26530 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
26540 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
26550 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
26560 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
26570 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
26580 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
26590 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
265a0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
265b0 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
265c0 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
265d0 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
265e0 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
265f0 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
26600 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
26610 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
26620 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
26630 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
26640 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
26650 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
26660 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
26670 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
26680 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
26690 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73  urrent loop.*/.s
266a0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
266b0 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c  oopInsert(WhereL
266c0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
266d0 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20  lder, WhereLoop 
266e0 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57  *pTemplate){.  W
266f0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
26700 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e  v, *p;.  WhereIn
26710 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
26720 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
26730 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
26740 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
26750 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  b;..  /* If pBui
26760 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
26770 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
26780 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
26790 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
267a0 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
267b0 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
267c0 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23  ->pOrSet!=0 ){.#
267d0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
267e0 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20  ABLED.    u16 n 
267f0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  = pBuilder->pOrS
26800 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78  et->n;.    int x
26810 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68   =.#endif.    wh
26820 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69  ereOrInsert(pBui
26830 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54  lder->pOrSet, pT
26840 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c  emplate->prereq,
26850 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
26860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26880 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
26890 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52  >nOut);.#if WHER
268a0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
268b0 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28  * 0x8 */.    if(
268c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
268d0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
268e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
268f0 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64  intf(x?"   or-%d
26900 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20  :  ":"   or-X:  
26910 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65  ", n);.      whe
26920 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
26930 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
26940 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  >pWC);.    }.#en
26950 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
26960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
26970 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20   /* Look for an 
26980 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
26990 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69  op to replace wi
269a0 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a  th pTemplate.  *
269b0 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a  /.  whereLoopAdj
269c0 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e  ustCost(pWInfo->
269d0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
269e0 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77  e);.  ppPrev = w
269f0 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
26a00 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  er(&pWInfo->pLoo
26a10 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  ps, pTemplate);.
26a20 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30  .  if( ppPrev==0
26a30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
26a40 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
26a50 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74  a WhereLoop on t
26a60 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
26a70 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
26a80 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f  an pTemplate, so
26a90 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65   just ignore pTe
26aa0 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48  mplate */.#if WH
26ab0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
26ac0 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69   /* 0x8 */.    i
26ad0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
26ae0 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
26af0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26b00 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a  Printf("   skip:
26b10 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
26b20 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
26b30 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
26b40 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
26b50 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
26b60 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73  ITE_OK;  .  }els
26b70 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72  e{.    p = *ppPr
26b80 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ev;.  }..  /* If
26b90 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
26ba0 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
26bb0 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
26bc0 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
26bd0 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
26be0 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
26bf0 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
26c00 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
26c10 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
26c20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
26c30 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
26c40 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26c50 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
26c60 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
26c70 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
26c80 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
26c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26ca0 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63  ugPrintf("replac
26cb0 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  e: ");.      whe
26cc0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70  reLoopPrint(p, p
26cd0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
26ce0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26cf0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
26d00 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77 68   add: ");.    wh
26d10 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
26d20 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
26d30 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->pWC);.  }.#end
26d40 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  if.  if( p==0 ){
26d50 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
26d60 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
26d70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65   to add to the e
26d80 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a  nd of the list *
26d90 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20  /.    *ppPrev = 
26da0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
26db0 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
26dc0 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
26dd0 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
26de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
26df0 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  M;.    whereLoop
26e00 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e  Init(p);.    p->
26e10 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20  pNextLoop = 0;. 
26e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57   }else{.    /* W
26e30 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  e will be overwr
26e40 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  iting WhereLoop 
26e50 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65  p[].  But before
26e60 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20   we do, first.  
26e70 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20    ** go through 
26e80 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
26e90 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20  list and delete 
26ea0 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65  any other entrie
26eb0 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a  s besides.    **
26ec0 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c   p[] that are al
26ed0 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79 20  so supplated by 
26ee0 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
26ef0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54   WhereLoop **ppT
26f00 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c  ail = &p->pNextL
26f10 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  oop;.    WhereLo
26f20 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20  op *pToDel;.    
26f30 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29  while( *ppTail )
26f40 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d  {.      ppTail =
26f50 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65   whereLoopFindLe
26f60 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65  sser(ppTail, pTe
26f70 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69  mplate);.      i
26f80 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20 62  f( ppTail==0 ) b
26f90 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44  reak;.      pToD
26fa0 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20  el = *ppTail;.  
26fb0 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d      if( pToDel==
26fc0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
26fd0 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65   *ppTail = pToDe
26fe0 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69  l->pNextLoop;.#i
26ff0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
27000 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
27010 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
27020 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
27030 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27040 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27050 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20 20   delete: ");.   
27060 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
27070 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69  int(pToDel, pBui
27080 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
27090 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
270a0 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
270b0 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20  (db, pToDel);.  
270c0 20 20 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c    }.  }.  whereL
270d0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
270e0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
270f0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
27100 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
27110 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
27120 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
27130 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
27140 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
27150 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
27160 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
27170 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
27180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
27190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
271a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
271b0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
271c0 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
271d0 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
271e0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
271f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
27200 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
27210 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
27220 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
27230 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a  an.** index..**.
27240 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  ** In the curren
27250 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
27260 2c 20 74 68 65 20 66 69 72 73 74 20 65 78 74 72  , the first extr
27270 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
27280 65 72 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74  erm reduces.** t
27290 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
272a0 70 75 74 20 72 6f 77 73 20 62 79 20 61 20 66 61  put rows by a fa
272b0 63 74 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65  ctor of 10 and e
272c0 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74  ach additional t
272d0 65 72 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74  erm.** reduces t
272e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
272f0 70 75 74 20 72 6f 77 73 20 62 79 20 73 71 72 74  put rows by sqrt
27300 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  (2)..*/.static v
27310 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
27320 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65  putAdjust(.  Whe
27330 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
27340 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
27350 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
27360 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
27370 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
27380 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61  to adjust downwa
27390 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rd */.  LogEst n
273a0 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 2f  Row            /
273b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
273c0 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74   in the entire t
273d0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
273e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
273f0 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f  pX;.  Bitmask no
27400 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f  tAllowed = ~(pLo
27410 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70  op->prereq|pLoop
27420 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69  ->maskSelf);.  i
27430 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
27440 45 71 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  Eq = 0;    /* Nu
27450 6d 62 65 72 20 6f 66 20 3d 20 63 6f 6e 73 74 72  mber of = constr
27460 61 69 6e 74 73 20 6e 6f 74 20 77 69 74 68 69 6e  aints not within
27470 20 6c 69 6b 65 6c 79 28 29 2f 75 6e 6c 69 6b 65   likely()/unlike
27480 6c 79 28 29 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ly() */..  for(i
27490 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65  =pWC->nTerm, pTe
274a0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20  rm=pWC->a; i>0; 
274b0 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i--, pTerm++){. 
274c0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77     if( (pTerm->w
274d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
274e0 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61  RTUAL)!=0 ) brea
274f0 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  k;.    if( (pTer
27500 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
27510 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d  Loop->maskSelf)=
27520 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
27530 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
27540 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c  rereqAll & notAl
27550 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74  lowed)!=0 ) cont
27560 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
27570 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  pLoop->nLTerm-1;
27580 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
27590 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61     pX = pLoop->a
275a0 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20  LTerm[j];.      
275b0 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74  if( pX==0 ) cont
275c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
275d0 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61  pX==pTerm ) brea
275e0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  k;.      if( pX-
275f0 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28  >iParent>=0 && (
27600 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72  &pWC->a[pX->iPar
27610 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62  ent])==pTerm ) b
27620 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27630 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20  if( j<0 ){.     
27640 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
27650 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20  hProb<=0 ){.    
27660 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
27670 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
27680 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rob;.      }else
27690 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
276a0 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20  >nOut--;.       
276b0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
276c0 72 61 74 6f 72 26 57 4f 5f 45 51 20 29 20 6e 45  rator&WO_EQ ) nE
276d0 71 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  q++;.      }.   
276e0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 54 55 4e 49   }.  }.  /* TUNI
276f0 4e 47 3a 20 20 49 66 20 74 68 65 72 65 20 69 73  NG:  If there is
27700 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 71   at least one eq
27710 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
27720 74 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  t in the WHERE. 
27730 20 2a 2a 20 63 6c 61 75 73 65 20 74 68 61 74 20   ** clause that 
27740 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
27750 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 65 78 70  likelihood() exp
27760 6c 69 63 69 74 6c 79 20 61 73 73 69 67 6e 65 64  licitly assigned
27770 20 74 6f 20 69 74 0a 20 20 2a 2a 20 74 68 65 6e   to it.  ** then
27780 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   do not let the 
27790 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
277a0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
277b0 65 78 63 65 65 64 20 68 61 6c 66 20 0a 20 20 2a  exceed half .  *
277c0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
277d0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
277e0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 20  e. */.  if( nEq 
277f0 26 26 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e  && pLoop->nOut>n
27800 52 6f 77 2d 31 30 20 29 7b 0a 20 20 20 20 70 4c  Row-10 ){.    pL
27810 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77  oop->nOut = nRow
27820 20 2d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   - 10;.  }.}../*
27830 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63  .** Adjust the c
27840 6f 73 74 20 43 20 62 79 20 74 68 65 20 63 6f 73  ost C by the cos
27850 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20  tMult facter T. 
27860 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72   This only occur
27870 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64  s if.** compiled
27880 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45   with -DSQLITE_E
27890 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a  NABLE_COSTMULT.*
278a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
278b0 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a  ENABLE_COSTMULT.
278c0 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f  # define ApplyCo
278d0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54  stMultiplier(C,T
278e0 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a  )  C += T.#else.
278f0 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f  # define ApplyCo
27900 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54  stMultiplier(C,T
27910 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
27920 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d  We have so far m
27930 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d  atched pBuilder-
27940 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
27950 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  Eq terms of the 
27960 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78  .** index pIndex
27970 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f  . Try to match o
27980 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57  ne more..**.** W
27990 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
279a0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75  n is called, pBu
279b0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75  ilder->pNew->nOu
279c0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a  t contains the .
279d0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
279e0 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65  s expected to be
279f0 20 76 69 73 69 74 65 64 20 62 79 20 66 69 6c 74   visited by filt
27a00 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  ering using the 
27a10 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e  nEq .** terms on
27a20 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64  ly. If it is mod
27a30 69 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75  ified, this valu
27a40 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 62 65  e is restored be
27a50 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  fore this .** fu
27a60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
27a70 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d  **.** If pProbe-
27a80 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d  >tnum==0, that m
27a90 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61  eans pIndex is a
27aa0 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64   fake index used
27ab0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45   for the.** INTE
27ac0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
27ad0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
27ae0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
27af0 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f  Index(.  WhereLo
27b00 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
27b10 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  der,     /* The 
27b20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72  WhereLoop factor
27b30 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  y */.  struct Sr
27b40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
27b50 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
27b60 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
27b70 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
27b80 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20  ndex *pProbe,   
27b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27ba0 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53  * An index on pS
27bb0 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rc */.  LogEst n
27bc0 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20  InMul           
27bd0 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e          /* log(N
27be0 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
27bf0 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a  ons due to IN) *
27c00 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
27c10 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
27c20 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a  der->pWInfo;  /*
27c30 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63   WHERE analyse c
27c40 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
27c50 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
27c60 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
27c70 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
27c80 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
27c90 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
27ca0 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
27cb0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
27cc0 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74  n malloc context
27cd0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
27ce0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
27cf0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
27d00 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65  e WhereLoop unde
27d10 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
27d20 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
27d30 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
27d40 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65      /* A WhereTe
27d50 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65  rm under conside
27d60 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
27d70 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
27d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
27d90 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66  alid operators f
27da0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  or constraints *
27db0 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  /.  WhereScan sc
27dc0 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
27dd0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
27de0 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20  for WHERE terms 
27df0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76  */.  Bitmask sav
27e00 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20  ed_prereq;      
27e10 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
27e20 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
27e30 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20  prereq */.  u16 
27e40 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20  saved_nLTerm;   
27e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27e60 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
27e70 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f   pNew->nLTerm */
27e80 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71  .  u16 saved_nEq
27e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ea0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
27eb0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e  alue of pNew->u.
27ec0 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75  btree.nEq */.  u
27ed0 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20  16 saved_nSkip; 
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27ef0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27f00 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20   of pNew->nSkip 
27f10 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
27f20 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
27f30 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
27f40 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
27f50 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67  wsFlags */.  Log
27f60 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  Est saved_nOut; 
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27f80 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
27f90 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
27fa0 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fc0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
27fd0 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
27fe0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
27ff0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
28000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
28010 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c  turn code */.  L
28020 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
28030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28040 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
28050 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
28060 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
28070 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
28080 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
28090 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
280a0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
280b0 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
280c0 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
280d0 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
280e0 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
280f0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
28100 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
28110 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
28120 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
28130 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  ;..  assert( (pN
28140 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
28150 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
28160 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
28170 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
28180 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
28190 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  IT)==0 );.  if( 
281a0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
281b0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
281c0 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
281d0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
281e0 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d  else if( pProbe-
281f0 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72  >tnum<=0 || (pSr
28200 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
28210 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
28220 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
28230 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
28240 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
28250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
28260 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
28270 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54  |WO_ISNULL|WO_GT
28280 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
28290 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  LE;.  }.  if( pP
282a0 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
282b0 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57   ) opMask &= ~(W
282c0 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
282d0 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65  |WO_LE);..  asse
282e0 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  rt( pNew->u.btre
282f0 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  e.nEq<pProbe->nC
28300 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 43 6f 6c 20  olumn );.  iCol 
28310 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
28320 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  mn[pNew->u.btree
28330 2e 6e 45 71 5d 3b 0a 0a 20 20 70 54 65 72 6d 20  .nEq];..  pTerm 
28340 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
28350 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
28360 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
28370 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20  sor, iCol,.     
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
283a0 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20  e);.  saved_nEq 
283b0 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
283c0 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b  nEq;.  saved_nSk
283d0 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  ip = pNew->nSkip
283e0 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  ;.  saved_nLTerm
283f0 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b   = pNew->nLTerm;
28400 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73  .  saved_wsFlags
28410 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73   = pNew->wsFlags
28420 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65 71  ;.  saved_prereq
28430 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b   = pNew->prereq;
28440 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20  .  saved_nOut = 
28450 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e  pNew->nOut;.  pN
28460 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
28470 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65    rSize = pProbe
28480 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
28490 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65  ;.  rLogSize = e
284a0 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20  stLog(rSize);.  
284b0 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
284c0 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b  _OK && pTerm!=0;
284d0 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
284e0 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a  anNext(&scan)){.
284f0 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54      u16 eOp = pT
28500 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20  erm->eOperator; 
28510 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66    /* Shorthand f
28520 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  or pTerm->eOpera
28530 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73  tor */.    LogEs
28540 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20  t rCostIdx;.    
28550 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a  LogEst nOutUnadj
28560 75 73 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  usted;        /*
28570 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28   nOut before IN(
28580 29 20 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75  ) and WHERE adju
28590 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69  stments */.    i
285a0 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64  nt nIn = 0;.#ifd
285b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
285c0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
285d0 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69      int nRecVali
285e0 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
285f0 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
28600 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f      if( (eOp==WO
28610 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72  _ISNULL || (pTer
28620 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f  m->wtFlags&TERM_
28630 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20  VNULL)!=0).     
28640 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53  && (iCol<0 || pS
28650 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  rc->pTab->aCol[i
28660 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20  Col].notNull).  
28670 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
28680 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49  nue; /* ignore I
28690 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e  S [NOT] NULL con
286a0 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20  straints on NOT 
286b0 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
286c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
286d0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
286e0 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
286f0 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  f ) continue;.. 
28700 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
28710 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
28720 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
28730 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
28740 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
28750 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
28760 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68  Term;.    if( wh
28770 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
28780 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
28790 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
287a0 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70   /* OOM */.    p
287b0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
287c0 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54  ->nLTerm++] = pT
287d0 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  erm;.    pNew->p
287e0 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70  rereq = (saved_p
287f0 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70  rereq | pTerm->p
28800 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70  rereqRight) & ~p
28810 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a  New->maskSelf;..
28820 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d      assert( nInM
28830 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c  ul==0.        ||
28840 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
28850 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  & WHERE_COLUMN_N
28860 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20  ULL)!=0 .       
28870 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
28880 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
28890 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20  N_IN)!=0 .      
288a0 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
288b0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
288c0 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b  SCAN)!=0 .    );
288d0 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20  ..    if( eOp & 
288e0 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  WO_IN ){.      E
288f0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
28900 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
28910 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
28920 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
28930 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  N;.      if( Exp
28940 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
28950 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
28960 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
28970 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
28980 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68  .)":  TUNING: th
28990 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73  e SELECT returns
289a0 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   25 rows */.    
289b0 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61      nIn = 46;  a
289c0 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74  ssert( 46==sqlit
289d0 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a  e3LogEst(25) );.
289e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
289f0 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
28a00 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e  pList && pExpr->
28a10 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  x.pList->nExpr) 
28a20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
28a30 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
28a40 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
28a50 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65      nIn = sqlite
28a60 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78  3LogEst(pExpr->x
28a70 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  .pList->nExpr);.
28a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
28a90 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20  sert( nIn>0 );  
28aa0 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68 61  /* RHS always ha
28ab0 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  s 2 or more term
28ac0 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72  s...  The parser
28ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28ae0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e           ** chan
28af0 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69  ges "x IN (?)" i
28b00 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20  nto "x=?". */.. 
28b10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
28b20 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20   & (WO_EQ) ){.  
28b30 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
28b40 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
28b50 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20  N_EQ;.      if( 
28b60 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75  iCol<0 || (nInMu
28b70 6c 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e  l==0 && pNew->u.
28b80 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62  btree.nEq==pProb
28b90 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b  e->nKeyCol-1) ){
28ba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
28bb0 6c 3e 3d 30 20 26 26 20 21 49 73 55 6e 69 71 75  l>=0 && !IsUniqu
28bc0 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29 20 29  eIndex(pProbe) )
28bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
28be0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
28bf0 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20  RE_UNQ_WANTED;. 
28c00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28c10 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
28c20 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
28c30 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d  NEROW;.        }
28c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28c50 73 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f  se if( eOp & WO_
28c60 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
28c70 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
28c80 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
28c90 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LL;.    }else if
28ca0 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57  ( eOp & (WO_GT|W
28cb0 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74  O_GE) ){.      t
28cc0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
28cd0 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  O_GT );.      te
28ce0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
28cf0 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _GE );.      pNe
28d00 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
28d10 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
28d20 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  |WHERE_BTM_LIMIT
28d30 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70  ;.      pBtm = p
28d40 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70  Term;.      pTop
28d50 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
28d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
28d70 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  Op & (WO_LT|WO_L
28d80 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  E) );.      test
28d90 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c  case( eOp & WO_L
28da0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
28db0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45  ase( eOp & WO_LE
28dc0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
28dd0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
28de0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
28df0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
28e00 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
28e10 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
28e20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
28e30 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
28e40 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
28e50 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
28e60 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
28e70 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
28e80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
28e90 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e  his point pNew->
28ea0 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
28eb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
28ec0 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20  s expected to.  
28ed0 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20    ** be visited 
28ee0 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  by the index sca
28ef0 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65  n before conside
28f00 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c  ring term pTerm,
28f10 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   or the.    ** v
28f20 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64  alues of nIn and
28f30 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65   nInMul. In othe
28f40 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e  r words, assumin
28f50 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20  g that all .    
28f60 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74  ** "x IN(...)" t
28f70 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65  erms are replace
28f80 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20  d with "x = ?". 
28f90 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74  This block updat
28fa0 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  es.    ** the va
28fb0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
28fc0 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  t to account for
28fd0 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20   pTerm (but not 
28fe0 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f  nIn/nInMul).  */
28ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
29000 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
29010 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Out );.    if( p
29020 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
29030 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
29040 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  E ){.      /* Ad
29050 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20  just nOut using 
29060 73 74 61 74 33 2f 73 74 61 74 34 20 64 61 74 61  stat3/stat4 data
29070 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69  . Or, if there i
29080 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34  s no stat3/stat4
29090 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20  .      ** data, 
290a0 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72  using some other
290b0 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20   estimate.  */. 
290c0 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
290d0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
290e0 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70  Builder, pBtm, p
290f0 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  Top, pNew);.    
29100 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
29110 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75   nEq = ++pNew->u
29120 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20  .btree.nEq;.    
29130 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
29140 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
29150 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20 20  |WO_IN) );..    
29160 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
29170 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
29180 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
29190 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
291a0 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a  0 && iCol>=0 ){.
291b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
291c0 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c  (eOp & WO_IN) ||
291d0 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   nIn==0 );.     
291e0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
291f0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
29200 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
29210 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
29220 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ob;.        pNew
29230 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
29240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
29250 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
29260 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
29270 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
29280 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  nOut = 0;.      
29290 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20    if( nInMul==0 
292a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
292b0 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  obe->nSample .  
292c0 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e         && pNew->
292d0 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72  u.btree.nEq<=pPr
292e0 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a  obe->nSampleCol.
292f0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65 4f           && ((eO
29300 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c  p & WO_IN)==0 ||
29310 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29320 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
29330 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20  EP_xIsSelect)). 
29340 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
29350 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
29360 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
29370 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65            if( (e
29380 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  Op & (WO_EQ|WO_I
29390 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20  SNULL))!=0 ){.  
293a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
293b0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20  se( eOp & WO_EQ 
293c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
293d0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
293e0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
293f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
29400 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
29410 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
29420 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
29430 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &nOut);.        
29440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29450 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49       rc = whereI
29460 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  nScanEst(pParse,
29470 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
29480 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74  ->x.pList, &nOut
29490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
294a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
294b0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
294c0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
294d0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
294e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
294f0 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20   break;         
29500 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20   /* Jump out of 
29510 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a  the pTerm loop *
29520 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
29530 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
29540 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
29550 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e   sqlite3LogEst(n
29560 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
29570 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74    if( pNew->nOut
29580 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e  >saved_nOut ) pN
29590 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
295a0 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  _nOut;.         
295b0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
295c0 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   nIn;.          
295d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
295e0 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20      if( nOut==0 
295f0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ).#endif.       
29600 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65   {.          pNe
29610 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f  w->nOut += (pPro
29620 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
29630 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
29640 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31  iRowLogEst[nEq-1
29650 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
29660 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
29670 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
29680 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74   /* TUNING: If t
29690 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c  here is no likel
296a0 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61  ihood() value, a
296b0 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20  ssume that a .  
296c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f            ** "co
296d0 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65  l IS NULL" expre
296e0 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77  ssion matches tw
296f0 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73  ice as many rows
29700 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
29710 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a   as (col=?). */.
29720 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
29730 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20  ->nOut += 10;.  
29740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29750 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29760 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43  }..    /* Set rC
29770 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f  ostIdx to the co
29780 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73  st of visiting s
29790 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20  elected rows in 
297a0 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a  index. Add.    *
297b0 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52  * it to pNew->rR
297c0 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75 72  un, which is cur
297d0 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
297e0 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e  e cost of the in
297f0 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20  dex.    ** seek 
29800 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74  only. Then, if t
29810 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76  his is a non-cov
29820 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64  ering index, add
29830 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20   the cost of.   
29840 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65   ** visiting the
29850 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
29860 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  n table.  */.   
29870 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77   rCostIdx = pNew
29880 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35  ->nOut + 1 + (15
29890 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  *pProbe->szIdxRo
298a0 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73  w)/pSrc->pTab->s
298b0 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65  zTabRow;.    pNe
298c0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
298d0 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
298e0 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a  ize, rCostIdx);.
298f0 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
29900 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
29910 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
29920 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PK))==0 ){.     
29930 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
29940 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
29950 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d  New->rRun, pNew-
29960 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20  >nOut + 16);.   
29970 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74   }.    ApplyCost
29980 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
29990 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70  >rRun, pProbe->p
299a0 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29  Table->costMult)
299b0 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a  ;..    nOutUnadj
299c0 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f  usted = pNew->nO
299d0 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52  ut;.    pNew->rR
299e0 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e  un += nInMul + n
299f0 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  In;.    pNew->nO
29a00 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e  ut += nInMul + n
29a10 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  In;.    whereLoo
29a20 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42  pOutputAdjust(pB
29a30 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65  uilder->pWC, pNe
29a40 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72  w, rSize);.    r
29a50 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
29a60 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
29a70 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  ew);..    if( pN
29a80 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
29a90 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
29aa0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
29ab0 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
29ac0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
29ad0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
29ae0 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b   nOutUnadjusted;
29af0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
29b00 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
29b10 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
29b20 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65  )==0.     && pNe
29b30 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70  w->u.btree.nEq<p
29b40 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20  Probe->nColumn. 
29b50 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72     ){.      wher
29b60 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
29b70 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
29b80 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75  c, pProbe, nInMu
29b90 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  l+nIn);.    }.  
29ba0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
29bb0 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65  aved_nOut;.#ifde
29bc0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
29bd0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
29be0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
29bf0 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
29c00 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  id;.#endif.  }. 
29c10 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
29c20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20  saved_prereq;.  
29c30 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
29c40 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
29c50 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73   pNew->nSkip = s
29c60 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e  aved_nSkip;.  pN
29c70 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
29c80 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70  ved_wsFlags;.  p
29c90 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
29ca0 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e  d_nOut;.  pNew->
29cb0 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
29cc0 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  LTerm;..  /* Con
29cd0 73 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b  sider using a sk
29ce0 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65  ip-scan if there
29cf0 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
29d00 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
29d10 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
29d20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  for the left-mos
29d30 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69  t terms of the i
29d40 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65  ndex, and if the
29d50 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75   average.  ** nu
29d60 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20  mber of repeats 
29d70 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  in the left-most
29d80 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61   terms is at lea
29d90 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a  st 18. .  **.  *
29da0 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62  * The magic numb
29db0 65 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65  er 18 is selecte
29dc0 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74  d on the basis t
29dd0 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20  hat scanning 17 
29de0 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d  rows.  ** is alm
29df0 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b  ost always quick
29e00 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78  er than an index
29e10 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75   seek (even thou
29e20 67 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a  gh if the index.
29e30 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65    ** contains fe
29e40 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f  wer than 2^17 ro
29e50 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68  ws we assume oth
29e60 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20  erwise in other 
29e70 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68  parts of.  ** th
29e80 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76  e code). And, ev
29e90 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c  en if it is not,
29ea0 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
29eb0 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65  e too much slowe
29ec0 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20  r. .  ** On the 
29ed0 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20  other hand, the 
29ee0 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c  extra seeks coul
29ef0 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73  d end up being s
29f00 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
29f10 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65  * more expensive
29f20 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f30 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  42==sqlite3LogEs
29f40 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73  t(18) );.  if( s
29f50 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f  aved_nEq==saved_
29f60 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65  nSkip.   && save
29f70 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e  d_nEq+1<pProbe->
29f80 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50  nKeyCol.   && pP
29f90 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
29fa0 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d  t[saved_nEq+1]>=
29fb0 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d  42  /* TUNING: M
29fc0 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d  inimum for skip-
29fd0 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72  scan */.   && (r
29fe0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  c = whereLoopRes
29ff0 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
2a000 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d  ew->nLTerm+1))==
2a010 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20  SQLITE_OK.  ){. 
2a020 20 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b     LogEst nIter;
2a030 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
2a040 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e  ee.nEq++;.    pN
2a050 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20  ew->nSkip++;.   
2a060 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
2a070 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
2a080 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  0;.    pNew->wsF
2a090 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b  lags |= WHERE_SK
2a0a0 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65  IPSCAN;.    nIte
2a0b0 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  r = pProbe->aiRo
2a0c0 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
2a0d0 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52  q] - pProbe->aiR
2a0e0 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e  owLogEst[saved_n
2a0f0 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  Eq+1];.    pNew-
2a100 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a  >nOut -= nIter;.
2a110 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20      /* TUNING:  
2a120 42 65 63 61 75 73 65 20 75 6e 63 65 72 74 61 69  Because uncertai
2a130 6e 74 69 65 73 20 69 6e 20 74 68 65 20 65 73 74  nties in the est
2a140 69 6d 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d  imates for skip-
2a150 73 63 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20  scan queries,.  
2a160 20 20 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35    ** add a 1.375
2a170 20 66 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f   fudge factor to
2a180 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20   make skip-scan 
2a190 73 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69  slightly less li
2a1a0 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74  kely. */.    nIt
2a1b0 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65  er += 5;.    whe
2a1c0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
2a1d0 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
2a1e0 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65  rc, pProbe, nIte
2a1f0 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20  r + nInMul);.   
2a200 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
2a210 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ved_nOut;.    pN
2a220 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
2a230 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20  = saved_nEq;.   
2a240 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73   pNew->nSkip = s
2a250 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20  aved_nSkip;.    
2a260 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2a270 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
2a280 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2a290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a2a0 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 70   True if it is p
2a2b0 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e  ossible that pIn
2a2c0 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73 65  dex might be use
2a2d0 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d  ful in.** implem
2a2e0 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
2a2f0 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42   BY clause in pB
2a300 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  uilder..**.** Re
2a310 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42  turn False if pB
2a320 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20  uilder does not 
2a330 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52  contain an ORDER
2a340 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a   BY clause or.**
2a350 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
2a360 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74  way for pIndex t
2a370 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69  o be useful in i
2a380 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74  mplementing that
2a390 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
2a3a0 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
2a3b0 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c  nt indexMightHel
2a3c0 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20  pWithOrderBy(.  
2a3d0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2a3e0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e   *pBuilder,.  In
2a3f0 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69  dex *pIndex,.  i
2a400 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20  nt iCursor.){.  
2a410 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20  ExprList *pOB;. 
2a420 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20   int ii, jj;..  
2a430 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f  if( pIndex->bUno
2a440 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20  rdered ) return 
2a450 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20  0;.  if( (pOB = 
2a460 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
2a470 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29  ->pOrderBy)==0 )
2a480 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
2a490 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e  (ii=0; ii<pOB->n
2a4a0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
2a4b0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73   Expr *pExpr = s
2a4c0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
2a4d0 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d  llate(pOB->a[ii]
2a4e0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
2a4f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
2a500 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
2a510 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
2a520 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
2a530 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
2a540 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
2a550 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2a560 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
2a570 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
2a580 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2a590 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
2a5a0 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
2a5b0 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
2a5c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2a5d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2a5e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a5f0 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65   a bitmask where
2a600 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61   1s indicate tha
2a610 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
2a620 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  ing column of.**
2a630 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73   the table is us
2a640 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20  ed by an index. 
2a650 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
2a660 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63  63 columns are c
2a670 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74  onsidered..*/.st
2a680 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c  atic Bitmask col
2a690 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65  umnsInIndex(Inde
2a6a0 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d  x *pIdx){.  Bitm
2a6b0 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74  ask m = 0;.  int
2a6c0 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78   j;.  for(j=pIdx
2a6d0 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d  ->nColumn-1; j>=
2a6e0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; j--){.    int
2a6f0 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
2a700 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
2a710 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  x>=0 ){.      te
2a720 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
2a730 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2a740 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a  se( x==BMS-2 );.
2a750 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
2a760 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54  1 ) m |= MASKBIT
2a770 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (x);.    }.  }. 
2a780 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
2a790 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2a7a0 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
2a7b0 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65 78   with pPartIndex
2a7c0 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73 65  Where can be use
2a7d0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  d.** in the curr
2a7e0 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74 75  ent query.  Retu
2a7f0 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61  rn true if it ca
2a800 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69  n be and false i
2a810 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
2a820 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65   int whereUsable
2a830 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74  PartialIndex(int
2a840 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75   iTab, WhereClau
2a850 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
2a860 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Where){.  int i;
2a870 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
2a880 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  erm;.  for(i=0, 
2a890 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
2a8a0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
2a8b0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
2a8c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  f( sqlite3ExprIm
2a8d0 70 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d 2d  pliesExpr(pTerm-
2a8e0 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20  >pExpr, pWhere, 
2a8f0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
2a900 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2a910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2a920 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
2a930 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ects for a singl
2a940 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
2a950 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61  oin where the ta
2a960 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69  ble.** is idenfi
2a970 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
2a980 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
2a990 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
2a9a0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
2a9b0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
2a9c0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
2a9d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
2a9e0 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
2a9f0 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
2aa00 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
2aa10 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
2aa20 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
2aa30 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
2aa40 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
2aa50 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
2aa60 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
2aa70 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
2aa80 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
2aa90 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
2aaa0 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
2aab0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
2aac0 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
2aad0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaf0 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
2ab00 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
2ab10 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
2ab20 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
2ab30 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
2ab40 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
2ab50 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
2ab60 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
2ab70 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
2ab80 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
2ab90 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
2aba0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
2abb0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
2abc0 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
2abd0 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
2abe0 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
2abf0 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
2ac00 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2ac10 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
2ac20 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
2ac30 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
2ac40 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2ac50 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
2ac60 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
2ac70 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
2ac80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
2ac90 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
2aca0 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
2acb0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
2acc0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
2acd0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
2ace0 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
2acf0 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
2ad00 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
2ad10 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
2ad20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
2ad30 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
2ad40 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
2ad50 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
2ad60 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
2ad70 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
2ad80 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
2ad90 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
2ada0 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
2adb0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
2adc0 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
2add0 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
2ade0 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
2adf0 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
2ae00 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
2ae10 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
2ae20 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
2ae30 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
2ae40 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
2ae50 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
2ae60 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
2ae70 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
2ae80 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
2ae90 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
2aea0 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
2aeb0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
2aec0 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
2aed0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
2aee0 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
2aef0 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
2af00 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
2af10 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
2af20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
2af30 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
2af40 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
2af50 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
2af60 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
2af70 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
2af80 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
2af90 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
2afa0 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
2afb0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
2afc0 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
2afd0 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
2afe0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2aff0 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
2b000 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
2b010 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
2b020 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
2b030 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
2b040 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
2b050 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
2b060 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
2b070 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
2b080 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
2b090 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
2b0a0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
2b0b0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
2b0c0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
2b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b0e0 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
2b0f0 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
2b100 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
2b110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2b120 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
2b130 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
2b140 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
2b150 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
2b160 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
2b170 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
2b180 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
2b190 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
2b1a0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
2b1b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
2b1c0 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
2b1d0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
2b1e0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
2b1f0 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
2b200 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
2b210 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
2b220 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
2b230 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
2b240 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
2b250 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
2b260 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
2b270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
2b280 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
2b290 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
2b2a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2b2b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2b2c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2b2d0 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
2b2e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2b2f0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
2b300 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
2b310 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
2b320 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
2b330 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b350 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2b360 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
2b370 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
2b380 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2b390 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
2b3a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2b3b0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
2b3c0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2b3d0 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
2b3e0 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
2b3f0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
2b400 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
2b410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
2b420 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
2b430 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
2b440 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2b450 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
2b460 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
2b470 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2b480 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
2b490 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
2b4a0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
2b4b0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
2b4c0 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
2b4d0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
2b4e0 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
2b4f0 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
2b500 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
2b510 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
2b520 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2b530 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
2b540 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
2b550 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
2b560 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
2b570 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ex;.  }else if( 
2b580 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2b590 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  ){.    pProbe = 
2b5a0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
2b5b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2b5c0 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
2b5d0 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
2b5e0 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
2b5f0 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
2b600 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
2b610 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
2b620 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
2b630 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
2b640 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
2b650 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
2b660 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
2b670 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
2b680 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
2b690 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
2b6a0 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
2b6b0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
2b6c0 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
2b6d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2b6e0 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
2b6f0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
2b700 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
2b710 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
2b720 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65  x));.    sPk.nKe
2b730 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50  yCol = 1;.    sP
2b740 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
2b750 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
2b760 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
2b770 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45     sPk.aiRowLogE
2b780 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
2b790 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
2b7a0 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
2b7b0 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
2b7c0 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a  pTab;.    sPk.sz
2b7d0 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73  IdxRow = pTab->s
2b7e0 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52  zTabRow;.    aiR
2b7f0 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61  owEstPk[0] = pTa
2b800 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
2b810 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d     aiRowEstPk[1]
2b820 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74   = 0;.    pFirst
2b830 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70   = pSrc->pTab->p
2b840 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
2b850 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d  Src->notIndexed=
2b860 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
2b870 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  he real indices 
2b880 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
2b890 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64   only considered
2b8a0 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
2b8b0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61   NOT INDEXED qua
2b8c0 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65  lifier is omitte
2b8d0 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20  d from the FROM 
2b8e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
2b8f0 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72  sPk.pNext = pFir
2b900 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  st;.    }.    pP
2b910 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d  robe = &sPk;.  }
2b920 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d  .  rSize = pTab-
2b930 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72  >nRowLogEst;.  r
2b940 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
2b950 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65  (rSize);..#ifnde
2b960 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2b970 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
2b980 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
2b990 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70  exes */.  if( !p
2b9a0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a  Builder->pOrSet.
2b9b0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70     && (pWInfo->p
2b9c0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
2b9d0 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
2b9e0 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53  dex)!=0.   && pS
2b9f0 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  rc->pIndex==0.  
2ba00 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f   && !pSrc->viaCo
2ba10 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70  routine.   && !p
2ba20 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a  Src->notIndexed.
2ba30 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70     && HasRowid(p
2ba40 54 61 62 29 0a 20 20 20 26 26 20 21 70 53 72 63  Tab).   && !pSrc
2ba50 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a 20  ->isCorrelated. 
2ba60 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 52 65    && !pSrc->isRe
2ba70 63 75 72 73 69 76 65 0a 20 20 29 7b 0a 20 20 20  cursive.  ){.   
2ba80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
2ba90 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
2baa0 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  ps */.    WhereT
2bab0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
2bac0 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
2bad0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2bae0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72  ->nTerm;.    for
2baf0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72  (pTerm=pWC->a; r
2bb00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2bb10 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
2bb20 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
2bb30 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
2bb40 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
2bb50 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
2bb60 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  ;.      if( term
2bb70 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
2bb80 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b  erm, pSrc, 0) ){
2bb90 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
2bba0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
2bbb0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53          pNew->nS
2bbc0 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  kip = 0;.       
2bbd0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
2bbe0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
2bbf0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2bc00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 1;.        pNe
2bc10 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
2bc20 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Term;.        /*
2bc30 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d   TUNING: One-tim
2bc40 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75  e cost for compu
2bc50 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74  ting the automat
2bc60 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ic index is.    
2bc70 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64      ** estimated
2bc80 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28   to be X*N*log2(
2bc90 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  N) where N is th
2bca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2bcb0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   in.        ** t
2bcc0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
2bcd0 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65 72 65  ndexed and where
2bce0 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d   X is 7 (LogEst=
2bcf0 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20  28) for normal. 
2bd00 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
2bd10 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45 73   or 1.375 (LogEs
2bd20 74 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20 61  t=4) for views a
2bd30 6e 64 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  nd subqueries.  
2bd40 54 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  The value.      
2bd50 20 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61    ** of X is sma
2bd60 6c 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20 61  ller for views a
2bd70 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 73 6f  nd subqueries so
2bd80 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20   that the query 
2bd90 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20  planner.        
2bda0 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ** will be more 
2bdb0 61 67 67 72 65 73 73 69 76 65 20 61 62 6f 75 74  aggressive about
2bdc0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f   generating auto
2bdd0 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f  matic indexes fo
2bde0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  r.        ** tho
2bdf0 73 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63  se objects, sinc
2be00 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  e there is no op
2be10 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64  portunity to add
2be20 20 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20   schema.        
2be30 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75  ** indexes on su
2be40 62 71 75 65 72 69 65 73 20 61 6e 64 20 76 69 65  bqueries and vie
2be50 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ws. */.        p
2be60 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c  New->rSetup = rL
2be70 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b  ogSize + rSize +
2be80 20 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   4;.        if( 
2be90 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
2bea0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
2beb0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2bec0 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)==0 ){.      
2bed0 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
2bee0 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20 20   += 24;.        
2bef0 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
2bf00 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
2bf10 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62  ew->rSetup, pTab
2bf20 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
2bf30 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
2bf40 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  Each index looku
2bf50 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73  p yields 20 rows
2bf60 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2bf70 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  This.        ** 
2bf80 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  is more than the
2bf90 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20   usual guess of 
2bfa0 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77  10 rows, since w
2bfb0 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20  e have no way.  
2bfc0 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77        ** of know
2bfd0 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76  ing how selectiv
2bfe0 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
2bff0 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20   ultimately be. 
2c000 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20   It would.      
2c010 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65    ** not be unre
2c020 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  asonable to make
2c030 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68   this value much
2c040 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20   larger. */.    
2c050 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2c060 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33   43;  assert( 43
2c070 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2c080 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  20) );.        p
2c090 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
2c0a0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
2c0b0 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74  gSize,pNew->nOut
2c0c0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2c0d0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2c0e0 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20  _AUTO_INDEX;.   
2c0f0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2c100 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65  q = mExtra | pTe
2c110 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
2c120 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
2c130 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2c140 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2c150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2c160 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2c170 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
2c180 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20  _INDEX */..  /* 
2c190 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
2c1a0 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  dices.  */.  for
2c1b0 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
2c1c0 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f   && pProbe; pPro
2c1d0 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74  be=pProbe->pNext
2c1e0 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20  , iSortIdx++){. 
2c1f0 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70     if( pProbe->p
2c200 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a  PartIdxWhere!=0.
2c210 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73       && !whereUs
2c220 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
2c230 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20  (pSrc->iCursor, 
2c240 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61  pWC, pProbe->pPa
2c250 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20  rtIdxWhere) ){. 
2c260 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c270 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d  New->iTab!=pSrc-
2c280 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20  >iCursor );  /* 
2c290 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64 39  See ticket [98d9
2c2a0 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20  73b8f5] */.     
2c2b0 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50   continue;  /* P
2c2c0 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61  artial index ina
2c2d0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
2c2e0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  his query */.   
2c2f0 20 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70   }.    rSize = p
2c300 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
2c310 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  st[0];.    pNew-
2c320 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30  >u.btree.nEq = 0
2c330 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
2c340 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
2c350 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  >nLTerm = 0;.   
2c360 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2c370 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  = 0;.    pNew->r
2c380 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70  Setup = 0;.    p
2c390 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
2c3a0 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  xtra;.    pNew->
2c3b0 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
2c3c0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2c3d0 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b  pIndex = pProbe;
2c3e0 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69  .    b = indexMi
2c3f0 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
2c400 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72  By(pBuilder, pPr
2c410 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  obe, pSrc->iCurs
2c420 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  or);.    /* The 
2c430 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
2c440 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75  flags never occu
2c450 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  rs together with
2c460 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20   ORDER BY */.   
2c470 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f   assert( (pWInfo
2c480 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2c490 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2c4a0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30  IRED)==0 || b==0
2c4b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   );.    if( pPro
2c4c0 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20  be->tnum<=0 ){. 
2c4d0 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
2c4e0 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
2c4f0 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  x */.      pNew-
2c500 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2c510 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  _IPK;..      /* 
2c520 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  Full table scan 
2c530 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  */.      pNew->i
2c540 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
2c550 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
2c560 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
2c570 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20  t of full table 
2c580 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e  scan is (N*3.0).
2c590 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
2c5a0 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
2c5b0 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f  6;.      ApplyCo
2c5c0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
2c5d0 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
2c5e0 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
2c5f0 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
2c600 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c  djust(pWC, pNew,
2c610 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72   rSize);.      r
2c620 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2c630 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2c640 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ew);.      pNew-
2c650 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
2c660 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
2c670 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
2c680 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b        Bitmask m;
2c690 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62  .      if( pProb
2c6a0 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b  e->isCovering ){
2c6b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
2c6c0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
2c6d0 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
2c6e0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20  INDEXED;.       
2c6f0 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   m = 0;.      }e
2c700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d  lse{.        m =
2c710 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
2c720 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
2c730 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20  (pProbe);.      
2c740 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2c750 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
2c760 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
2c770 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
2c780 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
2c790 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c   }..      /* Ful
2c7a0 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78  l scan via index
2c7b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a   */.      if( b.
2c7c0 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f         || !HasRo
2c7d0 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20 20  wid(pTab).      
2c7e0 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20   || ( m==0.     
2c7f0 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62      && pProbe->b
2c800 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
2c810 20 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65        && (pProbe
2c820 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
2c830 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20  >szTabRow).     
2c840 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
2c850 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2c860 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2c870 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
2c880 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
2c890 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
2c8a0 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
2c8b0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
2c8c0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2c8d0 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
2c8e0 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
2c8f0 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
2c900 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
2c910 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
2c920 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20  dx : 0;..       
2c930 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
2c940 76 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64  visiting the ind
2c950 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20  ex rows is N*K, 
2c960 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20  where K is.     
2c970 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e     ** between 1.
2c980 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e  1 and 3.0, depen
2c990 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61  ding on the rela
2c9a0 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68  tive sizes of th
2c9b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  e.        ** ind
2c9c0 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77  ex and table row
2c9d0 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20  s. If this is a 
2c9e0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
2c9f0 65 78 20 73 63 61 6e 2c 0a 20 20 20 20 20 20 20  ex scan,.       
2ca00 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20 74 68 65   ** also add the
2ca10 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e   cost of visitin
2ca20 67 20 74 61 62 6c 65 20 72 6f 77 73 20 28 4e 2a  g table rows (N*
2ca30 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  3.0).  */.      
2ca40 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
2ca50 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70  Size + 1 + (15*p
2ca60 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
2ca70 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  /pTab->szTabRow;
2ca80 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d  .        if( m!=
2ca90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
2caa0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
2cab0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
2cac0 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a 65 2b 31  w->rRun, rSize+1
2cad0 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  6);.        }.  
2cae0 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
2caf0 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
2cb00 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
2cb10 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 77  Mult);.        w
2cb20 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
2cb30 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  just(pWC, pNew, 
2cb40 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  rSize);.        
2cb50 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2cb60 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2cb70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
2cb80 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
2cb90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2cba0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2cbb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
2cbc0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
2cbd0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
2cbe0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
2cbf0 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
2cc00 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
2cc10 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  OR_STAT4.    sql
2cc20 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
2cc30 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
2cc40 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
2cc50 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
2cc60 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
2cc70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
2cc80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2cc90 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
2cca0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2ccb0 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
2ccc0 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
2ccd0 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
2cce0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
2ccf0 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  x ) break;.  }. 
2cd00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2cd10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2cd20 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2cd30 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
2cd40 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2cd50 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74  for a table of t
2cd60 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69  he join identifi
2cd70 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65  ed by.** pBuilde
2cd80 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
2cd90 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
2cda0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
2cdb0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
2cdc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2cdd0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
2cde0 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
2cdf0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
2ce00 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
2ce10 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
2ce20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
2ce30 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  a.){.  WhereInfo
2ce40 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
2ce50 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
2ce60 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
2ce70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2ce80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ce90 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
2cea0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
2ceb0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
2cec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ced0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2cee0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2cef0 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
2cf00 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
2cf10 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
2cf20 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2cf30 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
2cf40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
2cf50 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
2cf60 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
2cf70 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
2cf80 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
2cf90 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2cfa0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2cfb0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
2cfc0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2cfd0 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
2cfe0 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54    int iTerm, mxT
2cff0 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  erm;.  int nCons
2d000 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65  traint;.  int se
2d010 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  enIn = 0;       
2d020 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d030 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
2d040 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
2d050 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20  t seenVar = 0;  
2d060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d070 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73  ue if a non-cons
2d080 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  tant constraint 
2d090 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
2d0a0 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20   iPhase;        
2d0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
2d0c0 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a  const w/o IN, 1:
2d0d0 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e   const, 2: no IN
2d0e0 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68  ,  2: IN */.  Wh
2d0f0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
2d100 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d110 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d  _OK;..  pWInfo =
2d120 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2d130 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
2d140 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
2d150 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2d160 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
2d170 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d  r->pWC;.  pNew =
2d180 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2d190 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66  .  pSrc = &pWInf
2d1a0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2d1b0 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54  New->iTab];.  pT
2d1c0 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
2d1d0 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
2d1e0 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20  tual(pTab) );.  
2d1f0 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
2d200 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
2d210 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
2d220 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72  pBuilder->pOrder
2d230 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  By);.  if( pIdxI
2d240 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
2d250 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2d260 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
2d270 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
2d280 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
2d290 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
2d2a0 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
2d2b0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
2d2c0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
2d2d0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70  eedFree = 0;.  p
2d2e0 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
2d2f0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
2d300 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e  ge;.  nConstrain
2d310 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
2d320 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
2d330 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
2d340 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73  (db, pNew, nCons
2d350 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73  traint) ){.    s
2d360 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2d370 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
2d380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d390 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  MEM;.  }..  for(
2d3a0 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65  iPhase=0; iPhase
2d3b0 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a  <=3; iPhase++){.
2d3c0 20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20      if( !seenIn 
2d3d0 26 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30  && (iPhase&1)!=0
2d3e0 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65   ){.      iPhase
2d3f0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ++;.      if( iP
2d400 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a  hase>3 ) break;.
2d410 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
2d420 65 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65  eenVar && iPhase
2d430 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >1 ) break;.    
2d440 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
2d450 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2d460 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
2d470 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
2d480 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69  raint;.    for(i
2d490 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
2d4a0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2d4b0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2d4c0 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
2d4d0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
2d4e0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
2d4f0 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
2d500 73 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29  switch( iPhase )
2d510 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30  {.        case 0
2d520 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
2d530 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65  s without IN ope
2d540 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
2d550 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2d560 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ble = 0;.       
2d570 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2d580 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
2d590 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2d5a0 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a      seenIn = 1;.
2d5b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d5c0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
2d5d0 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20  >prereqRight!=0 
2d5e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2d5f0 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20  eenVar = 1;.    
2d600 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d610 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2d620 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b  r & WO_IN)==0 ){
2d630 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
2d640 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2d650 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2d660 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2d670 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
2d680 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
2d690 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72  with IN operator
2d6a0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  s */.          a
2d6b0 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b  ssert( seenIn );
2d6c0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
2d6d0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
2d6e0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2d6f0 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t==0);.         
2d700 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2d710 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61  case 2:    /* Va
2d720 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20  riables without 
2d730 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
2d740 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
2d750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
2d760 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2d770 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2d780 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20  r & WO_IN)==0;. 
2d790 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2d7a0 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
2d7b0 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20     /* Variables 
2d7c0 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20  with IN */.     
2d7d0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2d7e0 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29  nVar && seenIn )
2d7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2d800 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
2d810 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2d820 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2d830 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61  .    memset(pUsa
2d840 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
2d850 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
2d860 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
2d870 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
2d880 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2d890 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
2d8a0 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
2d8b0 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e  Str);.    pIdxIn
2d8c0 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
2d8d0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
2d8e0 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49  xNum = 0;.    pI
2d8f0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2d900 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
2d910 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
2d920 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
2d930 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
2d940 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
2d950 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
2d960 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70  (double)2;.    p
2d970 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
2d980 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20  edRows = 25;.   
2d990 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e   rc = vtabBestIn
2d9a0 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62  dex(pParse, pTab
2d9b0 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20  , pIdxInfo);.   
2d9c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
2d9d0 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2d9e0 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f  exit;.    pIdxCo
2d9f0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
2da00 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2da10 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
2da20 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
2da30 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
2da40 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
2da50 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20  mxTerm = -1;.   
2da60 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
2da70 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69  LSlot>=nConstrai
2da80 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt );.    for(i=
2da90 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
2daa0 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54  ; i++) pNew->aLT
2dab0 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  erm[i] = 0;.    
2dac0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
2dad0 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66  tMask = 0;.    f
2dae0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
2daf0 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
2db00 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Cons++){.      i
2db10 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61  f( (iTerm = pUsa
2db20 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
2db30 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  - 1)>=0 ){.     
2db40 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
2db50 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
2db60 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
2db70 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  =nConstraint.   
2db80 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20        || j<0.   
2db90 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d        || j>=pWC-
2dba0 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  >nTerm.         
2dbb0 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  || pNew->aLTerm[
2dbc0 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
2dbd0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
2dbe0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2dbf0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2dc00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2dc10 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64  se, "%s.xBestInd
2dc20 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ex() malfunction
2dc30 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
2dc40 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2dc50 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
2dc60 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
2dc70 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2dc80 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74  e( iTerm==nConst
2dc90 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20  raint-1 );.     
2dca0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
2dcb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
2dcc0 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e  tcase( j==pWC->n
2dcd0 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20  Term-1 );.      
2dce0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
2dcf0 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e  a[j];.        pN
2dd00 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54  ew->prereq |= pT
2dd10 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2dd20 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2dd30 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c  ( iTerm<pNew->nL
2dd40 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Slot );.        
2dd50 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
2dd60 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  rm] = pTerm;.   
2dd70 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
2dd80 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
2dd90 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
2dda0 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
2ddb0 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74  =15 );.        t
2ddc0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2ddd0 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  16 );.        if
2dde0 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55  ( iTerm<16 && pU
2ddf0 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70  sage[i].omit ) p
2de00 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
2de10 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d  Mask |= 1<<iTerm
2de20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
2de30 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2de40 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
2de50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73           if( pUs
2de60 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29  age[i].omit==0 )
2de70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2de80 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
2de90 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e  to use an IN con
2dea0 73 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76  straint if the v
2deb0 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20  irtual table.   
2dec0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73           ** says
2ded0 20 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61   that the equiva
2dee0 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69  lent EQ constrai
2def0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66  nt cannot be saf
2df00 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20  ely omitted..   
2df10 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77           ** If w
2df20 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e do attempt to 
2df30 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74  use such a const
2df40 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73  raint, some rows
2df50 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20   might be.      
2df60 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65        ** repeate
2df70 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e  d in the output.
2df80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2df90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2dfa0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
2dfb0 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
2dfc0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69  that is constrai
2dfd0 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61  ned by an IN cla
2dfe0 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20  use may not.    
2dff0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65        ** consume
2e000 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2e010 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29  ause because (1)
2e020 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
2e030 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20   terms.         
2e040 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   ** is not neces
2e050 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  sarily related t
2e060 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f  o the order of o
2e070 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a  utput terms and.
2e080 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29            ** (2)
2e090 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74   Multiple output
2e0a0 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
2e0b0 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f  IN value will no
2e0c0 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20  t merge.        
2e0d0 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20    ** together.  
2e0e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
2e0f0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
2e100 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
2e110 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e120 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e    }.    if( i>=n
2e130 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
2e140 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
2e150 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20   = mxTerm+1;.   
2e160 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2e170 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e  >nLTerm<=pNew->n
2e180 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70  LSlot );.      p
2e190 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  New->u.vtab.idxN
2e1a0 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  um = pIdxInfo->i
2e1b0 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65  dxNum;.      pNe
2e1c0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2e1d0 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  ee = pIdxInfo->n
2e1e0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b  eedToFreeIdxStr;
2e1f0 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
2e200 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2e210 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  r = 0;.      pNe
2e220 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
2e230 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
2e240 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Str;.      pNew-
2e250 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
2e260 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66  d = (i8)(pIdxInf
2e270 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
2e280 65 64 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ed ?.           
2e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2a0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49             pIdxI
2e2b0 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20  nfo->nOrderBy : 
2e2c0 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
2e2d0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
2e2e0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
2e2f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d  qlite3LogEstFrom
2e300 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d  Double(pIdxInfo-
2e310 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
2e320 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
2e330 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
2e340 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  t(pIdxInfo->esti
2e350 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20 20  matedRows);.    
2e360 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72    whereLoopInser
2e370 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2e380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2e390 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2e3a0 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ee ){.        sq
2e3b0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
2e3c0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
2e3d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
2e3e0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
2e3f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2e400 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f  }.  }  ..whereLo
2e410 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a  opAddVtab_exit:.
2e420 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
2e430 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2e440 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2e450 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2e460 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2e470 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
2e480 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2e490 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2e4a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2e4b0 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  BLE */../*.** Ad
2e4c0 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  d WhereLoop entr
2e4d0 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52  ies to handle OR
2e4e0 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f   terms.  This wo
2e4f0 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a  rks for either.*
2e500 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74  * btrees or virt
2e510 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  ual tables..*/.s
2e520 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2e530 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f  oopAddOr(WhereLo
2e540 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
2e550 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78  der, Bitmask mEx
2e560 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  tra){.  WhereInf
2e570 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
2e580 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2e590 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2e5a0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2e5b0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
2e5c0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
2e5d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2e5e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
2e5f0 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
2e600 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
2e610 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
2e620 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
2e630 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b  rSet sSum, sCur;
2e640 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2e650 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2e660 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
2e670 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e  er->pWC;.  pWCEn
2e680 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2e690 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2e6a0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2e6b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
2e6c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
2e6d0 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
2e6e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2e6f0 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
2e700 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
2e710 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
2e720 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
2e730 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
2e740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
2e750 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
2e760 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2e770 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
2e780 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
2e790 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
2e7a0 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
2e7b0 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
2e7c0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
2e7d0 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
2e7e0 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
2e7f0 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
2e800 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
2e810 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
2e820 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
2e830 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
2e840 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
2e850 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
2e860 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
2e870 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
2e880 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
2e890 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
2e8a0 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
2e8b0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2e8c0 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
2e8d0 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ;..      WHERETR
2e8e0 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65 67  ACE(0x200, ("Beg
2e8f0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  in processing OR
2e900 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
2e910 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f  Term));.      fo
2e920 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
2e930 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
2e940 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
2e950 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2e960 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
2e970 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
2e980 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
2e990 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
2e9a0 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
2e9b0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
2e9c0 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
2e9d0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
2e9e0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
2e9f0 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
2ea00 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
2ea10 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
2ea20 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
2ea30 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
2ea40 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
2ea50 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
2ea60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2ea70 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
2ea80 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
2ea90 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
2eaa0 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
2eab0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2eac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2ead0 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
2eae0 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48  n = 0;.#ifdef WH
2eaf0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2eb00 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
2eb10 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d  ACE(0x200, ("OR-
2eb20 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61  term %d of %p ha
2eb30 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e  s %d subterms:\n
2eb40 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
2eb50 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72         (int)(pOr
2eb60 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20  Term-pOrWC->a), 
2eb70 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64  pTerm, sSubBuild
2eb80 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20  .pWC->nTerm));. 
2eb90 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2eba0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
2ebb0 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x400 ){.        
2ebc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 53 75    for(i=0; i<sSu
2ebd0 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72  bBuild.pWC->nTer
2ebe0 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; i++){.       
2ebf0 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72       whereTermPr
2ec00 69 6e 74 28 26 73 53 75 62 42 75 69 6c 64 2e 70  int(&sSubBuild.p
2ec10 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20  WC->a[i], i);.  
2ec20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ec30 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
2ec40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2ec50 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2ec60 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
2ec70 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
2ec80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2ec90 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
2eca0 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
2ecb0 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   mExtra);.      
2ecc0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2ecd0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2ece0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2ecf0 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42  pAddBtree(&sSubB
2ed00 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
2ed10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ed20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ed30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ed40 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2ed50 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20  dOr(&sSubBuild, 
2ed60 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20  mExtra);.       
2ed70 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2ed80 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2ed90 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b   || sCur.n==0 );
2eda0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43 75  .        if( sCu
2edb0 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r.n==0 ){.      
2edc0 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a      sSum.n = 0;.
2edd0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2ede0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2edf0 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20  f( once ){.     
2ee00 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
2ee10 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a  (&sSum, &sCur);.
2ee20 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d            once =
2ee30 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
2ee40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  e{.          Whe
2ee50 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20  reOrSet sPrev;. 
2ee60 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
2ee70 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53  Move(&sPrev, &sS
2ee80 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  um);.          s
2ee90 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
2eea0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2eeb0 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  sPrev.n; i++){. 
2eec0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
2eed0 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b  =0; j<sCur.n; j+
2eee0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2eef0 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28    whereOrInsert(
2ef00 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69  &sSum, sPrev.a[i
2ef10 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e  ].prereq | sCur.
2ef20 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20  a[j].prereq,.   
2ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ef50 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e  LogEstAdd(sPrev.
2ef60 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e  a[i].rRun, sCur.
2ef70 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20  a[j].rRun),.    
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
2efa0 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61  ogEstAdd(sPrev.a
2efb0 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61  [i].nOut, sCur.a
2efc0 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20  [j].nOut));.    
2efd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2efe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2eff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
2f000 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  ew->nLTerm = 1;.
2f010 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2f020 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
2f030 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2f040 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs = WHERE_MULTI
2f050 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  _OR;.      pNew-
2f060 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
2f070 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2f080 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d  x = 0;.      mem
2f090 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c  set(&pNew->u, 0,
2f0a0 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29   sizeof(pNew->u)
2f0b0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
2f0c0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2f0d0 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b  && i<sSum.n; i++
2f0e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  ){.        /* TU
2f0f0 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20  NING: Currently 
2f100 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69  sSum.a[i].rRun i
2f110 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d  s set to the sum
2f120 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
2f130 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20        ** of all 
2f140 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72  sub-scans requir
2f150 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61  ed by the OR-sca
2f160 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20  n. However, due 
2f170 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20  to rounding.    
2f180 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69      ** errors, i
2f190 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68  t may be that th
2f1a0 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52  e cost of the OR
2f1b0 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74  -scan is equal t
2f1c0 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  o its.        **
2f1d0 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20   most expensive 
2f1e0 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68  sub-scan. Add th
2f1f0 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69  e smallest possi
2f200 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20  ble penalty .   
2f210 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c       ** (equival
2f220 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69  ent to multiplyi
2f230 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79 20 31  ng the cost by 1
2f240 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74  .07) to ensure t
2f250 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  hat .        ** 
2f260 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61  this does not ha
2f270 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  ppen. Otherwise,
2f280 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
2f290 65 73 20 73 75 63 68 20 61 73 20 74 68 65 0a 20  es such as the. 
2f2a0 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77         ** follow
2f2b0 69 6e 67 20 77 68 65 72 65 20 74 68 65 72 65 20  ing where there 
2f2c0 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22  is an index on "
2f2d0 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  y":.        **. 
2f2e0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48         **     WH
2f2f0 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78  ERE likelihood(x
2f300 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f  =?, 0.99) OR y=?
2f310 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2f320 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e      ** the plann
2f330 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20  er may elect to 
2f340 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61 20  "OR" together a 
2f350 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20  full-table scan 
2f360 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a  and an.        *
2f370 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20  * index lookup. 
2f380 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61  And other simila
2f390 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e  rly odd results.
2f3a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
2f3b0 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61  w->rRun = sSum.a
2f3c0 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20  [i].rRun + 1;.  
2f3d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2f3e0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75   = sSum.a[i].nOu
2f3f0 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  t;.        pNew-
2f400 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61  >prereq = sSum.a
2f410 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20  [i].prereq;.    
2f420 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2f430 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2f440 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2f450 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  }.      WHERETRA
2f460 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e 64 20  CE(0x200, ("End 
2f470 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c  processing OR-cl
2f480 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72  ause %p\n", pTer
2f490 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  m));.    }.  }. 
2f4a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f4b0 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
2f4c0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
2f4d0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a  or all tables .*
2f4e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
2f4f0 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65  reLoopAddAll(Whe
2f500 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
2f510 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
2f520 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
2f530 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
2f540 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  ;.  Bitmask mExt
2f550 72 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73  ra = 0;.  Bitmas
2f560 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  k mPrior = 0;.  
2f570 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c  int iTab;.  SrcL
2f580 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
2f590 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2f5a0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
2f5b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2f5c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2f5d0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2f5e0 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69  db;.  int nTabLi
2f5f0 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  st = pWInfo->nLe
2f600 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  vel;.  int rc = 
2f610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
2f620 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20  priorJoinType = 
2f630 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  0;.  WhereLoop *
2f640 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  pNew;..  /* Loop
2f650 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73   over the tables
2f660 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72   in the join, fr
2f670 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
2f680 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75   */.  pNew = pBu
2f690 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77  ilder->pNew;.  w
2f6a0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65  hereLoopInit(pNe
2f6b0 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30  w);.  for(iTab=0
2f6c0 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74  , pItem=pTabList
2f6d0 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69  ->a; iTab<nTabLi
2f6e0 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65  st; iTab++, pIte
2f6f0 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  m++){.    pNew->
2f700 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
2f710 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
2f720 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  = getMask(&pWInf
2f730 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74  o->sMaskSet, pIt
2f740 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2f750 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a    if( ((pItem->j
2f760 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69  ointype|priorJoi
2f770 6e 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46  nType) & (JT_LEF
2f780 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20  T|JT_CROSS))!=0 
2f790 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61 20  ){.      mExtra 
2f7a0 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a  = mPrior;.    }.
2f7b0 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70      priorJoinTyp
2f7c0 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  e = pItem->joint
2f7d0 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73 56  ype;.    if( IsV
2f7e0 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
2f7f0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ab) ){.      rc 
2f800 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
2f810 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20  rtual(pBuilder, 
2f820 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c  mExtra);.    }el
2f830 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
2f840 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
2f850 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
2f860 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
2f870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f880 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
2f890 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
2f8a0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2f8b0 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
2f8c0 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
2f8d0 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
2f8e0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2f8f0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
2f900 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
2f910 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
2f920 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2f930 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
2f940 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
2f950 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
2f960 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
2f970 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61  of the 5th.** pa
2f980 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
2f990 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
2f9a0 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
2f9b0 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
2f9c0 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
2f9d0 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
2f9e0 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
2f9f0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
2fa00 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  urn N:.** .**   
2fa10 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f  N>0:   N terms o
2fa20 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
2fa30 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
2fa40 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20  ied.**   N==0:  
2fa50 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  No terms of the 
2fa60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2fa70 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
2fa80 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77     N<0:   Unknow
2fa90 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74  n yet how many t
2faa0 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59  erms of ORDER BY
2fab0 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66   might be satisf
2fac0 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ied.   .**.** No
2fad0 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69  te that processi
2fae0 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f  ng for WHERE_GRO
2faf0 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44  UPBY and WHERE_D
2fb00 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74  ISTINCTBY is not
2fb10 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20   as.** strict.  
2fb20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e  With GROUP BY an
2fb30 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f  d DISTINCT the o
2fb40 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20  nly requirement 
2fb50 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76  is that.** equiv
2fb60 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61  alent rows appea
2fb70 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64  r immediately ad
2fb80 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e  jacent to one an
2fb90 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59  other.  GROUP BY
2fba0 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54  .** and DISTINCT
2fbb0 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
2fbc0 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69  rows to appear i
2fbd0 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  n any particular
2fbe0 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a   order as long.*
2fbf0 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * as equivalent 
2fc00 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64  rows are grouped
2fc10 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73   together.  Thus
2fc20 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e   for GROUP BY an
2fc30 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68  d DISTINCT.** th
2fc40 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  e pOrderBy terms
2fc50 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
2fc60 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57  in any order.  W
2fc70 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68  ith ORDER BY, th
2fc80 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74  e .** pOrderBy t
2fc90 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74  erms must be mat
2fca0 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c  ched in strict l
2fcb0 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64  eft-to-right ord
2fcc0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38  er..*/.static i8
2fcd0 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
2fce0 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68  iesOrderBy(.  Wh
2fcf0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
2fd00 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2fd10 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2fd20 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2fd30 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f     /* ORDER BY o
2fd40 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49  r GROUP BY or DI
2fd50 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f  STINCT clause to
2fd60 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72   check */.  Wher
2fd70 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20  ePath *pPath,   
2fd80 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61    /* The WherePa
2fd90 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  th to check */. 
2fda0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
2fdb0 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
2fdc0 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52  contain WHERE_GR
2fdd0 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44  OUPBY or WHERE_D
2fde0 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75  ISTINCTBY */.  u
2fdf0 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
2fe00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2fe10 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
2fe20 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
2fe30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
2fe40 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
2fe50 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
2fe60 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
2fe70 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
2fe80 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
2fe90 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
2fea0 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
2feb0 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
2fec0 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
2fed0 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
2fee0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2fef0 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
2ff00 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
2ff10 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
2ff20 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
2ff30 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2ff50 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
2ff60 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
2ff70 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
2ff80 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
2ff90 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
2ffa0 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
2ffb0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
2ffc0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2ffd0 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
2ffe0 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
2fff0 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
30000 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
30010 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
30020 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
30030 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
30040 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20    u16 nKeyCol;  
30050 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30060 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
30070 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
30080 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  u16 nColumn;    
30090 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
300a0 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64  umber of ordered
300b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
300c0 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  index */.  u16 n
300d0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
300e0 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
300f0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
30100 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
30110 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
30120 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
30130 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
30140 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
30150 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
30160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30170 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
30180 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
30190 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
301a0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
301b0 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
301c0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
301d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
301e0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
301f0 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
30200 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
30210 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
30220 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
30230 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
30240 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
30250 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
30260 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
30270 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
30280 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
30290 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
302a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
302b0 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
302c0 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
302d0 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
302e0 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
302f0 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
30300 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
30310 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
30320 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
30330 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
30340 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
30350 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
30360 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
30370 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
30380 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
30390 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
303a0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
303b0 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
303c0 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
303d0 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
303e0 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
303f0 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
30400 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
30410 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
30420 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
30430 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
30440 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
30450 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
30460 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
30470 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
30480 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
30490 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
304a0 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
304b0 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
304c0 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
304d0 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
304e0 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
304f0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
30500 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
30510 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
30520 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
30530 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
30540 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
30550 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
30560 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
30570 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
30580 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
30590 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
305a0 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
305b0 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
305c0 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
305d0 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
305e0 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
305f0 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
30600 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
30610 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
30620 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
30630 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
30640 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
30650 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
30660 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
30670 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
30680 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
30690 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
306a0 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
306b0 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
306c0 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
306d0 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
306e0 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
306f0 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
30700 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
30710 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
30720 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
30730 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
30740 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
30750 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
30760 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
30770 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
30780 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
30790 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
307a0 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
307b0 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
307c0 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
307d0 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
307e0 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
307f0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
30800 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
30810 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
30820 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
30830 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
30840 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
30850 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
30860 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
30870 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
30880 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
30890 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
308a0 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
308b0 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
308c0 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
308d0 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
308e0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
308f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
30900 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
30910 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
30920 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
30930 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
30940 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  derBy!=0 );.  if
30950 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
30960 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
30970 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
30980 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
30990 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
309a0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
309b0 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
309c0 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
309d0 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
309e0 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
309f0 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
30a00 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
30a10 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
30a20 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
30a30 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
30a40 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
30a50 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
30a60 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
30a70 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
30a80 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
30a90 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
30aa0 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20  && obSat<obDone 
30ab0 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b  && iLoop<=nLoop;
30ac0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69   iLoop++){.    i
30ad0 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61  f( iLoop>0 ) rea
30ae0 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  dy |= pLoop->mas
30af0 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70  kSelf;.    pLoop
30b00 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f   = iLoop<nLoop ?
30b10 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c   pPath->aLoop[iL
30b20 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20  oop] : pLast;.  
30b30 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
30b40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
30b50 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
30b60 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e     if( pLoop->u.
30b70 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29  vtab.isOrdered )
30b80 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b   obSat = obDone;
30b90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
30ba0 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70    }.    iCur = p
30bb0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
30bc0 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
30bd0 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a  iCursor;..    /*
30be0 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52   Mark off any OR
30bf0 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68  DER BY term X th
30c00 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  at is a column i
30c10 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20  n the table of. 
30c20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
30c30 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68  t loop for which
30c40 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69   there is term i
30c50 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20  n the WHERE.    
30c60 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
30c70 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20   form X IS NULL 
30c80 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65  or X=? that refe
30c90 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72  rence only outer
30ca0 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20  .    ** loops.. 
30cb0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
30cc0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
30cd0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d  ++){.      if( M
30ce0 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
30cf0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
30d00 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
30d10 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
30d20 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
30d30 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
30d40 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
30d50 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
30d60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
30d70 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
30d80 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
30d90 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  nue;.      pTerm
30da0 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49   = findTerm(&pWI
30db0 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20  nfo->sWC, iCur, 
30dc0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
30dd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30de0 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c           ~ready,
30df0 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c   WO_EQ|WO_ISNULL
30e00 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
30e10 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
30e20 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
30e30 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
30e40 26 57 4f 5f 45 51 29 21 3d 30 20 26 26 20 70 4f  &WO_EQ)!=0 && pO
30e50 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  BExpr->iColumn>=
30e60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
30e70 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32  st char *z1, *z2
30e80 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
30e90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
30ea0 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
30eb0 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
30ec0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
30ed0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
30ee0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
30ef0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
30f00 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z1 = pColl->zNam
30f10 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e;.        pColl
30f20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
30f30 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
30f40 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
30f50 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
30f60 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
30f70 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
30f80 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43  .        z2 = pC
30f90 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
30fa0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
30fb0 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d  trICmp(z1, z2)!=
30fc0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
30fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
30fe0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
30ff0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
31000 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
31010 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
31020 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
31030 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
31040 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
31050 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
31060 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  ;.        nKeyCo
31070 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
31080 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
31090 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
310a0 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
310b0 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
310c0 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
310d0 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
310e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
310f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31100 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nKeyCol = pIndex
31110 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
31120 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
31130 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
31140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
31150 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31  olumn==nKeyCol+1
31160 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
31170 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b  ndex->pTable) );
31180 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31190 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
311a0 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d  n[nColumn-1]==(-
311b0 31 29 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  1) || !HasRowid(
311c0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29  pIndex->pTable))
311d0 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
311e0 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e  rDistinct = IsUn
311f0 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
31200 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
31210 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
31220 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  h all columns of
31230 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64   the index and d
31240 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65  eal with the one
31250 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
31260 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69  are not constrai
31270 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e  ned by == or IN.
31280 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31290 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30  rev = revSet = 0
312a0 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74  ;.      distinct
312b0 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20  Columns = 0;.   
312c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
312d0 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
312e0 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20       u8 bOnce;  
312f0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
31300 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
31310 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
31320 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65       /* Skip ove
31330 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c  r == and IS NULL
31340 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
31350 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
31360 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
31370 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53      && pLoop->nS
31380 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  kip==0.         
31390 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
313a0 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
313b0 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
313c0 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20  O_ISNULL))!=0.  
313d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
313e0 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
313f0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
31400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
31410 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
31420 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
31430 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
31440 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31450 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
31460 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
31470 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
31480 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
31490 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
314a0 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
314b0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
314c0 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
314d0 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
314e0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
314f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
31500 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
31510 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
31520 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
31530 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
31540 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
31550 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
31560 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
31570 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
31580 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
31590 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
315a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
315b0 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
315c0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  -1;.          re
315d0 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
315e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
315f0 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
31600 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
31610 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
31620 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
31630 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
31640 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
31650 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  red.        */. 
31660 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
31670 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20  erDistinct.     
31680 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d      && iColumn>=
31690 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e  0.         && j>
316a0 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
316b0 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
316c0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
316d0 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  aCol[iColumn].no
316e0 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20  tNull==0.       
316f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
31700 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
31710 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
31720 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68        /* Find th
31730 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
31740 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
31750 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c   to the j-th col
31760 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  umn.        ** o
31770 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
31780 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20  mark that ORDER 
31790 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20  BY term off .   
317a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
317b0 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  bOnce = 1;.     
317c0 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
317d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
317e0 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
317f0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
31800 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
31810 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
31820 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
31830 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
31840 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
31850 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
31860 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
31870 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
31880 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
31890 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20  E_GROUPBY );.   
318a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
318b0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
318c0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
318d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
318e0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57  (wctrlFlags & (W
318f0 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45  HERE_GROUPBY|WHE
31900 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d  RE_DISTINCTBY))=
31910 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a  =0 ) bOnce = 0;.
31920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
31930 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
31940 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
31950 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
31960 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
31970 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
31980 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
31990 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21  OBExpr->iColumn!
319a0 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  =iColumn ) conti
319b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
319c0 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  f( iColumn>=0 ){
319d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
319e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
319f0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
31a00 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
31a10 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
31a20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
31a30 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
31a40 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
31a50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
31a60 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
31a70 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
31a80 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
31a90 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
31aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31ab0 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
31ac0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
31ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31ae0 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
31af0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
31b00 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
31b10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
31b20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
31b30 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
31b40 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
31b50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
31b60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  .          ** So
31b70 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
31b80 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
31b90 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
31ba0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
31bb0 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
31bc0 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
31bd0 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42  revIdx)!=pOrderB
31be0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
31bf0 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b  r ) isMatch = 0;
31c00 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
31c10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
31c20 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
31c30 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
31c40 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
31c50 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
31c60 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
31c70 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
31c80 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
31c90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31cb0 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
31cc0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
31cd0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
31ce0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31cf0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
31d00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
31d10 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
31d20 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
31d30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
31d40 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
31d50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
31d60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
31d70 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   match found */.
31d80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
31d90 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20  =0 || j<nKeyCol 
31da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
31db0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
31dc0 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
31dd0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
31de0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
31df0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31e00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
31e20 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20  * end Loop over 
31e30 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  all index column
31e40 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  s */.      if( d
31e50 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29  istinctColumns )
31e60 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
31e70 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
31e80 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct==0 );.      
31e90 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
31ea0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
31eb0 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e     } /* end-if n
31ec0 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20  ot one-row */.. 
31ed0 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
31ee0 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42  ny other ORDER B
31ef0 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66  Y terms that ref
31f00 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a  erence pLoop */.
31f10 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
31f20 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
31f30 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
31f40 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sk |= pLoop->mas
31f50 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
31f60 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
31f70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
31f80 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20  Expr *p;.       
31f90 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a   Bitmask mTerm;.
31fa0 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
31fb0 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
31fc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31fd0 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
31fe0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
31ff0 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 65 78 70       mTerm = exp
32000 72 54 61 62 6c 65 55 73 61 67 65 28 26 70 57 49  rTableUsage(&pWI
32010 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29  nfo->sMaskSet,p)
32020 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54  ;.        if( mT
32030 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74  erm==0 && !sqlit
32040 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
32050 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (p) ) continue;.
32060 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65          if( (mTe
32070 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63  rm&~orderDistinc
32080 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  tMask)==0 ){.   
32090 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
320a0 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
320b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
320c0 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74    }.  } /* End t
320d0 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  he loop over all
320e0 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d   WhereLoops from
320f0 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e   outer-most down
32100 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a   to inner-most *
32110 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f  /.  if( obSat==o
32120 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28  bDone ) return (
32130 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  i8)nOrderBy;.  i
32140 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69  f( !isOrderDisti
32150 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  nct ){.    for(i
32160 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30  =nOrderBy-1; i>0
32170 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  ; i--){.      Bi
32180 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49  tmask m = MASKBI
32190 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  T(i) - 1;.      
321a0 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d  if( (obSat&m)==m
321b0 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20   ) return i;.   
321c0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
321d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
321e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
321f0 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  he WHERE_GROUPBY
32200 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
32210 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20  the mask passed 
32220 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
32230 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70  egin(),.** the p
32240 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74  lanner assumes t
32250 68 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65  hat the specifie
32260 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20  d pOrderBy list 
32270 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52  is actually a GR
32280 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65  OUP.** BY clause
32290 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72   - and so any or
322a0 64 65 72 20 74 68 61 74 20 67 72 6f 75 70 73 20  der that groups 
322b0 72 6f 77 73 20 61 73 20 72 65 71 75 69 72 65 64  rows as required
322c0 20 73 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a   satisfies the.*
322d0 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a  * request..**.**
322e0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68   Normally, in th
322f0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
32300 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
32310 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74  he caller to det
32320 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
32330 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77  r or not the row
32340 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69  s are really bei
32350 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20  ng delivered in 
32360 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72  sorted order, or
32370 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65  .** just in some
32380 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68 61   other order tha
32390 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 72  t provides the r
323a0 65 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67  equired grouping
323b0 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
323c0 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42   the WHERE_SORTB
323d0 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61  YGROUP flag is a
323e0 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71  lso passed to sq
323f0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
32400 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ), then.** this 
32410 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
32420 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65  called on the re
32430 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f  turned WhereInfo
32440 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75   object. It retu
32450 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  rns.** true if t
32460 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77  he rows really w
32470 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e  ill be sorted in
32480 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
32490 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a  rder, or false.*
324a0 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  * otherwise..**.
324b0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
324c0 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  assuming:.**.** 
324d0 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
324e0 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a  1 ON t1(x, Y);.*
324f0 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20  *.** then.**.** 
32500 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
32510 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20  t1 GROUP BY x,y 
32520 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20  ORDER BY x,y;   
32530 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31  -- IsSorted()==1
32540 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
32550 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20  ROM t1 GROUP BY 
32560 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78  y,x ORDER BY y,x
32570 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28  ;   -- IsSorted(
32580 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  )==0.*/.int sqli
32590 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
325a0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
325b0 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  fo){.  assert( p
325c0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
325d0 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
325e0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
325f0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
32600 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59  s & WHERE_SORTBY
32610 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72  GROUP );.  retur
32620 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  n pWInfo->sorted
32630 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52  ;.}..#ifdef WHER
32640 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
32650 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20  * For debugging 
32660 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61  use only: */.sta
32670 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
32680 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68  wherePathName(Wh
32690 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
326a0 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65  int nLoop, Where
326b0 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20  Loop *pLast){.  
326c0 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d  static char zNam
326d0 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  e[65];.  int i;.
326e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f    for(i=0; i<nLo
326f0 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b  op; i++){ zName[
32700 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  i] = pPath->aLoo
32710 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69  p[i]->cId; }.  i
32720 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65  f( pLast ) zName
32730 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63  [i++] = pLast->c
32740 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d  Id;.  zName[i] =
32750 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61   0;.  return zNa
32760 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
32770 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
32780 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e  ost of sorting n
32790 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69  Row rows, assumi
327a0 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65 79 73  ng that the keys
327b0 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72   have .** nOrder
327c0 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  by columns and t
327d0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 6e 53  hat the first nS
327e0 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  orted columns ar
327f0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20  e already in.** 
32800 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
32810 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72   LogEst whereSor
32820 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72  tingCost(.  Wher
32830 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20  eInfo *pWInfo,. 
32840 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20   LogEst nRow,.  
32850 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  int nOrderBy,.  
32860 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20  int nSorted.){. 
32870 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69   /* TUNING: Esti
32880 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20  mated cost of a 
32890 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f  full external so
328a0 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a  rt, where N is .
328b0 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
328c0 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20  of rows to sort 
328d0 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
328e0 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
328f0 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20  * log(N))..  ** 
32900 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  .  ** Or, if the
32910 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65   order-by clause
32920 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75 74   has X terms but
32930 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59   only the last Y
32940 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65   .  ** terms are
32950 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74   out of order, t
32960 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e  hen block-sortin
32970 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68  g will reduce th
32980 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20  e .  ** sorting 
32990 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  cost to:.  **.  
329a0 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
329b0 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a   * N * log(N)) *
329c0 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a   (Y/X).  **.  **
329d0 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20   The (Y/X) term 
329e0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
329f0 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61  sing stack varia
32a00 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20  ble rScale.  ** 
32a10 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67  below.  */.  Log
32a20 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72  Est rScale, rSor
32a30 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28  tCost;.  assert(
32a40 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36   nOrderBy>0 && 6
32a50 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
32a60 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c  (100) );.  rScal
32a70 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  e = sqlite3LogEs
32a80 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72  t((nOrderBy-nSor
32a90 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42  ted)*100/nOrderB
32aa0 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74  y) - 66;.  rSort
32ab0 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73  Cost = nRow + es
32ac0 74 4c 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53 63  tLog(nRow) + rSc
32ad0 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20  ale + 16;..  /* 
32ae0 54 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74  TUNING: The cost
32af0 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
32b00 20 44 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20   DISTINCT using 
32b10 61 20 42 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a  a B-TREE is.  **
32b20 20 73 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74   similar but wit
32b30 68 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74  h a larger const
32b40 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f  ant of proportio
32b50 6e 61 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75  nality. .  ** Mu
32b60 6c 74 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64  ltiply by an add
32b70 69 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f  itional factor o
32b80 66 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28  f 3.0.  */.  if(
32b90 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
32ba0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
32bb0 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
32bc0 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36   rSortCost += 16
32bd0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
32be0 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a  rSortCost;.}../*
32bf0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69  .** Given the li
32c00 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  st of WhereLoop 
32c10 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66  objects at pWInf
32c20 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20  o->pLoops, this 
32c30 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d  routine.** attem
32c40 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  pts to find the 
32c50 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
32c60 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63   that visits eac
32c70 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f  h WhereLoop.** o
32c80 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20  nce.  This path 
32c90 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69  is then loaded i
32ca0 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e  nto the pWInfo->
32cb0 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64  a[].pWLoop field
32cc0 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20  s..**.** Assume 
32cd0 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e  that the total n
32ce0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
32cf0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  rows that will n
32d00 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eed to be sorted
32d10 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77  .** will be nRow
32d20 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c  Est (in the 10*l
32d30 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69  og2 representati
32d40 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65  on).  Or, ignore
32d50 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74   sorting.** cost
32d60 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e  s if nRowEst==0.
32d70 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
32d80 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
32d90 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
32da0 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
32db0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
32dc0 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
32dd0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
32de0 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
32df0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45  fo *pWInfo, LogE
32e00 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69  st nRowEst){.  i
32e10 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20  nt mxChoice;    
32e20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
32e30 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  mum number of si
32e40 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73  multaneous paths
32e50 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   tracked */.  in
32e60 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t nLoop;        
32e70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32e80 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
32e90 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73  e join */.  Pars
32ea0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
32eb0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
32ec0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
32ed0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
32ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
32ef0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
32f00 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  on */.  int iLoo
32f10 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
32f20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
32f30 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73  r over the terms
32f40 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
32f50 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20    int ii, jj;   
32f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
32f70 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
32f80 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20    int mxI = 0;  
32f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32fa0 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74  ndex of next ent
32fb0 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f  ry to replace */
32fc0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
32fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32fe0 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
32ff0 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
33000 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f  */.  LogEst mxCo
33010 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  st = 0;        /
33020 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
33030 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
33040 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55   */.  LogEst mxU
33050 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20  nsorted = 0;    
33060 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72  /* Maximum unsor
33070 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65  ted cost of a se
33080 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69  t of path */.  i
33090 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
330a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
330b0 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
330c0 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
330d0 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
330e0 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
330f0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
33100 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
33110 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
33120 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
33130 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
33140 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
33150 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
33160 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
33170 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
33180 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
33190 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
331a0 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
331b0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
331c0 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
331d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
331e0 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
331f0 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
33200 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
33210 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
33220 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
33230 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
33240 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
33250 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
33260 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
33270 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
33280 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c  ce memory */.  L
33290 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74  ogEst *aSortCost
332a0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74   = 0;    /* Sort
332b0 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20  ing and partial 
332c0 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f  sorting costs */
332d0 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
332e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
332f0 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
33300 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
33310 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  utine */.  int n
33320 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
33330 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
33340 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
33350 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20   at pSpace */.. 
33360 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
33370 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
33380 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
33390 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
333a0 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
333b0 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
333c0 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
333d0 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
333e0 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
333f0 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
33400 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
33410 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
33420 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
33430 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
33440 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
33450 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
33460 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d  hoice = (nLoop<=
33470 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
33480 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
33490 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
334a0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
334b0 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
334c0 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
334d0 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
334e0 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c  .  (nRowEst=%d)\
334f0 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a  n", nRowEst));..
33500 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20    /* If nRowEst 
33510 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72  is zero and ther
33520 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
33530 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20   clause, ignore 
33540 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a  it. In this.  **
33550 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73   case the purpos
33560 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e of this call i
33570 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  s to estimate th
33580 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
33590 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62   returned.  ** b
335a0 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75  y the overall qu
335b0 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65  ery. Once this e
335c0 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e  stimate has been
335d0 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63   obtained, the c
335e0 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20  aller.  ** will 
335f0 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63  invoke this func
33600 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69  tion a second ti
33610 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20  me, passing the 
33620 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a  estimate as the.
33630 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72    ** nRowEst par
33640 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66  ameter.  */.  if
33650 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
33660 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
33670 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65  ==0 ){.    nOrde
33680 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
33690 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
336a0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
336b0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20  y->nExpr;.  }.. 
336c0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
336d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
336e0 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d  e for aTo, aFrom
336f0 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d   and aSortCost[]
33700 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28   */.  nSpace = (
33710 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68  sizeof(WherePath
33720 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  )+sizeof(WhereLo
33730 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68  op*)*nLoop)*mxCh
33740 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65  oice*2;.  nSpace
33750 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
33760 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20  t) * nOrderBy;. 
33770 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
33780 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
33790 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
337a0 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
337b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
337c0 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50  .  aTo = (WhereP
337d0 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61  ath*)pSpace;.  a
337e0 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f  From = aTo+mxCho
337f0 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46  ice;.  memset(aF
33800 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  rom, 0, sizeof(a
33810 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20  From[0]));.  pX 
33820 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28  = (WhereLoop**)(
33830 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b  aFrom+mxChoice);
33840 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69  .  for(ii=mxChoi
33850 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ce*2, pFrom=aTo;
33860 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72   ii>0; ii--, pFr
33870 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f  om++, pX += nLoo
33880 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61  p){.    pFrom->a
33890 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20  Loop = pX;.  }. 
338a0 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
338b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
338c0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
338d0 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73  clause and it is
338e0 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72   not being ignor
338f0 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a  ed, set up.    *
33900 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
33910 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61  aSortCost[] arra
33920 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20  y. Each element 
33930 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74  of the aSortCost
33940 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73   array.    ** is
33950 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d   either zero - m
33960 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f  eaning it has no
33970 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69  t yet been initi
33980 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a  alized - or the.
33990 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73      ** cost of s
339a0 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72  orting nRowEst r
339b0 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72  ows of data wher
339c0 65 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65  e the first X te
339d0 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  rms of.    ** th
339e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
339f0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
33a00 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20   order, where X 
33a10 69 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20  is the array .  
33a20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a    ** index.  */.
33a30 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20      aSortCost = 
33a40 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20  (LogEst*)pX;.   
33a50 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73   memset(aSortCos
33a60 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67  t, 0, sizeof(Log
33a70 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29  Est) * nOrderBy)
33a80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
33a90 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20  aSortCost==0 || 
33aa0 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
33ab0 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f  =(char*)&aSortCo
33ac0 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a  st[nOrderBy] );.
33ad0 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
33ae0 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost!=0 || &pSpac
33af0 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
33b00 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  *)pX );..  /* Se
33b10 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
33b20 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
33b30 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
33b40 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
33b50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49  ..  **.  ** TUNI
33b60 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74  NG: Do not let t
33b70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65  he number of ite
33b80 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65  rations go above
33b90 20 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73   25.  If the cos
33ba0 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74  t.  ** of comput
33bb0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
33bc0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61   index is not pa
33bd0 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74  id back within t
33be0 68 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a  he first 25.  **
33bf0 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e   rows, then do n
33c00 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d  ot use the autom
33c10 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  atic index. */. 
33c20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
33c30 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75   MIN(pParse->nQu
33c40 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61  eryLoop, 46);  a
33c50 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74  ssert( 46==sqlit
33c60 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a  e3LogEst(25) );.
33c70 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61    nFrom = 1;.  a
33c80 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e  ssert( aFrom[0].
33c90 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a  isOrdered==0 );.
33ca0 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29    if( nOrderBy )
33cb0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f  {.    /* If nLoo
33cc0 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p is zero, then 
33cd0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f  there are no FRO
33ce0 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71  M terms in the q
33cf0 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20  uery. Since.    
33d00 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  ** in this case 
33d10 74 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65  the query may re
33d20 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f  turn a maximum o
33d30 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72  f one row, the r
33d40 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72  esults.    ** ar
33d50 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  e already in the
33d60 20 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72   requested order
33d70 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20  . Set isOrdered 
33d80 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20  to nOrderBy to. 
33d90 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74     ** indicate t
33da0 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f  his. Or, if nLoo
33db0 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
33dc0 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72  n zero, set isOr
33dd0 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  dered to.    ** 
33de0 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
33df0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  hat the result s
33e00 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  et may or may no
33e10 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20  t be ordered, . 
33e20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20     ** depending 
33e30 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64  on the loops add
33e40 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ed to the curren
33e50 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20  t plan.  */.    
33e60 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
33e70 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d  ed = nLoop>0 ? -
33e80 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  1 : nOrderBy;.  
33e90 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
33ea0 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
33eb0 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
33ec0 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
33ed0 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
33ee0 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
33ef0 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
33f00 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
33f10 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
33f20 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
33f30 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
33f40 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
33f50 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
33f60 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
33f70 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
33f80 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
33f90 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
33fa0 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
33fb0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
33fc0 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
33fd0 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
33fe0 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
33ff0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
34000 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
34010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34020 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74     /* Rows visit
34030 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c  ed by (pFrom+pWL
34040 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
34050 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20  LogEst rCost;   
34060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34070 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74    /* Cost of pat
34080 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  h (pFrom+pWLoop)
34090 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45   */.        LogE
340a0 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20  st rUnsorted;   
340b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
340c0 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   Unsorted cost o
340d0 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  f (pFrom+pWLoop)
340e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69   */.        i8 i
340f0 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d  sOrdered = pFrom
34100 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a  ->isOrdered;  /*
34110 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28   isOrdered for (
34120 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
34130 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
34140 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20   maskNew;       
34150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
34160 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65  sk of src visite
34170 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20  d by (..) */.   
34180 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
34190 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  Mask = 0;       
341a0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
341b0 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70  f rev-order loop
341c0 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20  s for (..) */.. 
341d0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
341e0 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
341f0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
34200 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
34210 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
34220 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
34230 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
34240 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
34250 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
34260 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
34270 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
34280 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
34290 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
342a0 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
342b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  */.        rUnso
342c0 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
342d0 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e  gEstAdd(pWLoop->
342e0 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72  rSetup,pWLoop->r
342f0 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Run + pFrom->nRo
34300 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73  w);.        rUns
34310 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
34320 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
34330 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f  ed, pFrom->rUnso
34340 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e  rted);.        n
34350 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
34360 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
34370 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
34380 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
34390 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
343a0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
343b0 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20  if( isOrdered<0 
343c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
343d0 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61  rdered = wherePa
343e0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
343f0 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
34400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34410 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
34420 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
34430 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
34440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34450 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
34460 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a  oop, &revMask);.
34470 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
34480 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
34490 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
344a0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
344b0 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
344c0 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72  ed>=0 && isOrder
344d0 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  ed<nOrderBy ){. 
344e0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f           if( aSo
344f0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
34500 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
34510 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
34520 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65  Ordered] = where
34530 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20  SortingCost(.   
34540 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
34550 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f  nfo, nRowEst, nO
34560 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65  rderBy, isOrdere
34570 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  d.            );
34580 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
34590 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73         rCost = s
345a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
345b0 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74  rUnsorted, aSort
345c0 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29  Cost[isOrdered])
345d0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ;..          WHE
345e0 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20  RETRACE(0x002,. 
345f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d               ("-
34600 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
34610 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65  3d (%d/%d) incre
34620 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f  ases cost %3d to
34630 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20   %-3d\n",.      
34640 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f           aSortCo
34650 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28  st[isOrdered], (
34660 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72  nOrderBy-isOrder
34670 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a  ed), nOrderBy, .
34680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
34690 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29  Unsorted, rCost)
346a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
346b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73  {.          rCos
346c0 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20  t = rUnsorted;. 
346d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
346e0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
346f0 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75  e if pWLoop shou
34700 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ld be added to t
34710 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20  he set of.      
34720 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65    ** mxChoice be
34730 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e  st-so-far paths.
34740 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
34750 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f      ** First loo
34760 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  k for an existin
34770 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73  g path among bes
34780 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20  t-so-far paths. 
34790 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
347a0 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65 20 73  overs the same s
347b0 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
347c0 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f  has the same isO
347d0 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
347e0 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  * setting as the
347f0 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 63 61   current path ca
34800 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20  ndidate..       
34810 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
34820 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e  he term "((pTo->
34830 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65  isOrdered^isOrde
34840 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69  red)&0x80)==0" i
34850 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  s equivalent.   
34860 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d       ** to (pTo-
34870 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  >isOrdered==(-1)
34880 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28  )==(isOrdered==(
34890 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20 72 61  -1))" for the ra
348a0 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  nge.        ** o
348b0 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66  f legal values f
348c0 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31  or isOrdered, -1
348d0 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ..64..        */
348e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  .        for(jj=
348f0 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e  0, pTo=aTo; jj<n
34900 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  To; jj++, pTo++)
34910 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
34920 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d  pTo->maskLoop==m
34930 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20  askNew.         
34940 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72    && ((pTo->isOr
34950 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29  dered^isOrdered)
34960 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20  &0x80)==0.      
34970 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
34980 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d     testcase( jj=
34990 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20  =nTo-1 );.      
349a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
349b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
349c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
349d0 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20  j>=nTo ){.      
349e0 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74      /* None of t
349f0 68 65 20 65 78 69 73 74 69 6e 67 20 62 65 73 74  he existing best
34a00 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61  -so-far paths ma
34a10 74 63 68 20 74 68 65 20 63 61 6e 64 69 64 61 74  tch the candidat
34a20 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
34a30 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
34a40 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  e.           && 
34a50 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c  (rCost>mxCost ||
34a60 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20   (rCost==mxCost 
34a70 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78  && rUnsorted>=mx
34a80 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20  Unsorted)).     
34a90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34aa0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
34ab0 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69 73 20  nt candidate is 
34ac0 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20 61  no better than a
34ad0 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69  ny of the mxChoi
34ae0 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ce.            *
34af0 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c  * paths currentl
34b00 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f  y in the best-so
34b10 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f  -far buffer.  So
34b20 20 64 69 73 63 61 72 64 0a 20 20 20 20 20 20 20   discard.       
34b30 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e       ** this can
34b40 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69  didate as not vi
34b50 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  able. */.#ifdef 
34b60 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
34b70 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
34b80 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
34b90 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
34ba0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
34bb0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
34bc0 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25  Printf("Skip   %
34bd0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
34be0 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
34bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
34c00 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
34c10 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
34c20 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
34c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34c40 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
34c50 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
34c60 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
34c70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
34c80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
34c90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
34ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
34cb0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
34cc0 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nts it means tha
34cd0 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64  t the new candid
34ce0 61 74 65 20 70 61 74 68 0a 20 20 20 20 20 20 20  ate path.       
34cf0 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62     ** needs to b
34d00 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73  e added to the s
34d10 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61  et of best-so-fa
34d20 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20  r paths. */.    
34d30 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78        if( nTo<mx
34d40 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
34d50 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73        /* Increas
34d60 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
34d70 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65  e aTo set by one
34d80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
34d90 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20  jj = nTo++;.    
34da0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34db0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
34dc0 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68  path replaces th
34dd0 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f  e prior worst to
34de0 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f   keep count belo
34df0 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20  w mxChoice */.  
34e00 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d            jj = m
34e10 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xI;.          }.
34e20 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20            pTo = 
34e30 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66  &aTo[jj];.#ifdef
34e40 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
34e50 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
34e60 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
34e70 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
34e80 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
34e90 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
34ea0 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63  ntf("New    %s c
34eb0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
34ec0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
34ed0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
34ee0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
34ef0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
34f00 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
34f10 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
34f20 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
34f30 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
34f40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
34f50 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dif.        }els
34f60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
34f70 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20  Control reaches 
34f80 68 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d  here if best-so-
34f90 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f  far path pTo=aTo
34fa0 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a  [jj] covers the.
34fb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
34fc0 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61  e set of loops a
34fd0 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 20 69  nd has the sam i
34fe0 73 4f 72 64 65 72 65 64 20 73 65 74 74 69 6e 67  sOrdered setting
34ff0 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
35000 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70    ** candidate p
35010 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ath.  Check to s
35020 65 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64  ee if the candid
35030 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61  ate should repla
35040 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ce.          ** 
35050 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61  pTo or if the ca
35060 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62  ndidate should b
35070 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20  e skipped */.   
35080 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
35090 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28  rCost<rCost || (
350a0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
350b0 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
350c0 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20  nOut) ){.#ifdef 
350d0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
350e0 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
350f0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
35100 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
35110 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
35120 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
35130 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
35140 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20            "Skip 
35150 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
35160 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
35170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35180 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
35190 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
351a0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
351b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
351c0 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
351d0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
351e0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
351f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
35200 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73  bugPrintf("   vs
35210 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64   %s cost=%-3d,%d
35220 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
35230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35240 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
35250 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
35260 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
35270 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
35280 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
35290 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f  Ordered>=0 ? pTo
352a0 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ->isOrdered+'0' 
352b0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
352c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
352d0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63           /* Disc
352e0 61 72 64 20 74 68 65 20 63 61 6e 64 69 64 61 74  ard the candidat
352f0 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74  e path from furt
35300 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  her consideratio
35310 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
35320 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
35330 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a  rCost==rCost );.
35340 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
35350 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
35360 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
35370 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
35380 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20  ==rCost+1 );.   
35390 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f         /* Contro
353a0 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69  l reaches here i
353b0 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  f the candidate 
353c0 70 61 74 68 20 69 73 20 62 65 74 74 65 72 20 74  path is better t
353d0 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  han the.        
353e0 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20    ** pTo path.  
353f0 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68  Replace pTo with
35400 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20   the candidate. 
35410 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
35420 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
35430 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
35440 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
35450 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
35460 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35470 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
35480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
35490 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d  pdate %s cost=%-
354a0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
354b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
354c0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
354d0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
354e0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
354f0 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
35500 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
35510 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
35520 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
35530 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
35540 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25  gPrintf("  was %
35550 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
35560 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
35570 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
35580 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
35590 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
355a0 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
355b0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
355c0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
355d0 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
355e0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
355f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
35600 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
35610 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f          /* pWLoo
35620 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20  p is a winner.  
35630 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65  Add it to the se
35640 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72  t of best so far
35650 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d   */.        pTo-
35660 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f  >maskLoop = pFro
35670 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
35680 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
35690 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76          pTo->rev
356a0 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Loop = revMask;.
356b0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f          pTo->nRo
356c0 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20  w = nOut;.      
356d0 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72    pTo->rCost = r
356e0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54  Cost;.        pT
356f0 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72  o->rUnsorted = r
35700 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
35710 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
35720 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20   = isOrdered;.  
35730 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f        memcpy(pTo
35740 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e  ->aLoop, pFrom->
35750 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68  aLoop, sizeof(Wh
35760 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29  ereLoop*)*iLoop)
35770 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61  ;.        pTo->a
35780 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57  Loop[iLoop] = pW
35790 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
357a0 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
357b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49  ){.          mxI
357c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
357d0 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e  mxCost = aTo[0].
357e0 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
357f0 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54   mxUnsorted = aT
35800 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20  o[0].nRow;.     
35810 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70       for(jj=1, p
35820 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d  To=&aTo[1]; jj<m
35830 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70  xChoice; jj++, p
35840 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
35850 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
35860 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20  t>mxCost .      
35870 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e         || (pTo->
35880 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
35890 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e   pTo->rUnsorted>
358a0 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20  mxUnsorted) .   
358b0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
358c0 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74            mxCost
358d0 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20   = pTo->rCost;. 
358e0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 55               mxU
358f0 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72  nsorted = pTo->r
35900 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
35910 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a          mxI = jj
35920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
35930 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35940 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35950 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
35960 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20  ETRACE_ENABLED  
35970 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66  /* >=2 */.    if
35980 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
35990 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20  ace & 0x02 ){.  
359a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
359b0 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74  Printf("---- aft
359c0 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d  er round %d ----
359d0 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20  \n", iLoop);.   
359e0 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f     for(ii=0, pTo
359f0 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69  =aTo; ii<nTo; ii
35a00 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
35a10 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
35a20 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74  Printf(" %s cost
35a30 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20  =%-3d nrow=%-3d 
35a40 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
35a50 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
35a60 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
35a70 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
35a80 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
35a90 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
35aa0 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f  rdered>=0 ? (pTo
35ab0 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29  ->isOrdered+'0')
35ac0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
35ad0 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65   if( pTo->isOrde
35ae0 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  red>0 ){.       
35af0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
35b00 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c  rintf(" rev=0x%l
35b10 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c  lx\n", pTo->revL
35b20 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oop);.        }e
35b30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
35b40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
35b50 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  f("\n");.       
35b60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
35b70 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
35b80 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f  Swap the roles o
35b90 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20  f aFrom and aTo 
35ba0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e  for the next gen
35bb0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  eration */.    p
35bc0 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20  From = aTo;.    
35bd0 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20  aTo = aFrom;.   
35be0 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a   aFrom = pFrom;.
35bf0 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b      nFrom = nTo;
35c00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f  .  }..  if( nFro
35c10 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
35c20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
35c30 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f  se, "no query so
35c40 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71  lution");.    sq
35c50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
35c60 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74  pSpace);.    ret
35c70 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
35c80 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
35c90 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
35ca0 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20  st path.  pFrom 
35cb0 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
35cc0 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61  nting to that pa
35cd0 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20  th */.  pFrom = 
35ce0 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d  aFrom;.  for(ii=
35cf0 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
35d00 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
35d10 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
35d20 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
35d30 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
35d40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49   }.  assert( pWI
35d50 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
35d60 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
35d70 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
35d80 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
35d90 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
35da0 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
35db0 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
35dc0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
35dd0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
35de0 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
35df0 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
35e00 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
35e10 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
35e20 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
35e30 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
35e40 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
35e50 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
35e60 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
35e70 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
35e80 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
35e90 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
35ea0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
35eb0 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e  )!=0.   && (pWIn
35ec0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
35ed0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
35ee0 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e  Y)==0.   && pWIn
35ef0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
35f00 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
35f10 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74  OP.   && nRowEst
35f20 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  .  ){.    Bitmas
35f30 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69  k notUsed;.    i
35f40 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
35f50 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
35f60 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
35f70 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46  ->pResultSet, pF
35f80 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
35f90 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
35fa0 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
35fb0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
35fc0 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
35fd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70  );.    if( rc==p
35fe0 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
35ff0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
36000 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
36010 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
36020 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
36030 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
36040 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
36050 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  {.    if( pWInfo
36060 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
36070 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
36080 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  ){.      if( pFr
36090 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70  om->isOrdered==p
360a0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
360b0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
360c0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
360d0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
360e0 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
360f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
36100 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
36110 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69  OBSat = pFrom->i
36120 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20  sOrdered;.      
36130 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  if( pWInfo->nOBS
36140 61 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  at<0 ) pWInfo->n
36150 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20  OBSat = 0;.     
36160 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
36170 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
36180 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
36190 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
361a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52  lags & WHERE_SOR
361b0 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20  TBYGROUP).      
361c0 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42    && pWInfo->nOB
361d0 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  Sat==pWInfo->pOr
361e0 64 65 72 42 79 2d 3e 6e 45 78 70 72 0a 20 20 20  derBy->nExpr.   
361f0 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
36200 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20  k revMask = 0;. 
36210 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20       int nOrder 
36220 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
36230 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
36240 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  fo, pWInfo->pOrd
36250 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
36260 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70   pFrom, 0, nLoop
36270 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
36280 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d  [nLoop-1], &revM
36290 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ask.      );.   
362a0 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
362b0 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a  o->sorted==0 );.
362c0 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72        if( nOrder
362d0 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
362e0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
362f0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72       pWInfo->sor
36300 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ted = 1;.       
36310 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
36320 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20   = revMask;.    
36330 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
36340 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
36350 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b  t = pFrom->nRow;
36360 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70  ..  /* Free temp
36370 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64  orary memory and
36380 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20   return success 
36390 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
363a0 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
363b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
363c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73  OK;.}../*.** Mos
363d0 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e  t queries use on
363e0 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
363f0 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20  e (they are not 
36400 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a  joins) and have.
36410 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e  ** simple == con
36420 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74  straints against
36430 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e   indexed fields.
36440 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
36450 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c  ttempts.** to pl
36460 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20  an those simple 
36470 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68  cases using much
36480 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74   less ceremony t
36490 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72  han the.** gener
364a0 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
364b0 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68   planner, and th
364c0 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74  ereby yield fast
364d0 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  er sqlite3_prepa
364e0 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f  re().** times fo
364f0 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
36500 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
36510 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63  non-zero on succ
36520 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65  ess, if this que
36530 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65  ry can be handle
36540 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d  d by this.** no-
36550 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61  frills query pla
36560 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65  nner.  Return ze
36570 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ro if this query
36580 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67   needs the .** g
36590 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
365a0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f  uery planner..*/
365b0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
365c0 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c  eShortCut(WhereL
365d0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
365e0 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
365f0 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74  fo *pWInfo;.  st
36600 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
36610 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72  m *pItem;.  Wher
36620 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
36630 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
36640 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
36650 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72  Loop;.  int iCur
36660 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62  ;.  int j;.  Tab
36670 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
36680 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57  x *pIdx;.  .  pW
36690 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
366a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  >pWInfo;.  if( p
366b0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
366c0 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
366d0 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30  TABLE ) return 0
366e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
366f0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
36700 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d  rc>=1 );.  pItem
36710 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
36720 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d  ist->a;.  pTab =
36730 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
36740 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
36750 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
36760 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e    if( pItem->zIn
36770 64 65 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  dex ) return 0;.
36780 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
36790 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d  iCursor;.  pWC =
367a0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
367b0 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65   pLoop = pBuilde
367c0 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70  r->pNew;.  pLoop
367d0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ->wsFlags = 0;. 
367e0 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20   pLoop->nSkip = 
367f0 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  0;.  pTerm = fin
36800 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
36810 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30   -1, 0, WO_EQ, 0
36820 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
36830 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  {.    pLoop->wsF
36840 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
36850 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b  UMN_EQ|WHERE_IPK
36860 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20  |WHERE_ONEROW;. 
36870 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
36880 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
36890 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
368a0 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75   1;.    pLoop->u
368b0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
368c0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
368d0 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c  ost of a rowid l
368e0 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20  ookup is 10 */. 
368f0 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
36900 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c   33;  /* 33==sql
36910 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a  ite3LogEst(10) *
36920 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
36930 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
36940 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
36950 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
36960 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
36970 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d  op->aLTermSpace=
36980 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29  =pLoop->aLTerm )
36990 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 55  ;.      if( !IsU
369a0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
369b0 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
369c0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
369d0 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64  0 .       || pId
369e0 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79  x->nKeyCol>Array
369f0 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
36a00 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20 20  rmSpace) .      
36a10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36a20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
36a30 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
36a40 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
36a50 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
36a60 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f  iCur, pIdx->aiCo
36a70 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45  lumn[j], 0, WO_E
36a80 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  Q, pIdx);.      
36a90 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
36aa0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
36ab0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
36ac0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
36ad0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70  }.      if( j!=p
36ae0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  Idx->nKeyCol ) c
36af0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
36b00 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
36b10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
36b20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45  WHERE_ONEROW|WHE
36b30 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
36b40 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f    if( pIdx->isCo
36b50 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d  vering || (pItem
36b60 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
36b70 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78  umnsInIndex(pIdx
36b80 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
36b90 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
36ba0 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
36bb0 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
36bc0 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
36bd0 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
36be0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a  >u.btree.nEq = j
36bf0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
36c00 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
36c10 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54  pIdx;.      /* T
36c20 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
36c30 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f   unique index lo
36c40 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20  okup is 15 */.  
36c50 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
36c60 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71  = 39;  /* 39==sq
36c70 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20  lite3LogEst(15) 
36c80 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
36c90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
36ca0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29  pLoop->wsFlags )
36cb0 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  {.    pLoop->nOu
36cc0 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20  t = (LogEst)1;. 
36cd0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
36ce0 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a  pWLoop = pLoop;.
36cf0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53      pLoop->maskS
36d00 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
36d10 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
36d20 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e   iCur);.    pWIn
36d30 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72  fo->a[0].iTabCur
36d40 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49   = iCur;.    pWI
36d50 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31  nfo->nRowOut = 1
36d60 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
36d70 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ->pOrderBy ) pWI
36d80 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70  nfo->nOBSat =  p
36d90 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
36da0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
36db0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
36dc0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
36dd0 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
36de0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
36df0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
36e00 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
36e10 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
36e20 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70  _DEBUG.    pLoop
36e30 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e  ->cId = '0';.#en
36e40 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31  dif.    return 1
36e50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
36e60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
36e70 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
36e80 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
36e90 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
36ea0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
36eb0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
36ec0 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
36ed0 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
36ee0 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
36ef0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
36f00 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
36f10 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
36f20 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
36f30 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
36f40 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
36f50 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
36f60 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
36f70 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
36f80 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
36f90 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
36fa0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
36fb0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
36fc0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
36fd0 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
36fe0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
36ff0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
37000 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
37010 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
37020 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
37030 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
37040 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
37050 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
37060 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
37070 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
37080 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
37090 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
370a0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
370b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
370c0 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
370d0 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
370e0 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
370f0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
37100 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
37110 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
37120 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
37130 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
37140 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
37150 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
37160 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
37170 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
37180 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
37190 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
371a0 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
371b0 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
371c0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
371d0 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
371e0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
371f0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
37200 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
37210 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
37220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37230 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
37240 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
37250 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
37260 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
37270 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
37280 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
37290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372a0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
372b0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
372c0 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
372d0 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
372e0 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
372f0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
37300 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
37310 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
37320 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
37330 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
37340 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
37350 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
37360 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
37370 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
37380 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
37390 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
373a0 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
373b0 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
373c0 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
373d0 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
373e0 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
373f0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
37400 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
37410 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
37420 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
37430 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
37440 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
37450 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
37460 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
37470 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
37480 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
37490 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
374a0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
374b0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
374c0 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
374d0 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
374e0 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
374f0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
37500 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
37510 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
37520 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
37530 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
37540 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
37550 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
37560 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
37570 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
37580 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
37590 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
375a0 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
375b0 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
375c0 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
375d0 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
375e0 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
375f0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
37600 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
37610 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
37620 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
37630 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
37640 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
37650 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
37660 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
37670 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
37680 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
37690 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
376a0 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
376b0 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
376c0 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
376d0 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
376e0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
376f0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
37700 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
37710 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
37720 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
37730 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
37740 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
37750 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
37760 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
37770 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
37780 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
37790 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
377a0 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
377b0 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
377c0 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
377d0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
377e0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
377f0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
37800 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
37810 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
37820 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
37830 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
37840 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
37850 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
37860 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
37870 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
37880 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
37890 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
378a0 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
378b0 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
378c0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
378d0 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
378e0 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
378f0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
37900 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
37910 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
37920 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
37930 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
37940 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
37950 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
37960 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
37970 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
37980 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
37990 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
379a0 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
379b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
379c0 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
379d0 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
379e0 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
379f0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
37a00 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
37a10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
37a20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
37a30 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
37a40 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
37a50 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
37a60 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
37a70 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
37a80 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
37a90 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
37aa0 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
37ab0 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
37ac0 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
37ad0 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  G.**.** pOrderBy
37ae0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
37af0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
37b00 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f  ause (or the GRO
37b10 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  UP BY clause.** 
37b20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f  if the WHERE_GRO
37b30 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74  UPBY flag is set
37b40 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20   in wctrlFlags) 
37b50 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
37b60 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72  ement.** if ther
37b70 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
37b80 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
37b90 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
37ba0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
37bb0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
37bc0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
37bd0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
37be0 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
37bf0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ULL..**.** The i
37c00 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72  IdxCur parameter
37c10 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
37c20 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
37c30 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45  x.  If .** WHERE
37c40 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69  _ONETABLE_ONLY i
37c50 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20 69  s set, iIdxCur i
37c60 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
37c70 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ber of an index.
37c80 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52  ** to use for OR
37c90 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
37ca0 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20 63  ng.  The WHERE c
37cb0 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65  lause should use
37cc0 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69   this.** specifi
37cd0 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48  c cursor.  If WH
37ce0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
37cf0 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e  RED is set, then
37d00 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74   iIdxCur is.** t
37d10 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
37d20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63  in an array of c
37d30 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69  ursors for all i
37d40 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75 72  ndices.  iIdxCur
37d50 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73   should.** be us
37d60 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
37d70 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 75  e appropriate cu
37d80 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f  rsor depending o
37d90 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69 73  n which index is
37da0 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65  .** used..*/.Whe
37db0 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
37dc0 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
37dd0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
37de0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
37df0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
37e00 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
37e10 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
37e20 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
37e30 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
37e40 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
37e50 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
37e60 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
37e70 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
37e80 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
37e90 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
37ea0 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
37eb0 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
37ec0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65  .  ExprList *pRe
37ed0 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75  sultSet, /* Resu
37ee0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75  lt set of the qu
37ef0 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ery */.  u16 wct
37f00 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
37f10 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
37f20 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
37f30 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
37f40 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  h */.  int iIdxC
37f50 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur           /* 
37f60 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  If WHERE_ONETABL
37f70 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69  E_ONLY is set, i
37f80 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
37f90 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  er */.){.  int n
37fa0 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
37fb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
37fc0 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
37fd0 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
37fe0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
37ff0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
38000 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
38010 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
38020 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
38030 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
38040 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
38050 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
38060 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
38070 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
38080 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
38090 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
380a0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
380b0 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
380c0 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
380d0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
380e0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
380f0 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
38100 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
38110 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54  r sWLB;     /* T
38120 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69  he WhereLoop bui
38130 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d  lder */.  WhereM
38140 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
38150 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  ;    /* The expr
38160 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
38170 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
38180 2a 70 4c 65 76 6