/ Hex Artifact Content
Login

Artifact fd4b525cd5ab652cea2fbc71ac15c975271ca461:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
2c90: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
2ca0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
2cb0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
2cc0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
2cd0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
2ce0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
2cf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d00: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
2d10: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
2d20: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
2d30: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
2d40: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
2d50: 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65 6e  t/right preceden
2d60: 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e  ce rules come in
2d70: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74  to play when det
2d80: 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ermining the.** 
2d90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2da0: 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45  ce, then COLLATE
2db0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 61   operators are a
2dc0: 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72  djusted to ensur
2dd0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  e.** that the co
2de0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2df0: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2e00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e10: 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "Y collate NO
2e20: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
2e30: 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63 61  es "X op Y" beca
2e40: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
2e50: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
2e60: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
2e70: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
2e80: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
2e90: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2ea0: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
2eb0: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
2ec0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
2ed0: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
2ee0: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
2ef0: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
2f00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
2f10: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
2f20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2f30: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
2f40: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
2f50: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2f60: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
2f70: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
2f80: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
2f90: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2fa0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
2fb0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2fc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
2fd0: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
2fe0: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
2ff0: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
3000: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
3010: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3020: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
3030: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
3040: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
3050: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
3060: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3070: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
3080: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
3090: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
30a0: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
30b0: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
30c0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
30d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
30e0: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
3100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3110: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
3120: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
3130: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
3140: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
3150: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
3160: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
3170: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
3180: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
3190: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
31a0: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
31b0: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
31c0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
31d0: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
31e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
31f0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
3200: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3210: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
3220: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3230: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3240: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3250: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3260: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3270: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
3280: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3290: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
32a0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
32b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32c0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
32d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
32e0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
32f0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3300: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3310: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3320: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3340: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3350: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3360: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3370: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
3380: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
3390: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
33a0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
33b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
33c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
33d0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
33e0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
33f0: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3400: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3410: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3420: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3430: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3440: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3450: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3460: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
3470: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
3480: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
3490: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34a0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34b0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34c0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
34d0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34e0: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
34f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3500: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3510: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3520: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3530: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3540: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3550: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3560: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
3570: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3580: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
3590: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35a0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35b0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35c0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
35d0: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
35e0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
35f0: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3600: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3610: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3620: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3630: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3640: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3650: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3660: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
3670: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
3680: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
3690: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36a0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36b0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
36d0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
36e0: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
36f0: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3700: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3710: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3720: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3740: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3750: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3760: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
3770: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
3780: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
3790: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37a0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37c0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
37d0: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
37e0: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
37f0: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3800: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3810: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3820: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3830: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3840: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3850: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3860: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
3870: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
3880: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
3890: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38a0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38b0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38c0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
38d0: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
38e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
38f0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3900: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3910: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3920: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3930: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3940: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3950: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3960: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3970: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
3990: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39a0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39b0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
39d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
39e0: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
39f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a10: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a20: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a40: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a50: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a60: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3a70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3a80: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3a90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ab0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3ac0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b40: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b50: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b60: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3b70: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3b80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3b90: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3ba0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3bd0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3be0: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3bf0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c00: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c10: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c30: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c50: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c60: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c70: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3c90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3ca0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3cb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3cc0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3cd0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3ce0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3cf0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d00: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d10: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d20: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d30: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d40: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3d70: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3d90: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3da0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3db0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3df0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e10: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e20: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e30: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e40: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e60: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3e70: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3e80: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3e90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3ed0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3ee0: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3ef0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f10: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f20: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f30: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f40: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f50: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f60: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3f70: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3f80: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fc0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
3fd0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
3fe0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
3ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4010: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4020: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4030: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4040: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4050: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4060: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
4070: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
4080: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
4090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40c0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
40d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
40e0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
40f0: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4100: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4110: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4120: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4130: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4140: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4150: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4160: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
4170: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4180: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
4190: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41a0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41b0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41c0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
41d0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
41e0: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
41f0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4200: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4210: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4220: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4230: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4240: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4250: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4260: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
4270: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
4280: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
4290: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42a0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42b0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42c0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
42d0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
42e0: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
42f0: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4300: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4310: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4320: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4330: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4340: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4350: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4360: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4370: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
4380: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
4390: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43a0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43b0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43c0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
43d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
43e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
43f0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4400: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4410: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4430: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4440: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4460: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
4470: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
4490: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44a0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44b0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
44d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
44e0: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
44f0: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4500: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4510: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4520: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4530: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4540: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4550: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4560: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
4570: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
4580: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
4590: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45a0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45c0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
45d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
45e0: 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  ER(j>=pIdx->nKey
45f0: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Col) ) return 0;
4600: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e  .    }.    pScan
4610: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
4620: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
4630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61   }else{.    pSca
4640: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
4650: 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e     pScan->zCollN
4660: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ame = 0;.  }.  p
4670: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f  Scan->opMask = o
4680: 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e  pMask;.  pScan->
4690: 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  k = 0;.  pScan->
46a0: 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72  aEquiv[0] = iCur
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  ;.  pScan->aEqui
46c0: 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  v[1] = iColumn;.
46d0: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20    pScan->nEquiv 
46e0: 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45  = 2;.  pScan->iE
46f0: 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75  quiv = 2;.  retu
4700: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
4710: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
4720: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
4730: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
4740: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
4750: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4760: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
4770: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
4780: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
4790: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
47a0: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
47b0: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
47c0: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
47d0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
47e0: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
47f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
4800: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
4810: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
4820: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
4830: 54 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65  The term returne
4840: 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78  d might by Y=<ex
4850: 70 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20  pr> if there is 
4860: 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69  another constrai
4870: 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  nt in.** the WHE
4880: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73  RE clause that s
4890: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d  pecifies that X=
48a0: 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e  Y.  Any such con
48b0: 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65  straints will be
48c0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62  .** identified b
48d0: 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62  y the WO_EQUIV b
48e0: 69 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d  it in the pTerm-
48f0: 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64  >eOperator field
4900: 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76  .  The.** aEquiv
4910: 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58  [] array holds X
4920: 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75   and all its equ
4930: 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65  ivalents, with e
4940: 61 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ach SQL variable
4950: 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77  .** taking up tw
4960: 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  o slots in aEqui
4970: 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20  v[].  The first 
4980: 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20  slot is for the 
4990: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a  cursor number.**
49a0: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
49b0: 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  is for the colum
49c0: 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65  n number.  There
49d0: 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e   are 22 slots in
49e0: 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20   aEquiv[].** so 
49f0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
4a00: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
4a10: 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72  s up to 10 other
4a20: 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75   equivalent valu
4a30: 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73  es..** Hence a s
4a40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
4a50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
4a60: 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32  f X=A1 and A1=A2
4a70: 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e   and A2=A3.** an
4a80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
4a90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
4aa0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
4ab0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
4ac0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
4ad0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
4ae0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
4af0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
4b00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
4b10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
4b20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
4b30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
4b40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
4b50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
4b60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
4b70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
4b80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
4b90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
4ba0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
4bb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
4bc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
4bd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
4be0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
4bf0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
4c00: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
4c10: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
4c20: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
4c30: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
4c40: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
4c50: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74   WO_EQUIV..*/.st
4c60: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
4c70: 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  findTerm(.  Wher
4c80: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4c90: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
4ca0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
4cb0: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
4cc0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
4cd0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
4ce0: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
4cf0: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
4d00: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
4d10: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
4d20: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
4d30: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
4d40: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
4d50: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
4d60: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
4d70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
4d80: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
4d90: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
4da0: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
4db0: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
4dc0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
4dd0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
4de0: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
4df0: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
4e00: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
4e10: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
4e20: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
4e30: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
4e40: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
4e50: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
4e60: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
4e70: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
4e80: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
4e90: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
4eb0: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
4ec0: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
4ed0: 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b  tor&WO_EQ)!=0 ){
4ee0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4ef0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
4f00: 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20   if( pResult==0 
4f10: 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20  ) pResult = p;. 
4f20: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65     }.    p = whe
4f30: 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
4f40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4f50: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46  pResult;.}../* F
4f60: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
4f70: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
4f80: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
4f90: 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  ist*, WhereClaus
4fa0: 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  e*, int);../*.**
4fb0: 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a   Call exprAnalyz
4fc0: 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69  e on all terms i
4fd0: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
4fe0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .  .*/.static vo
4ff0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
5000: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
5010: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
5020: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
5030: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
5040: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
5050: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
5060: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
5070: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
5080: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
5090: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
50a0: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
50b0: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
50c0: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
50d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
50e0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
50f0: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
5100: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
5110: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
5120: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
5130: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
5140: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
5150: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
5160: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
5170: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5180: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
5190: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
51a0: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
51b0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
51c0: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
51d0: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
51e0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
51f0: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
5200: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
5210: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
5220: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
5230: 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20  OrGlob(.  Parse 
5240: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
5250: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5260: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5270: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
5280: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
5290: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
52a0: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
52b0: 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e  Prefix,  /* Poin
52c0: 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47  ter to TK_STRING
52d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
52e0: 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20   pattern prefix 
52f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d  */.  int *pisCom
5300: 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69  plete, /* True i
5310: 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63  f the only wildc
5320: 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20  ard is % in the 
5330: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a  last character *
5340: 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65  /.  int *pnoCase
5350: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5360: 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71   uppercase is eq
5370: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
5380: 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rcase */.){.  co
5390: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
53b0: 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b  ng on RHS of LIK
53c0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
53d0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
53e0: 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69  Left;      /* Ri
53f0: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a  ght and left siz
5400: 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  e of LIKE operat
5410: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  or */.  ExprList
5420: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
5430: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70     /* List of op
5440: 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49  erands to the LI
5450: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
5460: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
5470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5480: 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ne character in 
5490: 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  z[] */.  int cnt
54a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
54c0: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
54d0: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
54e0: 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  */.  char wc[3];
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72  /* Wildcard char
5510: 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  acters */.  sqli
5520: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5530: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
5540: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
5550: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5560: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pVal = 0;.  in
5570: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
5580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
5590: 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a  de of pRight */.
55a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
55b0: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
55c0: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
55d0: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
55e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  urn 0;.  }.#ifde
55f0: 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a  f SQLITE_EBCDIC.
5600: 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29    if( *pnoCase )
5610: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
5620: 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  f.  pList = pExp
5630: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c  r->x.pList;.  pL
5640: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
5650: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
5660: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
5670: 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  UMN .   || sqlit
5680: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
5690: 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46  Left)!=SQLITE_AF
56a0: 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73  F_TEXT .   || Is
56b0: 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70  Virtual(pLeft->p
56c0: 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  Tab).  ){.    /*
56d0: 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39   IMP: R-02065-49
56e0: 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  465 The left-han
56f0: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49  d side of the LI
5700: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
5710: 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  tor must.    ** 
5720: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
5730: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
5740: 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e   with TEXT affin
5750: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
5760: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
5770: 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  rt( pLeft->iColu
5780: 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42  mn!=(-1) ); /* B
5790: 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72  ecause IPK never
57a0: 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f   has AFF_TEXT */
57b0: 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c  ..  pRight = sql
57c0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
57d0: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ate(pList->a[0].
57e0: 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70  pExpr);.  op = p
57f0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
5800: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
5810: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52   ){.    Vdbe *pR
5820: 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73  eprepare = pPars
5830: 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20  e->pReprepare;. 
5840: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52     int iCol = pR
5850: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  ight->iColumn;. 
5860: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
5870: 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
5880: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
5890: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
58a0: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70  NONE);.    if( p
58b0: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
58c0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
58d0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
58e0: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
58f0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5900: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
5910: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5920: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
5930: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
5940: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
5950: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
5960: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
5970: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
5980: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5990: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
59a0: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
59b0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
59c0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
59d0: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
59e0: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
59f0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
5a00: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
5a10: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
5a20: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
5a30: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
5a40: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
5a50: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
5a60: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
5a70: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
5a80: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
5a90: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
5aa0: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
5ab0: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
5ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
5ad0: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
5ae0: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
5af0: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
5b00: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
5b10: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
5b20: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
5b30: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
5b40: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
5b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5b60: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
5b70: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
5b80: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
5b90: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
5ba0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
5bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
5bc0: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
5bd0: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
5be0: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
5bf0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
5c00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
5c10: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
5c20: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
5c30: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
5c40: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
5c50: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
5c60: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
5c70: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
5c80: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
5c90: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
5ca0: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
5cb0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
5cc0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
5cd0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
5ce0: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
5cf0: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround th
5d00: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
5d10: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
5d20: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
5d30: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
5d40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5d50: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5d60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5d70: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
5d80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5da0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
5db0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
5dc0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
5dd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
5de0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5df0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5e00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5e10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5e20: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
5e30: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
5e40: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
5e50: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
5e60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5e70: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5e80: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
5e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5ea0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5eb0: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
5ec0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5ed0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5ee0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
5ef0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
5f00: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
5f10: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
5f20: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
5f30: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
5f40: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
5f50: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
5f60: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
5f70: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
5f80: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
5f90: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
5fa0: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
5fb0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
5fc0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
5fd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
5fe0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5ff0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
6000: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
6010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6020: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
6030: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
6040: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
6050: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6060: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
6070: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
6080: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
60a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
60b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
60c0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
60d0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
60e0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
60f0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
6100: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
6110: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
6120: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
6130: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
6140: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
6150: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
6160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6170: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
6180: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
6190: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
61a0: 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65  ){.  if( pDerive
61b0: 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65  d ){.    pDerive
61c0: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
61d0: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
61e0: 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72  omJoin;.    pDer
61f0: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6200: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6210: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6220: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
6230: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6240: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
6250: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6260: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6270: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
6280: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
6290: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
62a0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
62b0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
62c0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
62d0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
62e0: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
62f0: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
6300: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
6340: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
6350: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
6360: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
6370: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
6380: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
6390: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
63a0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
63b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
63c0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
63d0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
63e0: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
63f0: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
6400: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
6410: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
6420: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
6430: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
6440: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6450: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
6460: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
6470: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
6480: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
6490: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
64a0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
64b0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
64c0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
64d0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
64e0: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
64f0: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
6500: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
6510: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
6520: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
6530: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
6540: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
6550: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
6560: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
6570: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
6580: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
6590: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
65a0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
65b0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
65c0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
65d0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
65e0: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
65f0: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
6600: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
6610: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
6620: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
6630: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
6640: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
6650: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
6660: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
6670: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6680: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
6690: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
66a0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
66b0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
66c0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
66d0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
66e0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
66f0: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
6700: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
6710: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
6720: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
6730: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
6740: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
6750: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
6760: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
6770: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
6780: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
6790: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
67a0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
67b0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
67c0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
67d0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
67e0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
67f0: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
6800: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6810: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
6820: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
6830: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
6840: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
6850: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
6860: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
6870: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
6880: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6890: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
68a0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
68b0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
68c0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
68d0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
68e0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
68f0: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
6900: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
6910: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
6920: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
6930: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
6940: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
6950: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
6960: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
6970: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
6980: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
6990: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
69a0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
69b0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
69c0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
69d0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
69e0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
69f0: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
6a00: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
6a10: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
6a20: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
6a30: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
6a40: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
6a50: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6a60: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
6a70: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
6a80: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
6a90: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
6aa0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
6ab0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
6ac0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
6ad0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
6ae0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
6af0: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
6b00: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
6b10: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
6b20: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
6b30: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
6b40: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
6b50: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
6b60: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
6b70: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
6b80: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
6b90: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
6ba0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
6bb0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
6bc0: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
6bd0: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
6be0: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
6bf0: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
6c00: 73 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20  statisfies case 
6c10: 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65  1 (such as B) we
6c20: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
6c30: 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a  ptimizer will.**
6c40: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63   always prefer c
6c50: 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61  ase 1, so in tha
6c60: 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e  t case we preten
6c70: 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73  d that case 2 is
6c80: 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65   not.** satisfie
6c90: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68  d..**.** It migh
6ca0: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
6cb0: 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  at multiple tabl
6cc0: 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  es are indexable
6cd0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  .  For example,.
6ce0: 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20  ** (E) above is 
6cf0: 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62  indexable on tab
6d00: 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e  les P, Q, and R.
6d10: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61  .**.** Terms tha
6d20: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
6d30: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
6d40: 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73  for lookup by us
6d50: 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ing.** separate 
6d60: 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20  indices to find 
6d70: 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20  rowids for each 
6d80: 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70  subterm and comp
6d90: 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69  osing.** the uni
6da0: 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73  on of all rowids
6db0: 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20   using a RowSet 
6dc0: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73  object.  This is
6dd0: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22   similar.** to "
6de0: 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20  bitmap indices" 
6df0: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
6e00: 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a  e engines..**.**
6e10: 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a   OTHERWISE:.**.*
6e20: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73  * If neither cas
6e30: 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61  e 1 nor case 2 a
6e40: 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65  pply, then leave
6e50: 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73   the eOperator s
6e60: 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20  et to.** zero.  
6e70: 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  This term is not
6e80: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72   useful for sear
6e90: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
6ea0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  id exprAnalyzeOr
6eb0: 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
6ec0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
6ed0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
6ee0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
6ef0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
6f00: 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c      /* the compl
6f10: 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ete WHERE clause
6f20: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
6f30: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
6f40: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
6f50: 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  OR-term to be an
6f60: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
6f70: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
6f80: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
6f90: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
6fa0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
6fb0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  g context */.  P
6fc0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
6fd0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
6fe0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
6ff0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
7000: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7010: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
7020: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7030: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
7040: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7050: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7060: 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65  Term];    /* The
7070: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
7080: 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  yzed */.  Expr *
7090: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
70a0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
70b0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
70c0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ion of the term 
70d0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7100: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
7110: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7120: 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20  pOrWc;       /* 
7130: 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d  Breakup of pTerm
7140: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
7150: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
7160: 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a  OrTerm;       /*
7170: 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68   A Sub-term with
7180: 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a  in the pOrWc */.
7190: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
71a0: 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41  OrInfo;     /* A
71b0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
71c0: 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ation associated
71d0: 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20   with pTerm */. 
71e0: 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49   Bitmask chngToI
71f0: 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  N;         /* Ta
7200: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
7210: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a  satisfy case 1 *
7220: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
7230: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  xable;        /*
7240: 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   Tables that are
7250: 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69   indexable, sati
7260: 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f  sfying case 2 */
7270: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61  ..  /*.  ** Brea
7280: 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  k the OR clause 
7290: 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74  into its separat
72a0: 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65  e subterms.  The
72b0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20   subterms are.  
72c0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57  ** stored in a W
72d0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
72e0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
72f0: 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65  within the Where
7300: 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65  OrInfo.  ** obje
7310: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
7320: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
7330: 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65  nal OR clause te
7340: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rm..  */.  asser
7350: 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
7360: 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d  gs & (TERM_DYNAM
7370: 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54  IC|TERM_ORINFO|T
7380: 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30  ERM_ANDINFO))==0
7390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
73a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
73b0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  ;.  pTerm->u.pOr
73c0: 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d  Info = pOrInfo =
73d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
73e0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
73f0: 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66  *pOrInfo));.  if
7400: 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72  ( pOrInfo==0 ) r
7410: 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e  eturn;.  pTerm->
7420: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7430: 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20  ORINFO;.  pOrWc 
7440: 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  = &pOrInfo->wc;.
7450: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
7460: 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29  t(pOrWc, pWInfo)
7470: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
7480: 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f  OrWc, pExpr, TK_
7490: 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79  OR);.  exprAnaly
74a0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57  zeAll(pSrc, pOrW
74b0: 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
74c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
74d0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
74e0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29  OrWc->nTerm>=2 )
74f0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d  ;..  /*.  ** Com
7500: 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20  pute the set of 
7510: 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  tables that migh
7520: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20  t satisfy cases 
7530: 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  1 or 2..  */.  i
7540: 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74  ndexable = ~(Bit
7550: 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f  mask)0;.  chngTo
7560: 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  IN = ~(Bitmask)0
7570: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
7580: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
7590: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
75a0: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
75b0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
75c0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
75d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
75e0: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
75f0: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
7600: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
7610: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54     assert( (pOrT
7620: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7630: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52  TERM_ANDINFO|TER
7640: 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  M_ORINFO))==0 );
7650: 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20  .      chngToIN 
7660: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49  = 0;.      pAndI
7670: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7680: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
7690: 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b  eof(*pAndInfo));
76a0: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49  .      if( pAndI
76b0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57  nfo ){.        W
76c0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
76d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  WC;.        Wher
76e0: 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b  eTerm *pAndTerm;
76f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7700: 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
7710: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
7720: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
7730: 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20  fo = pAndInfo;. 
7740: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
7750: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7760: 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20  ANDINFO;.       
7770: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
7780: 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20  tor = WO_AND;.  
7790: 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26        pAndWC = &
77a0: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
77b0: 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73        whereClaus
77c0: 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57  eInit(pAndWC, pW
77d0: 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  C->pWInfo);.    
77e0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
77f0: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
7800: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
7810: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
7820: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
7830: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
7840: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
7850: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
7860: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
7870: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
7880: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
7890: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
78a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
78b0: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
78c0: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
78d0: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
78e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
78f0: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
7900: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
7910: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
7920: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
7930: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
7940: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
7950: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7960: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  ->sMaskSet, pAnd
7970: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
7990: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
79a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
79b0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
79c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
79d0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
79e0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
79f0: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
7a00: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
7a10: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
7a20: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
7a30: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
7a40: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
7a50: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
7a60: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
7a70: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
7a80: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
7a90: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
7aa0: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
7ab0: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
7ac0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
7ad0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
7ae0: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
7af0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
7b00: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
7b10: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
7b20: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
7b30: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7b40: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68  ->sMaskSet, pOth
7b50: 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  er->leftCursor);
7b60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7b70: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
7b80: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
7b90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ba0: 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_EQ)==0 ){.    
7bb0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
7bc0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7bd0: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
7be0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
7bf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
7c00: 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65  ** Record the se
7c10: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7c20: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
7c30: 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20    The set might 
7c40: 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20  be.  ** empty.. 
7c50: 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69   */.  pOrInfo->i
7c60: 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78  ndexable = index
7c70: 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  able;.  pTerm->e
7c80: 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78  Operator = index
7c90: 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f  able==0 ? 0 : WO
7ca0: 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _OR;..  /*.  ** 
7cb0: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
7cc0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
7cd0: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
7ce0: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
7cf0: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
7d00: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
7d10: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
7d20: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
7d30: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
7d40: 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  isfied..  **.  *
7d50: 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20  * chngToIN will 
7d60: 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31  hold either 0, 1
7d70: 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68  , or 2 bits.  Th
7d80: 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61  e 0-bit case mea
7d90: 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ns.  ** that the
7da0: 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69  re is no possibi
7db0: 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72  lity of transfor
7dc0: 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75  ming the OR clau
7dd0: 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20  se into an.  ** 
7de0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  IN operator beca
7df0: 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  use one or more 
7e00: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20  terms in the OR 
7e10: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20  clause contain. 
7e20: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   ** something ot
7e30: 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61  her than == on a
7e40: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73   column in the s
7e50: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
7e60: 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73  e 1-bit.  ** cas
7e70: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65  e means that eve
7e80: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
7e90: 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  R clause is of t
7ea0: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61  he form.  ** "ta
7eb0: 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22  ble.column=expr"
7ec0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
7ed0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65   table.  The one
7ee0: 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
7ef0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65  .  ** will corre
7f00: 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d  spond to the com
7f10: 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73  mon table.  We s
7f20: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65  till need to che
7f30: 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ck to make.  ** 
7f40: 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f  sure the same co
7f50: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20  lumn is used on 
7f60: 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20  all terms.  The 
7f70: 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68  2-bit case is wh
7f80: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20  en.  ** the all 
7f90: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
7fa0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f   form "table1.co
7fb0: 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75  lumn=table2.colu
7fc0: 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69  mn".  It.  ** mi
7fd0: 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  ght be possible 
7fe0: 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70  to form an IN op
7ff0: 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68  erator with eith
8000: 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  er table1.column
8010: 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e  .  ** or table2.
8020: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48  column as the LH
8030: 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63  S if either is c
8040: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
8050: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  erm of.  ** the 
8060: 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OR clause..  **.
8070: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
8080: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
8090: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d   "table.column1=
80a0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28  table.column2" (
80b0: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
80c0: 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65  ble on both size
80d0: 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e  s of the ==) can
80e0: 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
80f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ..  */.  if( chn
8100: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74  gToIN ){.    int
8110: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8120: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8130: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
8140: 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20   to IN is valid 
8150: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
8160: 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  mn = -1;        
8170: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78   /* Column index
8180: 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70   on lhs of IN op
8190: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  erator */.    in
81a0: 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20  t iCursor = -1; 
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
81c0: 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74   cursor common t
81d0: 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20  o all terms */. 
81e0: 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20     int j = 0;   
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8200: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8210: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
8220: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63  or a table and c
8230: 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61  olumn that appea
8240: 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f  rs on one side o
8250: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  r the.    ** oth
8260: 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65  er of the == ope
8270: 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73  rator in every s
8280: 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61  ubterm.  That ta
8290: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20  ble and column. 
82a0: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
82b0: 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f  corded in iCurso
82c0: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20  r and iColumn.  
82d0: 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20  There might not 
82e0: 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  be any.    ** su
82f0: 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ch table and col
8300: 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68  umn.  Set okToCh
8310: 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70  ngToIN if an app
8320: 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20  ropriate table. 
8330: 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e     ** and column
8340: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65   is found but le
8350: 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  ave okToChngToIN
8360: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f   false if not fo
8370: 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  und..    */.    
8380: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20  for(j=0; j<2 && 
8390: 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a  !okToChngToIN; j
83a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65  ++){.      pOrTe
83b0: 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20  rm = pOrWc->a;. 
83c0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
83d0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
83e0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
83f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8400: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8410: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8420: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8430: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8440: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8450: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8460: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8470: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
8480: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
8490: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
84a0: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
84b0: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
84c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
84d0: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
84e0: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
84f0: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
8500: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
8510: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8520: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8530: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8550: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
8560: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
8570: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
8580: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
8590: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
85a0: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
85b0: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
85c0: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
85d0: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
85e0: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
85f0: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
8600: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
8610: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
8620: 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20   preceeded.     
8630: 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77       ** or follw
8640: 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65  ed by an inverte
8650: 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31  d copy (t2.b==t1
8660: 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20  .a).  Skip this 
8670: 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20  term .          
8680: 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69  ** and use its i
8690: 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  nversion. */.   
86a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
86b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
86c0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
86d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
86e0: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
86f0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
8700: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
8710: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
8720: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
8730: 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d  TERM_COPIED|TERM
8740: 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20  _VIRTUAL) );.   
8750: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8760: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8770: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72     iColumn = pOr
8780: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
8790: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72  mn;.        iCur
87a0: 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c  sor = pOrTerm->l
87b0: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
87c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
87d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20  }.      if( i<0 
87e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
87f0: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
8800: 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e  +column was foun
8810: 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  d.  This can onl
8820: 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20  y occur.        
8830: 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** on the second
8840: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
8850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
8860: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
8870: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
8880: 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a  wo(chngToIN) );.
8890: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
88a0: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
88b0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
88c0: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
88d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
88e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
88f0: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
8900: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
8910: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
8920: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
8930: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
8940: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
8950: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
8960: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
8970: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
8980: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
8990: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
89a0: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
89b0: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
89c0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
89d0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
89e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
89f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8a00: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
8a10: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
8a20: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
8a30: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
8a40: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8a50: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
8a60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
8a70: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
8a80: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
8a90: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
8aa0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8ab0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
8ad0: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
8ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
8af0: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
8b00: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
8b10: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
8b20: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
8b30: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
8b40: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
8b50: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
8b60: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
8b70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
8b80: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
8b90: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
8ba0: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
8bb0: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
8bc0: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
8bd0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
8be0: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
8bf0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
8c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
8c10: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
8c20: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
8c30: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
8c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8c50: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
8c60: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
8c70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
8c80: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8c90: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
8ca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8cb0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8cc0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
8cd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8cf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
8d00: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
8d10: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
8d20: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
8d30: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
8d40: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
8d50: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
8d60: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
8d70: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
8d80: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
8d90: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
8da0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
8db0: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
8dc0: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
8dd0: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
8de0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
8df0: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
8e00: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
8e10: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8e20: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
8e30: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
8e40: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8e50: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
8e60: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
8e70: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
8e80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
8e90: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
8ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8eb0: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
8ec0: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
8ed0: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
8ee0: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
8ef0: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
8f00: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
8f10: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
8f20: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8f30: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
8f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8f50: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8f60: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8f70: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
8f80: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
8f90: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
8fa0: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
8fb0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
8fc0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
8fd0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
8fe0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
8ff0: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9000: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9010: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9020: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9030: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e  rListAppend(pWIn
9040: 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  fo->pParse, pLis
9050: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
9060: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
9070: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
9080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
9090: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
90a0: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
90b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
90c0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
90d0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
90e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
90f0: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
9100: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
9110: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
9120: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
9130: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
9140: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
9150: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
9160: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9170: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
9180: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
9190: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
91a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
91b0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
91c0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
91d0: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
91e0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
91f0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
9200: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
9210: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
9220: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
9230: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
9240: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
9250: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9260: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
9270: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
9280: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
9290: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
92a0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
92b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
92c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
92d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
92e0: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
92f0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
9300: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
9310: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
9320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
9330: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9340: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
9350: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
9360: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
9370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
9380: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
9390: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
93a0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
93b0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
93c0: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
93d0: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
93e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
93f0: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
9400: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
9410: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
9420: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
9430: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
9440: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
9450: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9460: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
9470: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
9480: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
9490: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
94a0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
94b0: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
94c0: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
94d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
94e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
94f0: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
9500: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
9510: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
9520: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
9530: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
9540: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
9550: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
9560: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
9570: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
9580: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
9590: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
95a0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
95b0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
95c0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
95d0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
95e0: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
95f0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
9600: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
9610: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
9620: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
9630: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
9640: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
9650: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
9660: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
9670: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
9680: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
9690: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
96a0: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
96b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
96c0: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
96d0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
96e0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
96f0: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
9700: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
9710: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
9720: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
9730: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9740: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
9750: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
9760: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
9770: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
9780: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
9790: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
97a0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
97b0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
97c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
97d0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
97e0: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
97f0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
9800: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
9810: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
9820: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9830: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
9840: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
9850: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
9860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
9870: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
9880: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
9890: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
98b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
98c0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
98d0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
98e0: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
98f0: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
9900: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
9910: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
9920: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9940: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
9950: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
9960: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
9970: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
9980: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
9990: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
99a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
99b0: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
99c0: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
99d0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
99e0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
99f0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
9a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
9a10: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
9a20: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
9a30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
9a40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9a50: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
9a60: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
9a70: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
9a80: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9aa0: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
9ab0: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
9ac0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
9ad0: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
9ae0: 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se;  /* Parsing 
9af0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
9b00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9b10: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
9b20: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9b30: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
9b40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9b50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9b60: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
9b70: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9b80: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
9b90: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
9ba0: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
9bb0: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
9bc0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
9bd0: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
9be0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
9bf0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
9c00: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
9c10: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
9c20: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
9c30: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
9c40: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
9c50: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
9c60: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
9c70: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9c80: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9c90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
9ca0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9cb0: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
9cc0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9cd0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
9ce0: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
9cf0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9d00: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9d10: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
9d20: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9d30: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
9d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
9d50: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
9d60: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9d70: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
9d80: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
9d90: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9da0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9db0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
9dc0: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
9dd0: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
9de0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9df0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
9e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
9e10: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
9e20: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
9e30: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
9e40: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
9e50: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
9e60: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
9e70: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
9e80: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
9e90: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
9ea0: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
9eb0: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
9ee0: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
9ef0: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
9f00: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
9f10: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
9f20: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
9f30: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
9f40: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
9f50: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
9f60: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
9f70: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
9f80: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
9f90: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
9fa0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
9fb0: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
9fc0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
9fd0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
9fe0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
9ff0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
a000: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
a010: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
a020: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
a030: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
a040: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
a050: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
a060: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
a070: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
a080: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
a090: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
a0a0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a0b0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a0c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a0d0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
a0e0: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
a0f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
a100: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
a110: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a120: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
a130: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
a140: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
a150: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
a160: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
a170: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
a180: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
a190: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a1a0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
a1b0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
a1c0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
a1d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a1e0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
a1f0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
a200: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a210: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a220: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a230: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
a240: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a250: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
a260: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
a270: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
a280: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a290: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a2a0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
a2b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a2c0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
a2d0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
a2e0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
a2f0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
a300: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
a310: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
a320: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
a330: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
a340: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
a350: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
a360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
a370: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20  xpr->op==TK_EQ. 
a380: 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
a390: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a3a0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
a3b0: 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
a3c0: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
a3d0: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
a3e0: 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29  itive).        )
a3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
a400: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20  m->eOperator |= 
a410: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
a420: 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57      eExtraOp = W
a430: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
a440: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
a450: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
a460: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
a470: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
a480: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
a490: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
a4a0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
a4b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
a4c0: 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e  ipCollate(pDup->
a4d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
a4e0: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
a4f0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
a500: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
a510: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a520: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a530: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
a540: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
a550: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
a560: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
a570: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
a580: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
a590: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
a5a0: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
a5b0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
a5c0: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
a5d0: 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73  r = (operatorMas
a5e0: 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45  k(pDup->op) + eE
a5f0: 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b  xtraOp) & opMask
a600: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
a610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a620: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
a630: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
a640: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
a650: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
a660: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
a670: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
a680: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
a690: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
a6a0: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
a6b0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
a6c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
a6d0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
a6e0: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
a6f0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
a700: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
a710: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
a720: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
a730: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
a740: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
a750: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
a760: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
a770: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
a780: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
a790: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
a7a0: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
a7b0: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
a7c0: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
a7d0: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
a7e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
a7f0: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
a800: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
a810: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
a820: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
a830: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
a840: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
a850: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
a860: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
a870: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
a880: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
a890: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
a8a0: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
a8b0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
a8c0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
a8d0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
a8e0: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
a8f0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
a900: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
a910: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
a920: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
a930: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a940: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
a950: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
a960: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
a970: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
a980: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
a990: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
a9a0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
a9b0: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
a9c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a9f0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
aa00: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
aa30: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
aa40: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
aa50: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
aa60: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
aa70: 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  xpr, pExpr);.   
aa80: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
aa90: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
aaa0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
aab0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
aac0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
aad0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
aae0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
aaf0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
ab00: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
ab10: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
ab20: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
ab30: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
ab40: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
ab50: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
ab60: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
ab70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
ab80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
ab90: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
aba0: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
abb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
abc0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
abd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
abe0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
abf0: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
ac00: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
ac10: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
ac20: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
ac30: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
ac40: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
ac50: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
ac60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
ac70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ac80: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
ac90: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
aca0: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
acb0: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
acc0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
acd0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
ace0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
acf0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ad00: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
ad10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
ad20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
ad30: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
ad40: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
ad50: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
ad60: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
ad70: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
ad80: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
ad90: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
ada0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
adb0: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
adc0: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
add0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
ade0: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
adf0: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
ae00: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
ae10: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
ae20: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
ae30: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
ae40: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
ae50: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
ae60: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
ae70: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
ae80: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
ae90: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
aea0: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
aeb0: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
aec0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
aed0: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
aee0: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
aef0: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
af00: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
af10: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
af20: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
af30: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
af40: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
af50: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
af60: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
af70: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
af80: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
af90: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
afa0: 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
afb0: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
afc0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
afd0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
afe0: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
aff0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b000: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b010: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b020: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b030: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b040: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b050: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b060: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
b070: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b080: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
b090: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
b0a0: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
b0b0: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
b0c0: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
b0d0: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
b0e0: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
b0f0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
b100: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
b110: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
b120: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
b130: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b140: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
b150: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
b160: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
b170: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
b180: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
b190: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
b1a0: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
b1b0: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
b1c0: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
b1d0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
b1e0: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
b1f0: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
b200: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
b210: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
b220: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
b230: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
b240: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
b250: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
b260: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
b270: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
b280: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
b290: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lete = 0;.      
b2a0: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
b2b0: 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
b2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20      }.      *pC 
b2d0: 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  = c + 1;.    }. 
b2e0: 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
b2f0: 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  z = noCase ? "NO
b300: 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
b310: 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  ;.    sCollSeqNa
b320: 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e  me.n = 6;.    pN
b330: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b340: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
b350: 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
b360: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
b370: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b380: 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  GE, .           
b390: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b3a0: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b3b0: 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f  e,pNewExpr1,&sCo
b3c0: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b3d0: 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
b3e0: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b3f0: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b400: 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr1, pExpr);.  
b410: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
b420: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b430: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
b440: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b450: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b460: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
b470: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b480: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b490: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
b4a0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b4b0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b4c0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
b4d0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
b4e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b4f0: 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
b500: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b510: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b520: 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f  e,pNewExpr2,&sCo
b530: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b540: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
b550: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b560: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b570: 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr2, pExpr);.  
b580: 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72    idxNew2 = wher
b590: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b5a0: 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45  C, pNewExpr2, TE
b5b0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b5c0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b5d0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d  stcase( idxNew2=
b5e0: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b5f0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b600: 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
b610: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b620: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
b630: 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
b640: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
b650: 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew1].iParent = i
b660: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57  dxTerm;.      pW
b670: 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50  C->a[idxNew2].iP
b680: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
b690: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
b6a0: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  hild = 2;.    }.
b6b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
b6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
b6d0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
b6e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b700: 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d  .  /* Add a WO_M
b710: 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74  ATCH auxiliary t
b720: 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74  erm to the const
b730: 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65  raint set if the
b740: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78  .  ** current ex
b750: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
b760: 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e  he form:  column
b770: 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a   MATCH expr..  *
b780: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
b790: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
b7a0: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
b7b0: 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72  hods of.  ** vir
b7c0: 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68  tual tables.  Th
b7d0: 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f  e native query o
b7e0: 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f  ptimizer does no
b7f0: 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74  t attempt.  ** t
b800: 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69  o do anything wi
b810: 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f  th MATCH functio
b820: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ns..  */.  if( i
b830: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70  sMatchOfColumn(p
b840: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
b850: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70   idxNew;.    Exp
b860: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
b870: 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  t;.    WhereTerm
b880: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20   *pNewTerm;.    
b890: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f  Bitmask prereqCo
b8a0: 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72  lumn, prereqExpr
b8b0: 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ;..    pRight = 
b8c0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b8d0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
b8e0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
b8f0: 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
b900: 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78  pr;.    prereqEx
b910: 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  pr = exprTableUs
b920: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
b930: 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65  ight);.    prere
b940: 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61  qColumn = exprTa
b950: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
b960: 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  t, pLeft);.    i
b970: 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26  f( (prereqExpr &
b980: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d   prereqColumn)==
b990: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
b9a0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
b9b0: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
b9c0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b9d0: 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20   TK_MATCH, .    
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c            0, sql
ba00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ba10: 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a  pRight, 0), 0);.
ba20: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
ba30: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
ba40: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
ba50: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
ba60: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
ba70: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
ba80: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew==0 );.      p
ba90: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
baa0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
bab0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
bac0: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45  qRight = prereqE
bad0: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  xpr;.      pNewT
bae0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
baf0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
bb00: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
bb10: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
bb20: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
bb30: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb40: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
bb50: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
bb60: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
bb70: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
bb80: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
bb90: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
bba0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
bbb0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
bbc0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
bbd0: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
bbe0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
bbf0: 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
bc00: 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
bc10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
bc20: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
bc30: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
bc40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
bc50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57  _OR_STAT4.  /* W
bc60: 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33  hen sqlite_stat3
bc70: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
bc80: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20  is available an 
bc90: 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a  operator of the.
bca0: 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20    ** form "x IS 
bcb0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f  NOT NULL" can so
bcc0: 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75  metimes be evalu
bcd0: 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69  ated more effici
bce0: 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78  ently.  ** as "x
bcf0: 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e  >NULL" if x is n
bd00: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
bd10: 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63  IMARY KEY.  So c
bd20: 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20  onstruct a.  ** 
bd30: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20  virtual term of 
bd40: 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a  that form..  **.
bd50: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
bd60: 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
bd70: 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77  must be tagged w
bd80: 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20  ith TERM_VNULL. 
bd90: 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f   This.  ** TERM_
bda0: 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73  VNULL tag will s
bdb0: 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d  uppress the not-
bdc0: 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68  null check at th
bdd0: 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
bde0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57   of the loop.  W
bdf0: 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f  ithout the TERM_
be00: 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20  VNULL flag, the 
be10: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
be20: 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  t.  ** the start
be30: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
be40: 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65  l prevent any re
be50: 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  sults from being
be60: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
be70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
be80: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
be90: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
bea0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
beb0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
bec0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  ->iColumn>=0.   
bed0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
bee0: 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
bef0: 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20  E_Stat3).  ){.  
bf00: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
bf10: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
bf20: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
bf30: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
bf40: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
bf50: 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20  *pNewTerm;..    
bf60: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
bf70: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bf80: 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_GT,.         
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
bfb0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c  p(db, pLeft, 0),
bfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
bfe0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bff0: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
c000: 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64   0), 0);..    id
c010: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c020: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
c030: 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  ewExpr,.        
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55        TERM_VIRTU
c060: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  AL|TERM_DYNAMIC|
c070: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20  TERM_VNULL);.   
c080: 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20   if( idxNew ){. 
c090: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20       pNewTerm = 
c0a0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
c0b0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c0c0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
c0d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c0e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
c0f0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
c100: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
c110: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
c120: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
c130: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
c140: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a  erator = WO_GT;.
c150: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c160: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
c170: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
c180: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c190: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
c1a0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
c1b0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
c1c0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
c1d0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c1e0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
c1f0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
c200: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
c210: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
c220: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
c230: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
c240: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
c250: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
c260: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
c270: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
c280: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
c290: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
c2a0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
c2b0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
c2c0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
c2d0: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ht;.}../*.** Thi
c2e0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
c2f0: 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20  hes pList for a 
c300: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
c310: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
c320: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
c330: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
c340: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
c350: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
c360: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
c370: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
c380: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
c390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
c3a0: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
c3b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c3c0: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
c3d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3f0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
c400: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c410: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
c420: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
c430: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
c440: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
c450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c460: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
c470: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
c480: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
c490: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
c4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c4b0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
c4c0: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
c4d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
c500: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
c510: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
c520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c530: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
c540: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
c550: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
c560: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c570: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
c580: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
c590: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
c5a0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
c5b0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
c5c0: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
c5d0: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
c5e0: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
c5f0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
c600: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
c610: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
c620: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
c630: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
c640: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
c650: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
c660: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
c670: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
c680: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
c690: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c6a0: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
c6b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c6c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
c6d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
c6e0: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
c6f0: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
c700: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
c710: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
c720: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
c730: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
c740: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68   redundant if th
c750: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
c760: 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20  ins some subset 
c770: 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  of.** columns th
c780: 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e  at are unique an
c790: 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  d non-null..*/.s
c7a0: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
c7b0: 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
c7c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
c7e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c7f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
c800: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
c810: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
c820: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
c830: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
c840: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
c850: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
c860: 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
c870: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
c880: 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
c890: 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
c8a0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
c8b0: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
c8c0: 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
c8f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
c900: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
c910: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
c920: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
c930: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
c940: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
c950: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
c960: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
c970: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
c980: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
c990: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
c9a0: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
c9b0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
c9c0: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
c9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
c9e0: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
c9f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
ca00: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
ca10: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
ca20: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
ca30: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
ca40: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
ca50: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
ca60: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
ca70: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
ca80: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
ca90: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
caa0: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
cab0: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
cac0: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
cad0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
cae0: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
caf0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
cb00: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
cb10: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
cb20: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
cb30: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
cb40: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
cb50: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
cb60: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
cb70: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
cb80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
cb90: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
cba0: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
cbb0: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
cbc0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
cbd0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
cbe0: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
cbf0: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
cc00: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
cc10: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
cc20: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
cc30: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
cc40: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
cc50: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
cc60: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
cc70: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
cc80: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
cc90: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
cca0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
ccb0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
ccc0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
ccd0: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
cce0: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
ccf0: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
cd00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
cd10: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
cd20: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
cd30: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
cd40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
cd50: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
cd60: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
cd70: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
cd80: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
cd90: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
cda0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
cdb0: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
cdc0: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
cdd0: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
cde0: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
cdf0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
ce00: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
ce10: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ce20: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ce30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
ce40: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
ce50: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
ce60: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
ce70: 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  i<pIdx->nKeyCol;
ce80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   i++){.      i16
ce90: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
cea0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
ceb0: 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d   if( 0==findTerm
cec0: 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f  (pWC, iBase, iCo
ced0: 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  l, ~(Bitmask)0, 
cee0: 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a  WO_EQ, pIdx) ){.
cef0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
cf00: 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43  Col = findIndexC
cf10: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
cf20: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
cf30: 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  x, i);.        i
cf40: 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
cf50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cf60: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
cf70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
cf80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
cfa0: 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  i==pIdx->nKeyCol
cfb0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
cfc0: 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20  s index implies 
cfd0: 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
cfe0: 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72  T qualifier is r
cff0: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20  edundant. */.   
d000: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d010: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d020: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73   0;.}.../*.** Es
d030: 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
d040: 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
d050: 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
d060: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  2..*/.static Log
d070: 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73  Est estLog(LogEs
d080: 74 20 4e 29 7b 0a 20 20 4c 6f 67 45 73 74 20 78  t N){.  LogEst x
d090: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
d0a0: 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e  (N);.  return x>
d0b0: 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b  33 ? x - 33 : 0;
d0c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
d0d0: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
d0e0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
d0f0: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
d100: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
d110: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
d120: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
d130: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
d140: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
d150: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
d160: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
d170: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
d180: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
d190: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
d1a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d1b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d1c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45  ) && defined(WHE
d1d0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
d1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
d1f0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
d200: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d210: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d220: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
d230: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
d240: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d250: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d260: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d270: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
d280: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
d290: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
d2a0: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
d2b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
d2c0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d2d0: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
d2e0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2f0: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
d300: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
d310: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d320: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
d330: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
d340: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
d350: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
d360: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
d370: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d380: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
d390: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
d3a0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
d3b0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
d3c0: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
d3d0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
d3e0: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
d3f0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
d400: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
d410: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d420: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d430: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
d440: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
d450: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d460: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d470: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d480: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
d490: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
d4a0: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
d4b0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
d4c0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
d4d0: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
d4e0: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
d4f0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
d500: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
d510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d520: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
d530: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
d540: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d550: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
d560: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
d570: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
d580: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
d590: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
d5a0: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
d5b0: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
d5c0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
d5d0: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
d5e0: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
d5f0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
d600: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
d610: 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c  imatedRows=%lld\
d620: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
d630: 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Rows);.}.#else.#
d640: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
d650: 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
d660: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
d670: 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
d680: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d690: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
d6a0: 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
d6b0: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
d6c0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
d6d0: 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
d6e0: 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
d6f0: 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
d700: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
d710: 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
d720: 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
d730: 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
d740: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d750: 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
d760: 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
d770: 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
d780: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
d790: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
d7a0: 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
d7b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
d7c0: 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
d7d0: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
d7e0: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
d7f0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d810: 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
d820: 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
d830: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
d840: 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
d850: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
d860: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
d870: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
d880: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
d890: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74   WO_EQ)==0 ) ret
d8a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
d8b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
d8c0: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
d8d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d8e0: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
d8f0: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
d900: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
d910: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
d920: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
d930: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
d940: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
d950: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
d960: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
d970: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
d980: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 1;.}.#endif...
d990: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d9a0: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
d9b0: 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  DEX./*.** Genera
d9c0: 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74  te code to const
d9d0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
d9e0: 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74  bject for an aut
d9f0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20  omatic index.** 
da00: 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68  and to set up th
da10: 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a  e WhereLevel obj
da20: 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68  ect pLevel so th
da30: 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  at the code gene
da40: 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75  rator.** makes u
da50: 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61  se of the automa
da60: 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  tic index..*/.st
da70: 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72  atic void constr
da80: 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
da90: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
daa0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
dab0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
dac0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
dad0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
dae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
daf0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
db00: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
db10: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
db20: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
db30: 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65   term to get the
db40: 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20   next index */. 
db50: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
db60: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
db70: 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
db80: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
db90: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72  ilable */.  Wher
dba0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
dbb0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
dbc0: 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20   new index here 
dbd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79  */.){.  int nKey
dbe0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dbf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dc00: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
dc10: 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65  constructed inde
dc20: 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
dc30: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
dc40: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
dc50: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
dc60: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
dc70: 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20  reTerm *pWCEnd; 
dc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
dc90: 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
dca0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcc0: 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e  Object describin
dcd0: 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  g the transient 
dce0: 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
dcf0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
dd00: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72         /* Prepar
dd10: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
dd20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
dd30: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69  */.  int addrIni
dd40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
dd50: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
dd60: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
dd70: 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f  n bypass jump */
dd80: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
dd90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
dda0: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
ddb0: 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  g indexed */.  i
ddc0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
ddd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
dde0: 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66  p of the index f
ddf0: 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ill loop */.  in
de00: 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
de10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
de20: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e  ister holding an
de30: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
de40: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de60: 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72  * Column counter
de70: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
dea0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74  r */.  int mxBit
deb0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dec0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
ded0: 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f  lumn in pSrc->co
dee0: 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lUsed */.  CollS
def0: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
df00: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
df10: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
df20: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  on a column */. 
df30: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
df40: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
df50: 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  The Loop object 
df60: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55  */.  char *zNotU
df70: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  sed;            
df80: 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
df90: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49  on the end of pI
dfa0: 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  dx */.  Bitmask 
dfb0: 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
dfc0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
dfd0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
dfe0: 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
dff0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
e000: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
e010: 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
e020: 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
e030: 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
e040: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
e050: 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
e060: 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
e070: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
e080: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
e090: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
e0a0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
e0b0: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
e0c0: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
e0d0: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
e0e0: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
e0f0: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
e100: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
e110: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
e120: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
e130: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
e140: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
e150: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e160: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e170: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
e180: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
e190: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
e1a0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
e1b0: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
e1c0: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
e1d0: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
e1e0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
e1f0: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
e200: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
e210: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
e220: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
e230: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
e240: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
e250: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
e260: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
e270: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
e280: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
e290: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
e2a0: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
e2b0: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
e2c0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
e2d0: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
e2e0: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
e2f0: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
e300: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
e310: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
e320: 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
e330: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
e340: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
e350: 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67  if( !sentWarning
e360: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e370: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
e380: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
e390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ,.            "a
e3a0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f  utomatic index o
e3b0: 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c  n %s(%s)", pTabl
e3c0: 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  e->zName,.      
e3d0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
e3e0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b  ol[iCol].zName);
e3f0: 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72  .        sentWar
e400: 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ning = 1;.      
e410: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  }.      if( (idx
e420: 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
e430: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e440: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
e450: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f  pParse->db, pLoo
e460: 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 20  p, nKeyCol+1) ) 
e470: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
e480: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b  pLoop->aLTerm[nK
e490: 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d  eyCol++] = pTerm
e4a0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
e4b0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
e4c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e4d0: 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e  assert( nKeyCol>
e4e0: 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
e4f0: 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
e500: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79  p->nLTerm = nKey
e510: 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  Col;.  pLoop->ws
e520: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
e530: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
e540: 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
e550: 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
e570: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
e580: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e590: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
e5a0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
e5b0: 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
e5c0: 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
e5d0: 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
e5e0: 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
e5f0: 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
e600: 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
e610: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
e620: 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
e630: 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
e640: 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
e650: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
e660: 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
e670: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
e680: 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
e690: 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
e6a0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
e6b0: 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
e6c0: 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
e6d0: 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
e6e0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
e6f0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
e700: 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
e710: 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
e720: 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
e730: 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
e740: 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
e750: 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
e760: 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
e770: 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
e780: 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
e790: 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
e7a0: 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
e7b0: 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
e7c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
e7d0: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
e7e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
e7f0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
e800: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
e810: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
e820: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
e830: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
e840: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
e850: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
e860: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
e870: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
e880: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
e890: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
e8a0: 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77  ;.  }.  pLoop->w
e8b0: 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
e8c0: 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
e8d0: 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f  E_IDX_ONLY;..  /
e8e0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
e8f0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
e900: 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
e910: 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20  dex */.  pIdx = 
e920: 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
e930: 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73  ndexObject(pPars
e940: 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31  e->db, nKeyCol+1
e950: 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b  , 0, &zNotUsed);
e960: 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
e970: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70   return;.  pLoop
e980: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
e990: 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d   = pIdx;.  pIdx-
e9a0: 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69  >zName = "auto-i
e9b0: 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70  ndex";.  pIdx->p
e9c0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
e9d0: 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f    n = 0;.  idxCo
e9e0: 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
e9f0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
ea00: 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
ea10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
ea20: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
ea30: 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
ea40: 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
ea50: 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
ea60: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
ea70: 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
ea80: 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
ea90: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
eaa0: 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
eab0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
eac0: 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
ead0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
eae0: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
eaf0: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
eb00: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
eb10: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
eb20: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
eb30: 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
eb40: 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = cMask;.       
eb50: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
eb60: 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  n] = pTerm->u.le
eb70: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
eb80: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
eb90: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
eba0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
ebb0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
ebc0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49  ght);.        pI
ebd0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
ebe0: 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20  ALWAYS(pColl) ? 
ebf0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22  pColl->zName : "
ec00: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
ec10: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
ec20: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
ec30: 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d  ( (u32)n==pLoop-
ec40: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a  >u.btree.nEq );.
ec50: 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
ec60: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
ec70: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
ec80: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
ec90: 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
eca0: 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
ecb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
ecc0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
ecd0: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
ece0: 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20  ASKBIT(i) ){.   
ecf0: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
ed00: 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
ed10: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
ed20: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
ed30: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
ed40: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
ed50: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
ed60: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
ed70: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
ed80: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
ed90: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
eda0: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
edb0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
edc0: 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
edd0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
ede0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
edf0: 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49  =nKeyCol );.  pI
ee00: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
ee10: 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  = -1;.  pIdx->az
ee20: 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
ee30: 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  Y";..  /* Create
ee40: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
ee50: 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
ee60: 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
ee70: 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c  r>=0 );.  pLevel
ee80: 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
ee90: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
eea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
eeb0: 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e  v, OP_OpenAutoin
eec0: 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  dex, pLevel->iId
eed0: 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  xCur, nKeyCol+1)
eee0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
eef0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
ef00: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62  se, pIdx);.  Vdb
ef10: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
ef20: 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
ef30: 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
ef40: 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
ef50: 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
ef60: 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
ef70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ef80: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
ef90: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
efa0: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
efb0: 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  e(v);.  regRecor
efc0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
efd0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
efe0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
eff0: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
f000: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
f010: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
f020: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, 0, 0, 0, 0);.
f030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f040: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
f050: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
f060: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
f070: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
f080: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f090: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
f0a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f0b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
f0c0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
f0d0: 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56  r, addrTop+1); V
f0e0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f100: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
f110: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
f120: 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
f130: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f140: 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
f150: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f160: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
f170: 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
f180: 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
f190: 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
f1a0: 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
f1b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f1c0: 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
f1d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f1e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
f1f0: 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
f200: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f210: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
f220: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
f230: 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
f240: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
f250: 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
f260: 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
f270: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
f280: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
f290: 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
f2a0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
f2b0: 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
f2c0: 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
f2d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
f2e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
f2f0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
f300: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
f310: 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
f320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f330: 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
f340: 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
f350: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
f360: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
f370: 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
f380: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
f390: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
f3a0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f3b0: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
f3c0: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
f3d0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
f3e0: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
f3f0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f400: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
f410: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
f420: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
f430: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
f440: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
f450: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
f460: 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
f470: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
f480: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
f490: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
f4a0: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
f4b0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
f4c0: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
f4d0: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
f4e0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
f4f0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
f500: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
f510: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
f520: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
f530: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
f540: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
f550: 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
f560: 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
f570: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f580: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f590: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
f5a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
f5b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f5c0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
f5d0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f5e0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f5f0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
f600: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f610: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
f620: 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63  O_EQUIV))==0 ) c
f630: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
f640: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
f650: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
f660: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65  ontinue;.    nTe
f670: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
f680: 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
f690: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
f6a0: 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
f6b0: 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
f6c0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
f6d0: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
f6e0: 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
f6f0: 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a  erBy part of.  *
f700: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
f710: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
f720: 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65  re..  */.  nOrde
f730: 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rBy = 0;.  if( p
f740: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
f750: 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d  nt n = pOrderBy-
f760: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
f770: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
f780: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
f790: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
f7a0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
f7b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
f7c0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
f7d0: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
f7e0: 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
f7f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f800: 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72  i==n){.      nOr
f810: 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d  derBy = n;.    }
f820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
f830: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
f840: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f850: 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ture.  */.  pIdx
f860: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
f870: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
f880: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
f890: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
f8c0: 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
f8d0: 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
f8e0: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
f900: 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
f910: 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
f920: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
f930: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f940: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f950: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
f960: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
f970: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
f980: 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74  alize the struct
f990: 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ure.  The sqlite
f9a0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
f9b0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
f9c0: 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
f9d0: 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
f9e0: 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
f9f0: 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
fa00: 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67   from.  ** chang
fa10: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
fa20: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
fa30: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
fa40: 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69  rder to.  ** ini
fa50: 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
fa60: 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  elds..  */.  pId
fa70: 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
fa80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fa90: 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
faa0: 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  nfo[1];.  pIdxOr
fab0: 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
fac0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
fad0: 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
fae0: 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
faf0: 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
fb00: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
fb10: 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
fb20: 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
fb30: 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
fb40: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
fb50: 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
fb60: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
fb70: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
fb80: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
fb90: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fba0: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
fbb0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
fbc0: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
fbd0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
fbe0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
fbf0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
fc00: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
fc10: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
fc20: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fc30: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
fc40: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
fc50: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72    pUsage;..  for
fcb0: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
fcc0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
fcd0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
fce0: 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  ){.    u8 op;.  
fcf0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
fd00: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
fd10: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
fd20: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
fd30: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
fd40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd50: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
fd60: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
fd70: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fd80: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
fd90: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
fda0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
fdb0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
fdc0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
fdd0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
fde0: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
fdf0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
fe00: 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55  WO_ISNULL|WO_EQU
fe10: 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
fe20: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
fe30: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
fe40: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
fe50: 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
fe60: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
fe70: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
fe80: 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
fe90: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
fea0: 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
feb0: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
fec0: 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
fed0: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
fee0: 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
fef0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
ff00: 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20   op;.    /* The 
ff10: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
ff20: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
ff30: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
ff40: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
ff50: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
ff60: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
ff70: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
ff80: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
ff90: 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
ffa0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
ffb0: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
ffc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ffd0: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
ffe0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
fff0: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
10000 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
10010 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10020 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
10030 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
10040 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10050 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
10060 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
10070 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10080 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
10090 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
100a0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
100b0 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
100c0 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
100d0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
100e0 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
100f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
10100 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
10110 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c  WO_IN|WO_EQ|WO_L
10120 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
10130 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
10140 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
10150 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
10160 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
10170 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
10180 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
10190 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
101a0 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
101b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
101c0 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
101d0 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
101e0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
101f0 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
10200 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
10210 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
10220 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
10230 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
10240 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
10250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
10260 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
10270 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
10280 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10290 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
102a0 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
102b0 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
102c0 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
102d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
102e0 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
102f0 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
10300 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
10310 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
10320 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10330 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
10340 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
10350 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
10360 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
10370 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
10380 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
10390 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
103a0 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
103b0 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
103c0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
103d0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
103e0 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
103f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
10400 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
10410 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
10420 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
10430 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
10440 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
10450 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
10460 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
10470 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
10480 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
10490 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
104a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
104b0 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
104c0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
104d0 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
104e0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
104f0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
10500 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
10510 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
10520 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
10530 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
10540 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44   rc;..  TRACE_ID
10550 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
10560 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
10570 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
10580 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
10590 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
105a0 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
105b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
105c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
105d0 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
105e0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
105f0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
10600 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
10610 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
10620 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10630 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
10640 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
10650 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10660 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10670 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
10680 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
10690 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
106a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
106b0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
106c0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
106d0 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
106e0 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
106f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
10700 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
10710 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
10720 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10730 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
10740 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10750 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10760 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
10770 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
10780 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
10790 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
107a0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
107b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
107c0 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
107d0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
107e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
107f0 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a  TUALTABLE) */...
10800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10810 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
10820 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
10830 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
10840 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
10850 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
10860 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
10870 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
10880 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
10890 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
108a0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
108b0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
108c0 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
108d0 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
108e0 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
108f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
10900 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
10910 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10920 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  K on success..*/
10930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10940 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
10950 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10970 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10980 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
10990 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
109a0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
109b0 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
109c0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
109d0 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
109e0 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
109f0 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
10a00 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
10a10 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
10a20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
10a30 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
10a40 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
10a50 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
10a80 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
10a90 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
10aa0 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
10ab0 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
10ac0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
10ad0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10ae0 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
10af0 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
10b00 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
10b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
10b30 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
10b40 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  d */.  int i = p
10b50 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20  Idx->nSample;   
10b60 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
10b70 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
10b80 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
10b90 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ec */.  int iTes
10ba0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10bb0 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
10bc0 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
10bd0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
10be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10bf0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
10c00 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
10c10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10c20 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
10c30 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73  PARAMETER( pPars
10c40 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  e );.#endif.  as
10c50 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b  sert( pRec!=0 );
10c60 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e  .  iCol = pRec->
10c70 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73  nField - 1;.  as
10c80 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
10c90 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
10ca0 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
10cb0 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
10cc0 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20  nSampleCol );.  
10cd0 64 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20  do{.    iTest = 
10ce0 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20  (iMin+i)/2;.    
10cf0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
10d00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
10d10 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c  Sample[iTest].n,
10d20 20 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e   aSample[iTest].
10d30 70 2c 20 70 52 65 63 2c 20 30 29 3b 0a 20 20 20  p, pRec, 0);.   
10d40 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
10d50 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
10d60 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
10d70 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b 0a       i = iTest;.
10d80 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
10d90 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29 3b  res && iMin<i );
10da0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10db0 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
10dc0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
10dd0 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
10de0 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
10df0 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
10e00 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
10e10 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
10e20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
10e30 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
10e40 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
10e50 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
10e60 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  ts.  */.  if( re
10e70 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  s==0 ){.    /* I
10e80 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
10e90 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65 20  ue, then sample 
10ea0 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  $i must be equal
10eb0 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20 20   to pRec */.    
10ec0 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
10ed0 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61  nSample );.    a
10ee0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
10ef0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10f00 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
10f10 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
10f20 52 65 63 2c 20 30 29 0a 20 20 20 20 20 20 20 20  Rec, 0).        
10f30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
10f40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
10f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
10f60 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
10f70 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
10f80 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
10f90 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
10fa0 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
10fb0 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
10fc0 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
10fd0 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
10fe0 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
10ff0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
11000 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
11010 65 5b 69 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29  e[i].p, pRec, 0)
11020 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  >0.         || p
11030 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
11040 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61  cFailed );.    a
11050 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20  ssert( i==0.    
11060 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
11070 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
11080 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c  (aSample[i-1].n,
11090 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c   aSample[i-1].p,
110a0 20 70 52 65 63 2c 20 30 29 3c 30 0a 20 20 20 20   pRec, 0)<0.    
110b0 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
110c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
110d0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   );.  }.#endif /
110e0 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
110f0 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74  EBUG */..  /* At
11100 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61   this point, aSa
11110 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
11120 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  irst sample that
11130 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
11140 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74  .  ** or equal t
11150 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69  o pVal.  Or if i
11160 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
11170 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   then all sample
11180 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20  s are less.  ** 
11190 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61  than pVal.  If a
111a0 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c  Sample[i]==pVal,
111b0 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20   then res==0..  
111c0 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  */.  if( res==0 
111d0 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  ){.    aStat[0] 
111e0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
111f0 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74  t[iCol];.    aSt
11200 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[1] = aSample[
11210 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20  i].anEq[iCol];. 
11220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77   }else{.    tRow
11230 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  cnt iLower, iUpp
11240 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
11250 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
11260 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
11270 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
11280 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[0].anLt[iCol]
11290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
112a0 20 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73     i64 nRow0 = s
112b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
112c0 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
112d0 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  Est[0]);.      i
112e0 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d  Upper = i>=pIdx-
112f0 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f 77 30  >nSample ? nRow0
11300 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   : aSample[i].an
11310 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  Lt[iCol];.      
11320 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
11330 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d  [i-1].anEq[iCol]
11340 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   + aSample[i-1].
11350 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
11360 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  }.    aStat[1] =
11370 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e   (pIdx->nKeyCol>
11380 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41 76  iCol ? pIdx->aAv
11390 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b 0a  gEq[iCol] : 1);.
113a0 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
113b0 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
113c0 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
113d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
113e0 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
113f0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
11400 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
11410 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
11420 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
11430 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
11440 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
11450 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
11460 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a 23   + iGap;.  }.}.#
11470 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11480 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
11490 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
114a0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
114b0 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65  L, pTerm is a te
114c0 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  rm that provides
114d0 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77   an upper or low
114e0 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61  er.** bound on a
114f0 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74   range scan. Wit
11500 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  hout considering
11510 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73   pTerm, it is es
11520 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74  timated .** that
11530 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
11540 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20  isit nNew rows. 
11550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
11560 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
11570 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f  .** estimated to
11580 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65   be visited afte
11590 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69  r taking pTerm i
115a0 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a  nto account..**.
115b0 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65  ** If the user e
115c0 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
115d0 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  ied a likelihood
115e0 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  () value for thi
115f0 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20  s term,.** then 
11600 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
11610 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   is the likeliho
11620 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  od multiplied by
11630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
11640 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74  * input rows. Ot
11650 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75  herwise, this fu
11660 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
11670 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e  hat an "IS NOT N
11680 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73  ULL" term.** has
11690 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
116a0 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f   0.50, and any o
116b0 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65  ther term a like
116c0 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a  lihood of 0.25..
116d0 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
116e0 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
116f0 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
11700 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29  rm, LogEst nNew)
11710 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20  {.  LogEst nRet 
11720 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54  = nNew;.  if( pT
11730 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  erm ){.    if( p
11740 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
11750 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
11760 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
11770 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Prob;.    }else 
11780 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
11790 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
117a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  )==0 ){.      nR
117b0 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  et -= 20;       
117c0 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
117d0 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
117e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
117f0 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn nRet;.}../*.
11800 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11810 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
11820 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
11830 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
11840 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
11850 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
11860 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
11870 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
11880 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
11890 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
118a0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
118b0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
118c0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
118d0 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
118e0 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
118f0 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
11900 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
11910 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
11920 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
11930 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
11940 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
11950 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
11960 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
11970 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
11980 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
119b0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
119d0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
11a00 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
11a10 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
11a20 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
11a30 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
11a40 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
11a50 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
11a60 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
11a70 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
11a80 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
11a90 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
11aa0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
11ab0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
11ac0 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d  e index.** colum
11ad0 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
11ae0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
11af0 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
11b00 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
11b10 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63  of.** equality c
11b20 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d  onstraints optim
11b30 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
11b40 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
11b50 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
11b60 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
11b70 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29  p is on t1(a, b)
11b80 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
11b90 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
11ba0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
11bb0 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
11bc0 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
11bd0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
11be0 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74  s set to 1 (as t
11bf0 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
11c00 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69  ted column, b, i
11c10 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
11c20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
11c30 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
11c40 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
11c50 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
11c60 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
11c70 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
11c80 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
11c90 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  Eq is set to 0..
11ca0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
11cb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11cc0 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65  ed, *pnOut is se
11cd0 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  t to the sqlite3
11ce0 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a  LogEst() of the.
11cf0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
11d00 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
11d10 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65   scan is expecte
11d20 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f  d to visit witho
11d30 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69  ut .** consideri
11d40 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  ng the range con
11d50 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71  straints. If nEq
11d60 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 74   is 0, this is t
11d70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
11d80 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
11d90 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
11da0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
11db0 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
11dc0 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
11dd0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
11de0 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74   range contraint
11df0 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
11e00 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
11e10 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
11e20 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
11e30 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
11e40 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
11e50 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68  be.** used, each
11e60 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
11e70 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
11e80 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
11e90 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
11ea0 20 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66   Hence a pair of
11eb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
11ec0 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
11ed0 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
11ee0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
11ef0 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
11f00 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a  actor of 16..*/.
11f10 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
11f20 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
11f30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11f40 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11f50 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
11f60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
11f70 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
11f80 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
11f90 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
11fa0 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
11fb0 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
11fc0 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
11fd0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
11fe0 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
11ff0 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
12000 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
12010 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
12020 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
12030 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
12040 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
12050 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
12060 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
12070 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12090 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
120a0 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
120b0 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
120c0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
120d0 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  OR_STAT4.  Index
120e0 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
120f0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
12100 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
12110 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
12120 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
12130 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69  .   && nEq==pBui
12140 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a  lder->nRecValid.
12150 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61     && nEq<p->nSa
12160 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70  mpleCol.   && Op
12170 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
12180 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
12190 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29  LITE_Stat3) .  )
121a0 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65  {.    UnpackedRe
121b0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
121c0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
121d0 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
121e0 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20     u8 aff;..    
121f0 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
12200 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
12210 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
12220 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
12230 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  rows in .    ** 
12240 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
12250 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
12260 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
12270 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
12280 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65   The.    ** lowe
12290 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
122a0 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
122b0 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
122c0 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
122d0 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
122e0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
122f0 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
12300 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
12310 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a   left-most.    *
12320 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
12330 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
12340 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
12350 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  Lower..    **.  
12360 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
12370 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
12380 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
12390 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
123a0 63 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20  cause it.    ** 
123b0 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
123c0 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65  variable or lite
123d0 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20  ral value), the 
123e0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
123f0 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
12400 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
12410 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
12420 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
12430 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
12440 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
12450 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
12460 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
12470 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
12480 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a  and .    ** ($P:
12490 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
124a0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
124b0 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73  turned values us
124c0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
124d0 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
124e0 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
124f0 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
12500 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
12510 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65  f rows.    ** le
12520 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
12530 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
12540 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
12550 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
12560 64 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  d.    ** is eith
12570 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
12580 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
12590 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
125a0 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
125b0 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72      ** of iUpper
125c0 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f   are requested o
125d0 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  f whereKeyStats(
125e0 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65  ) and the smalle
125f0 72 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  r used..    */. 
12600 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
12610 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  r;.    tRowcnt i
12620 55 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Upper;..    if( 
12630 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20  nEq==p->nKeyCol 
12640 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
12650 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
12660 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
12670 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61      aff = p->pTa
12680 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
12690 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69  olumn[nEq]].affi
126a0 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nity;.    }.    
126b0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
126c0 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
126d0 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
126e0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  */.    if( nEq==
126f0 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
12700 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
12710 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
12720 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f  EstToInt(p->aiRo
12730 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20  wLogEst[0]);.   
12740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
12750 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
12760 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
12770 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
12780 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
12790 20 6d 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20   must .      ** 
127a0 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
127b0 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67  ted when testing
127c0 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65   key $P in where
127d0 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20  EqualScanEst(). 
127e0 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b   */.      whereK
127f0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
12800 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
12810 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
12820 5b 30 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65  [0];.      iUppe
12830 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b  r = a[0] + a[1];
12840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12850 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
12860 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
12870 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
12880 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
12890 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
128a0 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128c0 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
128d0 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
128e0 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
128f0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
12900 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
12910 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
12920 73 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65  sert( (pLower->e
12930 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
12940 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
12950 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12960 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
12970 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
12980 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
12990 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
129a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
129b0 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
129c0 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
129d0 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77   iNew;.        w
129e0 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
129f0 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
12a00 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65   a);.        iNe
12a10 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f  w = a[0] + ((pLo
12a20 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
12a30 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a   WO_GT) ? a[1] :
12a40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
12a50 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69   iNew>iLower ) i
12a60 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Lower = iNew;.  
12a70 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
12a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12a90 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
12aa0 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
12ab0 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20  iUpper estimate 
12ac0 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a  using ($P:$U). *
12ad0 2f 0a 20 20 20 20 69 66 28 20 70 55 70 70 65 72  /.    if( pUpper
12ae0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   ){.      int bO
12af0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
12b00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
12b10 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
12b20 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
12b30 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  /.      Expr *pE
12b40 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
12b50 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
12b60 20 20 20 61 73 73 65 72 74 28 20 28 70 55 70 70     assert( (pUpp
12b70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
12b80 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
12b90 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
12ba0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
12bb0 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
12bc0 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
12bd0 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
12be0 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
12bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
12c00 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52  Ok ){.        tR
12c10 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
12c20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
12c30 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
12c40 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
12c50 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
12c60 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
12c70 74 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61  tor & WO_LE) ? a
12c80 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
12c90 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65    if( iNew<iUppe
12ca0 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65  r ) iUpper = iNe
12cb0 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  w;.        nOut-
12cc0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
12cd0 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ..    pBuilder->
12ce0 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
12cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
12d10 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b  iUpper>iLower ){
12d20 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
12d30 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
12d40 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
12d50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12d60 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
12d70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
12d80 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
12d90 28 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (2) );.      }. 
12da0 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
12db0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  ut ){.        nO
12dc0 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
12dd0 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
12de0 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
12df0 4f 75 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45  Out;.      WHERE
12e00 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61  TRACE(0x10, ("ra
12e10 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  nge scan regions
12e20 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64  : %u..%u  est=%d
12e30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
12e50 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
12e60 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
12e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12e80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
12e90 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
12ea0 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
12eb0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
12ec0 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29  AMETER(pBuilder)
12ed0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
12ee0 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
12ef0 70 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  per );.  assert(
12f00 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70   pUpper==0 || (p
12f10 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26  Upper->wtFlags &
12f20 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
12f30 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
12f40 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f  eRangeAdjust(pLo
12f50 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e  wer, nOut);.  nN
12f60 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41  ew = whereRangeA
12f70 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e  djust(pUpper, nN
12f80 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e  ew);..  /* TUNIN
12f90 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  G: If there is b
12fa0 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64  oth an upper and
12fb0 20 6c 6f 77 65 72 20 6c 69 6d 69 74 2c 20 61 73   lower limit, as
12fc0 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69  sume the range i
12fd0 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62  s.  ** reduced b
12fe0 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  y an additional 
12ff0 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  75%. This means 
13000 74 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74  that, by default
13010 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a  , an open-ended.
13020 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79    ** range query
13030 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20   (e.g. col > ?) 
13040 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61  is assumed to ma
13050 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72  tch 1/4 of the r
13060 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ows in the.  ** 
13070 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63  index. While a c
13080 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67  losed range (e.g
13090 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20  . col BETWEEN ? 
130a0 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61  AND ?) is estima
130b0 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63  ted to.  ** matc
130c0 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e  h 1/64 of the in
130d0 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70  dex. */ .  if( p
130e0 4c 6f 77 65 72 20 26 26 20 70 55 70 70 65 72 20  Lower && pUpper 
130f0 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 0a 20  ) nNew -= 20;.. 
13100 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72   nOut -= (pLower
13110 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d  !=0) + (pUpper!=
13120 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31  0);.  if( nNew<1
13130 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
13140 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
13150 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nOut = nNew;.  
13160 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
13170 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
13180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
13190 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
131a0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
131b0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
131c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
131d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
131e0 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
131f0 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
13200 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
13210 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
13220 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
13230 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
13240 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
13250 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
13260 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
13270 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
13280 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
13290 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
132a0 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
132b0 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
132c0 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
132d0 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
132e0 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
132f0 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
13300 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
13310 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
13320 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
13330 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
13340 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
13350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13360 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
13370 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
13380 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
13390 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
133a0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
133b0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
133c0 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
133d0 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
133e0 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
133f0 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
13400 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
13410 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
13420 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
13430 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
13440 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
13450 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
13460 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
13470 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
13480 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
13490 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
134a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134b0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
134c0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
134d0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
134e0 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
134f0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
13500 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
13510 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
13520 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
13530 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
13540 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
13550 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
13560 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
13570 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
13580 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
13590 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
135a0 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
135b0 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
135c0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
135d0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
135e0 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
135f0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
13600 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
13610 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
13620 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
13630 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
13640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13650 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
13660 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13680 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
13690 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
136a0 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
136b0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
136c0 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  tics */.  int bO
136d0 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45  k;..  assert( nE
136e0 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q>=1 );.  assert
136f0 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43  ( nEq<=(p->nKeyC
13700 6f 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ol+1) );.  asser
13710 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
13720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
13730 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
13740 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
13750 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
13760 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
13770 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
13780 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
13790 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
137a0 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
137b0 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
137c0 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
137d0 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
137e0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
137f0 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
13800 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
13810 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
13820 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
13830 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
13840 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
13850 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
13860 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
13870 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
13880 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
13890 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
138a0 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
138b0 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65    if( nEq>p->nKe
138c0 79 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52  yCol ){.    *pnR
138d0 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
138e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
138f0 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  }..  aff = p->pT
13900 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
13910 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61  Column[nEq-1]].a
13920 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20  ffinity;.  rc = 
13930 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
13940 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
13950 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
13960 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26  r, aff, nEq-1, &
13970 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
13980 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
13990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
139a0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
139b0 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
139c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
139d0 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
139e0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
139f0 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
13a00 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
13a10 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
13a20 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
13a30 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
13a40 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
13a50 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70  int)a[1]));.  *p
13a60 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a  nRow = a[1];.  .
13a70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
13a80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13a90 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
13aa0 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66  STAT4 */..#ifdef
13ab0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13ac0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
13ad0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
13ae0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13af0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
13b00 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
13b10 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
13b20 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
13b30 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
13b40 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
13b50 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
13b60 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
13b70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
13b80 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
13b90 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
13ba0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
13bb0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
13bc0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
13bd0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
13be0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
13bf0 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
13c00 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
13c10 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
13c20 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
13c30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
13c40 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
13c50 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
13c60 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
13c70 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
13c80 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
13c90 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
13ca0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
13cb0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
13cc0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
13cd0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
13ce0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
13cf0 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
13d00 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
13d10 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
13d20 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
13d30 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
13d40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
13d50 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
13d60 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
13d70 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
13d80 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
13d90 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
13da0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
13db0 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
13dc0 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
13dd0 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
13de0 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
13df0 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
13e00 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
13e10 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
13e20 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
13e30 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
13e40 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
13e50 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77  ndex;.  i64 nRow
13e60 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 = sqlite3LogEs
13e70 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c  tToInt(p->aiRowL
13e80 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74  ogEst[0]);.  int
13e90 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
13ea0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13eb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13ec0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53  ITE_OK;     /* S
13ed0 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
13ee0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
13ef0 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20  cnt nEst;       
13f00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13f10 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67   rows for a sing
13f20 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f  le term */.  tRo
13f30 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30  wcnt nRowEst = 0
13f40 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69  ;    /* New esti
13f50 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
13f60 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
13f70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
13f80 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
13f90 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
13fa0 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
13fb0 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
13fc0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
13fd0 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
13fe0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
13ff0 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72  t = nRow0;.    r
14000 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
14010 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
14020 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61  uilder, pList->a
14030 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74  [i].pExpr, &nEst
14040 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b  );.    nRowEst +
14050 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69  = nEst;.    pBui
14060 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
14070 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d  = nRecValid;.  }
14080 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
140a0 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30   nRowEst > nRow0
140b0 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f   ) nRowEst = nRo
140c0 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  w0;.    *pnRow =
140d0 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
140e0 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
140f0 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
14100 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77   est=%g\n", nRow
14110 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Est));.  }.  ass
14120 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
14130 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61  RecValid==nRecVa
14140 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  lid );.  return 
14150 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
14160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14170 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
14180 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
14190 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
141a0 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
141b0 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
141c0 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
141d0 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
141e0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
141f0 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
14200 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
14210 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
14220 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
14230 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
14240 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
14250 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
14260 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
14270 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
14280 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
14290 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
142a0 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
142b0 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
142c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
142d0 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
142e0 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
142f0 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
14300 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
14310 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
14320 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
14330 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
14340 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
14350 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
14360 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
14370 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
14380 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
14390 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
143a0 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
143b0 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
143c0 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
143d0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
143e0 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
143f0 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
14400 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
14410 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
14420 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
14430 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
14440 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
14450 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
14460 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
14470 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
14480 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
14490 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
144a0 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
144b0 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
144c0 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
144d0 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
144e0 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
144f0 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
14500 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
14510 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
14520 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
14530 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
14540 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
14550 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
14560 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
14570 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
14580 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
14590 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
145a0 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
145b0 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
145c0 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
145d0 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
145e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
145f0 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
14600 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
14610 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
14620 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
14630 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77      && (pTerm->w
14640 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
14650 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  DED)==0.      &&
14660 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
14670 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
14680 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
14690 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
146a0 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28  oin)).      && (
146b0 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
146c0 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   & pTerm->prereq
146d0 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  All)==0.  ){.   
146e0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
146f0 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
14700 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
14710 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20  arent>=0 ){.    
14720 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
14730 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57  her = &pTerm->pW
14740 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72  C->a[pTerm->iPar
14750 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ent];.      if( 
14760 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c  (--pOther->nChil
14770 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
14780 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
14790 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20  vel, pOther);.  
147a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
147b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
147c0 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
147d0 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65  ode to apply the
147e0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
147f0 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20   string zAff.** 
14800 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65  to the n registe
14810 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  rs starting at b
14820 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61  ase. .**.** As a
14830 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
14840 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
14850 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61  entries (which a
14860 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68  re no-ops) at th
14870 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61  e.** beginning a
14880 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61  nd end of zAff a
14890 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  re ignored.  If 
148a0 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a  all entries in z
148b0 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54  Aff are.** SQLIT
148c0 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e  E_AFF_NONE, then
148d0 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65   no code gets ge
148e0 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nerated..**.** T
148f0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
14900 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  s its own copy o
14910 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74  f zAff so that t
14920 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65  he caller is fre
14930 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a  e.** to modify z
14940 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72  Aff after this r
14950 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
14960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
14970 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
14980 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14990 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c  int base, int n,
149a0 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20   char *zAff){.  
149b0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
149c0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a  ->pVdbe;.  if( z
149d0 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Aff==0 ){.    as
149e0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
149f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14a00 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
14a10 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  }.  assert( v!=0
14a20 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74   );..  /* Adjust
14a30 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73   base and n to s
14a40 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f  kip over SQLITE_
14a50 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73  AFF_NONE entries
14a60 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
14a70 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f  g.  ** and end o
14a80 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  f the affinity s
14a90 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68  tring..  */.  wh
14aa0 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66  ile( n>0 && zAff
14ab0 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  [0]==SQLITE_AFF_
14ac0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
14ad0 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20  .    base++;.   
14ae0 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77   zAff++;.  }.  w
14af0 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66  hile( n>1 && zAf
14b00 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41  f[n-1]==SQLITE_A
14b10 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
14b20 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  --;.  }..  /* Co
14b30 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  de the OP_Affini
14b40 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65  ty opcode if the
14b50 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c  re is anything l
14b60 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20  eft to do. */.  
14b70 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73  if( n>0 ){.    s
14b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14b90 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
14ba0 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73   base, n);.    s
14bb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14bc0 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20  P4(v, -1, zAff, 
14bd0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  n);.    sqlite3E
14be0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
14bf0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62  Change(pParse, b
14c00 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  ase, n);.  }.}..
14c10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14c20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
14c30 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
14c40 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
14c50 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74  use.  An equalit
14c60 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65  y.** term can be
14c70 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f   either X=expr o
14c80 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20  r X IN (...).   
14c90 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72  pTerm is the ter
14ca0 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65  m to be .** code
14cb0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  d..**.** The cur
14cc0 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rent value for t
14cd0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
14ce0 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
14cf0 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f  r iReg..**.** Fo
14d00 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  r a constraint o
14d10 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70  f the form X=exp
14d20 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  r, the expressio
14d30 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
14d40 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74  nd its.** result
14d50 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
14d60 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73  stack.  For cons
14d70 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66  traints of the f
14d80 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a  orm X IN (...).*
14d90 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
14da0 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68  ets up a loop th
14db0 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20  at will iterate 
14dc0 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
14dd0 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of X..*/.static 
14de0 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79  int codeEquality
14df0 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
14e00 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
14e10 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
14e20 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
14e30 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
14e40 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
14e50 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
14e60 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
14e70 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
14e80 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66   /* The level of
14e90 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
14ea0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
14eb0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c  on */.  int iEq,
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14ed0 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61  ndex of the equa
14ee0 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e  lity term within
14ef0 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
14f00 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20   int bRev,      
14f10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
14f20 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49   reverse-order I
14f30 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a  N operations */.
14f40 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20    int iTarget   
14f50 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
14f60 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74   to leave result
14f70 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  s in this regist
14f80 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  er */.){.  Expr 
14f90 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
14fa0 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  pr;.  Vdbe *v = 
14fb0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14fc0 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20   int iReg;      
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14fe0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
14ff0 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73  results */..  as
15000 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20  sert( iTarget>0 
15010 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d  );.  if( pX->op=
15020 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52  =TK_EQ ){.    iR
15030 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
15040 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
15050 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69  e, pX->pRight, i
15060 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
15070 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
15080 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52  ISNULL ){.    iR
15090 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
150a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
150b0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
150c0 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65  0, iReg);.#ifnde
150d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
150e0 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
150f0 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20      int eType;. 
15100 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
15110 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
15120 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  pIn;.    WhereLo
15130 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  op *pLoop = pLev
15140 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
15150 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
15160 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
15170 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20  TUALTABLE)==0.  
15180 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
15190 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a  btree.pIndex!=0.
151a0 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
151b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
151c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a  aSortOrder[iEq].
151d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
151e0 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b  tcase( iEq==0 );
151f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15200 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
15210 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
15220 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
15230 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
15240 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
15250 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  et;.    eType = 
15260 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
15270 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30  ex(pParse, pX, 0
15280 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  );.    if( eType
15290 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
152a0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74  _DESC ){.      t
152b0 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
152c0 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
152d0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Rev;.    }.    i
152e0 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
152f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15300 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
15310 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
15320 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
15330 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
15340 65 49 66 28 76 2c 20 62 52 65 76 29 3b 0a 20 20  eIf(v, bRev);.  
15350 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
15360 28 76 2c 20 21 62 52 65 76 29 3b 0a 20 20 20 20  (v, !bRev);.    
15370 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
15380 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15390 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a  MULTI_OR)==0 );.
153a0 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
153b0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41  gs |= WHERE_IN_A
153c0 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  BLE;.    if( pLe
153d0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
153e0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
153f0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
15400 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15410 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
15420 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
15430 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
15440 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
15450 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
15460 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
15470 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
15480 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
154b0 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
154c0 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
154d0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
154e0 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
154f0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
15500 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
15510 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
15520 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
15530 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
15540 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
15550 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
15560 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
15570 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
15580 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
15590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
155a0 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
155b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
155c0 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
155d0 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
155e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
155f0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
15600 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
15610 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f       pIn->eEndLo
15620 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  opOp = bRev ? OP
15630 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50  _PrevIfOpen : OP
15640 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20  _NextIfOpen;.   
15650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15660 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
15670 6c 2c 20 69 52 65 67 29 3b 20 56 64 62 65 43 6f  l, iReg); VdbeCo
15680 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
15690 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
156a0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
156b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
156c0 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
156d0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
156e0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
156f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15700 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
15710 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
15720 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
15730 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
15740 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20  dex scan..**.** 
15750 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
15760 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
15770 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
15780 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
15790 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
157a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
157b0 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
157c0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
157d0 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
157e0 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
157f0 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
15800 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15810 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
15820 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
15830 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
15840 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
15850 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
15860 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
15870 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
15880 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
15890 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
158a0 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
158b0 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
158c0 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
158d0 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
158e0 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
158f0 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
15900 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
15910 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
15920 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
15930 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
15940 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
15950 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
15960 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
15970 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
15980 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
15990 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
159a0 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
159b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
159c0 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
159d0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
159e0 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
159f0 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
15a00 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
15a10 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
15a20 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
15a30 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ring..**.** The 
15a40 6e 45 78 74 72 61 52 65 67 20 70 61 72 61 6d 65  nExtraReg parame
15a50 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20  ter is 0 or 1.  
15a60 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57  It is 0 if all W
15a70 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
15a80 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d  traints.** are =
15a90 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20  = or IN and are 
15aa0 63 6f 76 65 72 65 64 20 62 79 20 74 68 65 20 6e  covered by the n
15ab0 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69  Eq.  nExtraReg i
15ac0 73 20 31 20 69 66 20 74 68 65 72 65 20 69 73 0a  s 1 if there is.
15ad0 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ** an inequality
15ae0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63   constraint (suc
15af0 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41  h as the "c>=5 A
15b00 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20  ND c<10" in the 
15b10 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a  example) that.**
15b20 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68   occurs after th
15b30 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f  e nEq quality co
15b40 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a  nstraints..**.**
15b50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
15b60 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67 65 20  locates a range 
15b70 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67  of nEq+nExtraReg
15b80 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
15b90 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
15ba0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
15bb0 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  rst memory cell 
15bc0 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54  in that range. T
15bd0 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
15be0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
15bf0 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74  ne will use that
15c00 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f   memory range to
15c10 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a   store keys for.
15c20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74 65 72  ** start and ter
15c30 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69  mination conditi
15c40 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
15c50 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
15c60 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
15c70 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
15c80 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
15c90 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
15ca0 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
15cb0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
15cc0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
15cd0 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
15ce0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
15cf0 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66  returning, *pzAf
15d00 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  f is set to poin
15d10 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
15d20 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f  ntaining a.** co
15d30 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
15d40 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
15d50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c   of the index al
15d60 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
15d70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15d80 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72  (). Except, entr
15d90 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20  ies in the copy 
15da0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  of the string as
15db0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
15dc0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15dd0 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e  aints that use N
15de0 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65  ONE affinity are
15df0 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54   set to.** SQLIT
15e00 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73  E_AFF_NONE. This
15e10 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68   is to deal with
15e20 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65   SQL such as the
15e30 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
15e40 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
15e50 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41   t1(a TEXT PRIMA
15e60 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20  RY KEY, b);.**  
15e70 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
15e80 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48   t1 AS t2, t1 WH
15e90 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b  ERE t1.a = t2.b;
15ea0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
15eb0 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
15ec0 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20   index on t1(a) 
15ed0 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74  has TEXT affinit
15ee0 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20  y. But since.** 
15ef0 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73  the right hand s
15f00 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c  ide of the equal
15f10 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
15f20 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61  t2.b) has NONE a
15f30 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63  ffinity,.** no c
15f40 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64  onversion should
15f50 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65   be attempted be
15f60 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e  fore using a t2.
15f70 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20  b value as part 
15f80 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73  of.** a key to s
15f90 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e  earch the index.
15fa0 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74   Hence the first
15fb0 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74   byte in the ret
15fc0 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a  urned affinity.*
15fd0 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73  * string in this
15fe0 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62   example would b
15ff0 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
16000 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  AFF_NONE..*/.sta
16010 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
16020 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
16030 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16040 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16050 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
16060 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
16070 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
16080 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
16090 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
160a0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ng */.  int bRev
160b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
160c0 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64   Reverse the ord
160d0 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  er of IN operato
160e0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  rs */.  int nExt
160f0 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
16100 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
16110 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
16120 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
16130 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
16140 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
16150 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
16160 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
16170 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20    u16 nEq;      
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
161a0 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
161b0 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
161c0 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20  .  u16 nSkip;   
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
161f0 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
16200 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62  to skip */.  Vdb
16210 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
16220 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
16230 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
16240 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
16250 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
16260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16270 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
16280 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
16290 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
162a0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
162b0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
162c0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
162d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
162e0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
162f0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
16300 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
16310 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16330 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
16340 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
16370 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
163a0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
163b0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
163c0 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
163d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
163e0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
163f0 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
16400 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
16410 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
16420 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
16430 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
16440 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
16450 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73  l->pWLoop;.  ass
16460 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
16470 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
16480 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
16490 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  .  nEq = pLoop->
164a0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e  u.btree.nEq;.  n
164b0 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  Skip = pLoop->u.
164c0 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 70  btree.nSkip;.  p
164d0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
164e0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61  tree.pIndex;.  a
164f0 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
16500 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
16510 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
16520 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
16530 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
16540 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
16550 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
16560 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
16570 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Reg = pLoop->u.b
16580 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72  tree.nEq + nExtr
16590 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
165a0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
165b0 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
165c0 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
165d0 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
165e0 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
165f0 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
16600 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
16610 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16620 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69  ed = 1;.  }..  i
16630 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( nSkip ){.    
16640 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
16650 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
16660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16670 64 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50  dOp1(v, (bRev?OP
16680 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29  _Last:OP_Rewind)
16690 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  , iIdxCur);.    
166a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
166b0 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
166c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
166d0 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
166e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
166f0 22 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e  "begin skip-scan
16700 20 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a   on %s", pIdx->z
16710 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20  Name));.    j = 
16720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16730 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
16740 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53     pLevel->addrS
16750 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
16760 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62  eAddOp4Int(v, (b
16770 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50  Rev?OP_SeekLT:OP
16780 5f 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20  _SeekGT),.      
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30        iIdxCur, 0
167b0 2c 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70  , regBase, nSkip
167c0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
167d0 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
167e0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
167f0 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
16800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16810 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29  beJumpHere(v, j)
16820 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
16830 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20  <nSkip; j++){.  
16840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16850 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
16860 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20  mn, iIdxCur, j, 
16870 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
16880 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
16890 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29  aiColumn[j]>=0 )
168a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
168b0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
168c0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
168d0 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
168e0 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  j]].zName));.   
168f0 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a   }.  }    ..  /*
16900 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
16910 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16920 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
16930 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e  ( zAff==0 || (in
16940 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d  t)strlen(zAff)>=
16950 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e  nEq );.  for(j=n
16960 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  Skip; j<nEq; j++
16970 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
16980 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
16990 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
169a0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
169b0 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 );.    /* The 
169c0 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61  following testca
169d0 73 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 69  se is true for i
169e0 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
169f0 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
16a00 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
16a10 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
16a20 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
16a30 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
16a40 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
16a50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
16a60 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
16a70 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
16a80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
16a90 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
16aa0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
16ab0 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
16ac0 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
16ad0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
16ae0 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61  , j, bRev, regBa
16af0 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
16b00 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
16b10 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
16b20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
16b30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16b40 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
16b50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
16b60 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
16b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b90 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
16ba0 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
16bb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16bc0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
16bd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
16be0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
16bf0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
16c00 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
16c10 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
16c20 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
16c30 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
16c40 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
16c50 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
16c60 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
16c70 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ght;.      if( s
16c80 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
16c90 75 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20  ull(pRight) ){. 
16ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16cb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16cc0 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a  sNull, regBase+j
16cd0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
16ce0 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
16cf0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16d00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
16d10 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
16d20 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
16d30 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
16d40 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49  , zAff[j])==SQLI
16d50 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
16d60 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
16d70 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
16d80 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
16d90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16da0 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
16db0 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
16dc0 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20  t, zAff[j]) ){. 
16dd0 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
16de0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
16df0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
16e00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16e10 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b    *pzAff = zAff;
16e20 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73  .  return regBas
16e30 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
16e40 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
16e50 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  N./*.** This rou
16e60 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72  tine is a helper
16e70 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65   for explainInde
16e80 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a  xRange() below.*
16e90 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20  *.** pStr holds 
16ea0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
16eb0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
16ec0 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75  e are building u
16ed0 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74  p one term.** at
16ee0 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
16ef0 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65  outine adds a ne
16f00 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e  w term to the en
16f10 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  d of the express
16f20 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72  ion..** Terms ar
16f30 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41  e separated by A
16f40 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41  ND so add the "A
16f50 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63  ND" text for sec
16f60 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
16f70 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  nt.** terms only
16f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16f90 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
16fa0 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a  rm(.  StrAccum *
16fb0 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  pStr,           
16fc0 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78    /* The text ex
16fd0 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62  pression being b
16fe0 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  uilt */.  int iT
16ff0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
17000 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17010 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69  f this term.  Fi
17020 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20  rst is zero */. 
17030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
17040 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  lumn,        /* 
17050 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
17060 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
17070 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20  ar *zOp         
17080 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17090 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29  he operator */.)
170a0 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20  {.  if( iTerm ) 
170b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
170c0 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
170d0 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74  D ", 5);.  sqlit
170e0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
170f0 41 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d  All(pStr, zColum
17100 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  n);.  sqlite3Str
17110 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
17120 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
17130 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
17140 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
17150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
17160 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
17170 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
17180 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
17190 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
171a0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
171b0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
171c0 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
171d0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
171e0 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
171f0 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
17200 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
17210 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
17220 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
17230 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
17240 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
17250 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
17260 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
17270 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
17280 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
17290 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
172a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
172b0 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
172c0 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
172d0 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
172e0 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
172f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
17300 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
17310 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
17320 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
17330 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
17340 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
17350 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
17360 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
17370 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
17380 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
17390 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
173a0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
173b0 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
173c0 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
173d0 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
173e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
173f0 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
17400 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
17410 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  b, WhereLoop *pL
17420 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  oop, Table *pTab
17430 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
17440 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
17450 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31  ree.pIndex;.  u1
17460 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  6 nEq = pLoop->u
17470 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31  .btree.nEq;.  u1
17480 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d  6 nSkip = pLoop-
17490 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a  >u.btree.nSkip;.
174a0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f    int i, j;.  Co
174b0 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61  lumn *aCol = pTa
174c0 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a  b->aCol;.  i16 *
174d0 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65  aiColumn = pInde
174e0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53  x->aiColumn;.  S
174f0 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20  trAccum txt;..  
17500 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70  if( nEq==0 && (p
17510 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
17520 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
17530 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
17540 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))==0 ){.    ret
17550 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
17560 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
17570 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c  (&txt, 0, 0, SQL
17580 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b  ITE_MAX_LENGTH);
17590 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a  .  txt.db = db;.
175a0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
175b0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20  mAppend(&txt, " 
175c0 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d  (", 2);.  for(i=
175d0 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a  0; i<nEq; i++){.
175e0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 69      char *z = (i
175f0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  ==pIndex->nKeyCo
17600 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  l ) ? "rowid" : 
17610 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d  aCol[aiColumn[i]
17620 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
17630 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20   i>=nSkip ){.   
17640 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
17650 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
17660 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65   "=");.    }else
17670 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20  {.      if( i ) 
17680 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
17690 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 41 4e  ppend(&txt, " AN
176a0 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73  D ", 5);.      s
176b0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
176c0 70 65 6e 64 28 26 74 78 74 2c 20 22 41 4e 59 28  pend(&txt, "ANY(
176d0 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 4);.      sql
176e0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
176f0 6e 64 41 6c 6c 28 26 74 78 74 2c 20 7a 29 3b 0a  ndAll(&txt, z);.
17700 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
17710 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
17720 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 7d  , ")", 1);.    }
17730 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
17740 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
17750 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
17760 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
17770 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d  *z = (j==pIndex-
17780 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f  >nKeyCol ) ? "ro
17790 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
177a0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
177b0 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
177c0 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c  dTerm(&txt, i++,
177d0 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20   z, ">");.  }.  
177e0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
177f0 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
17800 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
17810 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
17820 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77  nKeyCol ) ? "row
17830 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
17840 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
17850 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
17860 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
17870 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   "<");.  }.  sql
17880 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
17890 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
178a0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
178b0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
178c0 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&txt);.}../*.**
178d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
178e0 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
178f0 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
17900 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e  ssing an EXPLAIN
17910 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63   QUERY PLAN.** c
17920 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71  ommand. If the q
17930 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69  uery being compi
17940 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49  led is an EXPLAI
17950 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20  N QUERY PLAN, a 
17960 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64  single.** record
17970 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
17980 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72   output to descr
17990 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63  ibe the table sc
179a0 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a  an strategy in .
179b0 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ** pLevel..*/.st
179c0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
179d0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
179e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
179f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17a00 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
17a10 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
17a20 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
17a30 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
17a40 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
17a50 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
17a60 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
17a70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
17a80 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
17a90 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
17aa0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ac0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
17ad0 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
17ae0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
17af0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
17b20 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
17b30 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
17b40 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
17b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
17b60 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
17b70 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
17b80 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
17b90 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
17ba0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
17bb0 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20  n==2 ).#endif.  
17bc0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
17bd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
17be0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
17bf0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
17c00 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
17c10 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
17c20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
17c30 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
17c40 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
17c50 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
17c60 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
17c70 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
17c80 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Msg;            
17c90 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
17ca0 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74  o add to EQP out
17cb0 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  put */.    int i
17cc0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
17cd0 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
17ce0 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
17cf0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
17d00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
17d10 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
17d20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
17d30 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
17d40 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20   for SCAN. */.  
17d50 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
17d60 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
17d70 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69  /* The controlli
17d80 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ng WhereLoop obj
17d90 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66  ect */.    u32 f
17da0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
17db0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
17dc0 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
17dd0 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  this loop */..  
17de0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
17df0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c  ->pWLoop;.    fl
17e00 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46  ags = pLoop->wsF
17e10 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66  lags;.    if( (f
17e20 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
17e30 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
17e40 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
17e50 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  LE_ONLY) ) retur
17e60 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68  n;..    isSearch
17e70 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52 45   = (flags&(WHERE
17e80 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
17e90 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a  _TOP_LIMIT))!=0.
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
17eb0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52  (flags&WHERE_VIR
17ec0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26  TUALTABLE)==0 &&
17ed0 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65   (pLoop->u.btree
17ee0 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20  .nEq>0)).       
17ef0 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
17f00 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
17f10 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
17f20 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20  ERBY_MAX));..   
17f30 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17f40 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
17f50 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43   isSearch?"SEARC
17f60 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20  H":"SCAN");.    
17f70 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
17f80 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  ct ){.      zMsg
17f90 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
17fa0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
17fb0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a   SUBQUERY %d", z
17fc0 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65  Msg,pItem->iSele
17fd0 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ctId);.    }else
17fe0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
17ff0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
18000 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42  b, zMsg, "%s TAB
18010 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  LE %s", zMsg, pI
18020 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
18030 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65   }..    if( pIte
18040 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
18050 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
18060 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
18070 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20  sg, "%s AS %s", 
18080 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
18090 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
180a0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57 48  if( (flags & (WH
180b0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49  ERE_IPK|WHERE_VI
180c0 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a  RTUALTABLE))==0.
180d0 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70       && ALWAYS(p
180e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
180f0 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ndex!=0).    ){.
18100 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
18110 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65  re = explainInde
18120 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70  xRange(db, pLoop
18130 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
18140 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
18150 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
18160 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
18170 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
18180 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
18190 29 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) ? .           
181a0 20 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e          "%s USIN
181b0 47 20 41 55 54 4f 4d 41 54 49 43 20 25 73 49 4e  G AUTOMATIC %sIN
181c0 44 45 58 25 2e 30 73 25 73 22 20 3a 0a 20 20 20  DEX%.0s%s" :.   
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 22 25 73 20 55 53 49 4e 47 20 25 73 49 4e 44 45  "%s USING %sINDE
181f0 58 20 25 73 25 73 22 29 2c 20 0a 20 20 20 20 20  X %s%s"), .     
18200 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20            zMsg, 
18210 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
18220 49 44 58 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f 56  IDX_ONLY) ? "COV
18230 45 52 49 4e 47 20 22 20 3a 20 22 22 29 2c 0a 20  ERING " : ""),. 
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
18250 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
18260 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65  dex->zName, zWhe
18270 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  re);.      sqlit
18280 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68  e3DbFree(db, zWh
18290 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ere);.    }else 
182a0 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
182b0 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66  RE_IPK)!=0 && (f
182c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
182d0 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20  STRAINT)!=0 ){. 
182e0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
182f0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
18300 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20  zMsg, "%s USING 
18310 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
18320 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20  KEY", zMsg);..  
18330 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 28 57      if( flags&(W
18340 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
18350 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20  HERE_COLUMN_IN) 
18360 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
18370 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
18380 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
18390 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67  (rowid=?)", zMsg
183a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
183b0 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
183c0 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45  BOTH_LIMIT)==WHE
183d0 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b  RE_BOTH_LIMIT ){
183e0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
183f0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
18400 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
18410 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64  owid>? AND rowid
18420 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
18430 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
18440 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
18450 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
18460 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
18470 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
18480 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a  %s (rowid>?)", z
18490 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
184a0 65 20 69 66 28 20 41 4c 57 41 59 53 28 66 6c 61  e if( ALWAYS(fla
184b0 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
184c0 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IT) ){.        z
184d0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
184e0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
184f0 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20  "%s (rowid<?)", 
18500 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMsg);.      }. 
18510 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
18520 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
18530 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69  TABLE.    else i
18540 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
18550 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
18560 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  =0 ){.      zMsg
18570 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
18580 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
18590 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
185a0 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73  NDEX %d:%s", zMs
185b0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
185c0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74       pLoop->u.vt
185d0 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70  ab.idxNum, pLoop
185e0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
185f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
18600 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
18610 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
18620 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b  sg, "%s", zMsg);
18630 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18640 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
18650 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65  lain, iId, iLeve
18660 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20  l, iFrom, zMsg, 
18670 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
18680 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
18690 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  e explainOneScan
186a0 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  (u,v,w,x,y,z).#e
186b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
186c0 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
186d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
186e0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
186f0 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c  rt of the iLevel
18700 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  -th loop in the 
18710 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
18720 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
18730 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e  escribed by pWIn
18740 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  fo..*/.static Bi
18750 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f  tmask codeOneLoo
18760 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49  pStart(.  WhereI
18770 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f  nfo *pWInfo,   /
18780 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72  * Complete infor
18790 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
187a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
187b0 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
187c0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
187d0 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f   level of pWInfo
187e0 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  ->a[] should be 
187f0 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  coded */.  Bitma
18800 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
18810 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20  /* Which tables 
18820 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76  are currently av
18830 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ailable */.){.  
18840 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20  int j, k;       
18850 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18860 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
18870 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
18880 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
18890 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
188a0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78   */.  int addrNx
188b0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  t;         /* Wh
188c0 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63  ere to jump to c
188d0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
188e0 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f   next IN case */
188f0 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65  .  int omitTable
18900 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
18910 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
18920 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e  dex only */.  in
18930 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
18940 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
18950 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
18960 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
18970 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
18980 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20  pLevel;  /* The 
18990 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62  where level to b
189a0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
189b0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
189c0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
189d0 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  op object being 
189e0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
189f0 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
18a00 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
18a10 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57   of the entire W
18a20 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
18a30 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
18a40 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
18a50 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75   /* A WHERE clau
18a60 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72  se term */.  Par
18a70 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18a90 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
18aa0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
18ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18ac0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
18ad0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
18ae0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
18b10 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73   stmt under cons
18b20 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  tructions */.  s
18b30 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
18b40 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
18b50 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
18b60 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  rm being coded *
18b70 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b  /.  int addrBrk;
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b90 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
18ba0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
18bb0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
18bc0 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20  nt addrCont;    
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18be0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
18bf0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
18c00 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
18c10 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20   iRowidReg = 0; 
18c20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
18c30 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69  is stored in thi
18c40 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e  s register, if n
18c50 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ot zero */.  int
18c60 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30   iReleaseReg = 0
18c70 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72  ;      /* Temp r
18c80 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
18c90 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
18ca0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
18cb0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
18cc0 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
18cd0 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  dbe;.  pWC = &pW
18ce0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20  Info->sWC;.  db 
18cf0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
18d00 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
18d10 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70  ->a[iLevel];.  p
18d20 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
18d30 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65  WLoop;.  pTabIte
18d40 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  m = &pWInfo->pTa
18d50 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
18d60 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20  >iFrom];.  iCur 
18d70 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
18d80 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e  sor;.  pLevel->n
18d90 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61  otReady = notRea
18da0 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70  dy & ~getMask(&p
18db0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
18dc0 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76 20 3d   iCur);.  bRev =
18dd0 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73   (pWInfo->revMas
18de0 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20  k>>iLevel)&1;.  
18df0 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f  omitTable = (pLo
18e00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
18e10 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
18e20 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
18e30 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
18e40 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
18e50 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56  E_TABLE)==0;.  V
18e60 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
18e70 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
18e80 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69 4c  E-loop%d: %s",iL
18e90 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e 70  evel,pTabItem->p
18ea0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  Tab->zName));.. 
18eb0 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
18ec0 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
18ed0 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
18ee0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
18ef0 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
18f00 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
18f10 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
18f20 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
18f30 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
18f40 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
18f50 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
18f60 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
18f70 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
18f80 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
18f90 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
18fa0 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
18fb0 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
18fc0 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
18fd0 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
18fe0 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
18ff0 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
19000 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
19010 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
19020 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
19030 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
19040 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
19050 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
19060 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
19070 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
19080 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
19090 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
190a0 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
190b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
190c0 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
190d0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
190e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
190f0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
19100 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
19110 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
19120 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
19130 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
19140 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
19150 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
19160 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
19170 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
19180 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
19190 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
191a0 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
191b0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
191c0 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
191d0 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
191e0 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
191f0 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
19200 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
19210 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
19220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19230 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
19240 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
19250 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
19260 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
19270 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
19280 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lag"));.  }..  /
19290 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f  * Special case o
192a0 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
192b0 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65  subquery impleme
192c0 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
192d0 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54  tine */.  if( pT
192e0 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
192f0 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
19300 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
19310 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
19320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19330 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
19340 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
19350 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d  eld, 0, pTabItem
19360 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a  ->addrFillSub);.
19370 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
19380 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19390 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
193a0 20 72 65 67 59 69 65 6c 64 2c 20 61 64 64 72 42   regYield, addrB
193b0 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  rk);.    VdbeCov
193c0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
193d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
193e0 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
193f0 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
19400 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
19410 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
19420 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a  _Goto;.  }else..
19430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19440 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
19450 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e  .  if(  (pLoop->
19460 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19470 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
19480 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
19490 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  1:  The table is
194a0 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65   a virtual-table
194b0 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74  .  Use the VFilt
194c0 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20  er and VNext.   
194d0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
194e0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
194f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
19500 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61  iReg;   /* P3 Va
19510 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74  lue for OP_VFilt
19520 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
19530 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20  drNotFound;.    
19540 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
19550 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b  = pLoop->nLTerm;
19560 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
19570 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
19580 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
19590 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
195a0 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
195b0 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61  traint+2);.    a
195c0 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
195d0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20  evel->addrBrk;. 
195e0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
195f0 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
19600 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67  .      int iTarg
19610 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20  et = iReg+j+2;. 
19620 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f       pTerm = pLo
19630 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
19640 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
19650 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
19660 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
19670 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
19680 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
19690 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
196a0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
196b0 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61  el, j, bRev, iTa
196c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61  rget);.        a
196d0 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
196e0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
196f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19710 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  ode(pParse, pTer
19720 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
19730 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
19740 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
19750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19760 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
19770 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
19780 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
19790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
197a0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
197b0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52   nConstraint, iR
197c0 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
197d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
197e0 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
197f0 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20  , addrNotFound, 
19800 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20  iReg,.          
19810 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
19820 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
19830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19840 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
19850 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f  .vtab.needFree ?
19860 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
19870 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 56 64  _STATIC);.    Vd
19880 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19890 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
198a0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
198b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
198c0 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31  onstraint && j<1
198d0 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  6; j++){.      i
198e0 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  f( (pLoop->u.vta
198f0 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31  b.omitMask>>j)&1
19900 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
19910 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
19920 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
19930 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19940 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
19950 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
19960 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
19970 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
19980 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
19990 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
199a0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
199b0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
199c0 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72  e, iReg, nConstr
199d0 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c  aint+2);.    sql
199e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
199f0 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73  (pParse);.  }els
19a00 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
19a10 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
19a20 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28  ABLE */..  if( (
19a30 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
19a40 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
19a50 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
19a60 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
19a70 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f  LUMN_IN|WHERE_CO
19a80 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29  LUMN_EQ))!=0.  )
19a90 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a  {.    /* Case 2:
19aa0 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
19ab0 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
19ac0 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
19ad0 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
19ae0 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
19af0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
19b00 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
19b10 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
19b20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
19b30 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
19b40 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
19b50 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
19b60 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
19b70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
19b80 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ert( pLoop->u.bt
19b90 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20  ree.nEq==1 );.  
19ba0 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
19bb0 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
19bc0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
19bd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19be0 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
19bf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
19c00 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
19c10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
19c20 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
19c30 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
19c40 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
19c50 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19c60 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
19c70 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
19c80 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
19c90 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c  pLevel, 0, bRev,
19ca0 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
19cb0 20 20 20 69 66 28 20 69 52 6f 77 69 64 52 65 67     if( iRowidReg
19cc0 21 3d 69 52 65 6c 65 61 73 65 52 65 67 20 29 20  !=iReleaseReg ) 
19cd0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19ce0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
19cf0 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20  eleaseReg);.    
19d00 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
19d10 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73  ->addrNxt;.    s
19d20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19d30 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
19d40 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64  , iRowidReg, add
19d50 72 4e 78 74 29 3b 20 56 64 62 65 43 6f 76 65 72  rNxt); VdbeCover
19d60 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19d70 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19d80 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
19d90 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52  Cur, addrNxt, iR
19da0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
19db0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19dc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
19dd0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
19de0 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
19df0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
19e00 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
19e10 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
19e20 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
19e30 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
19e40 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
19e50 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
19e60 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
19e70 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
19e80 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
19e90 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
19ea0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
19eb0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
19ec0 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
19ed0 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
19ee0 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
19ef0 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
19f00 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
19f10 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
19f20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
19f30 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
19f40 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
19f50 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
19f60 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19f70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
19f80 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
19f90 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
19fa0 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
19fb0 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
19fc0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
19fd0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
19fe0 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
19ff0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1a000 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
1a010 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1a020 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
1a030 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
1a040 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
1a050 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
1a060 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
1a070 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
1a080 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
1a090 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
1a0a0 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
1a0b0 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
1a0c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
1a0d0 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
1a0e0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1a0f0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1a100 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
1a110 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
1a120 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
1a130 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
1a140 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
1a150 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
1a160 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
1a170 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
1a180 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
1a190 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
1a1a0 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
1a1b0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
1a1c0 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
1a1d0 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
1a1e0 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
1a1f0 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
1a200 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1a210 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
1a220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1a230 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
1a240 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T,.           /*
1a250 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
1a260 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLE,.          
1a270 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
1a280 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20 20  _SeekLT,.       
1a290 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
1a2a0 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20   OP_SeekGE.     
1a2b0 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
1a2c0 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
1a2d0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
1a2e0 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
1a2f0 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
1a300 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
1a310 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
1a320 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
1a330 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
1a340 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1a350 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
1a360 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
1a370 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
1a380 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61     assert( (pSta
1a390 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1a3a0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1a3b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a3c0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1a3d0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1a3e0 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ;.      pX = pSt
1a3f0 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
1a400 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1a410 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a420 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  e( pStart->leftC
1a430 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f  ursor!=iCur ); /
1a440 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  * transitive con
1a450 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
1a460 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1a470 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1a480 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
1a490 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
1a4a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a4b0 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
1a4c0 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
1a4d0 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
1a4e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1a4f0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
1a500 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a510 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47  (v, pX->op==TK_G
1a520 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
1a530 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1a540 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20  op==TK_LE);.    
1a550 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a560 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  (v, pX->op==TK_L
1a570 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
1a580 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1a590 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
1a5a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a5b0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1a5c0 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
1a5d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1a5e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a5f0 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
1a600 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1a610 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
1a620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a640 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
1a650 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
1a660 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
1a670 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1a680 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
1a690 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
1a6a0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
1a6b0 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  !=0);.    }.    
1a6c0 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
1a6d0 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
1a6e0 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
1a6f0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1a700 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1a710 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e   assert( (pEnd->
1a720 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1a730 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
1a740 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64    testcase( pEnd
1a750 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
1a760 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74  ur ); /* Transit
1a770 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
1a780 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
1a790 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
1a7a0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1a7b0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  );.      memEndV
1a7c0 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
1a7d0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1a7e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1a7f0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1a800 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
1a810 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
1a820 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
1a830 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
1a840 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1a850 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
1a860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a870 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1a880 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
1a890 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
1a8a0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1a8b0 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
1a8c0 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
1a8d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a8e0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1a8f0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
1a900 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
1a910 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
1a920 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1a930 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1a940 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72 74  tart;.    assert
1a950 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1a960 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f  );.    if( testO
1a970 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1a980 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1a990 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a9a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a9b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
1a9c0 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  wid, iCur, iRowi
1a9d0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1a9e0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1a9f0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1aa00 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1aa10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1aa20 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
1aa30 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c  Op, memEndValue,
1aa40 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64   addrBrk, iRowid
1aa50 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Reg);.      Vdbe
1aa60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1aa70 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  stOp==OP_Le);.  
1aa80 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1aa90 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1aaa0 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Lt);.      Vdbe
1aab0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1aac0 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  stOp==OP_Ge);.  
1aad0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1aae0 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1aaf0 5f 47 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  _Gt);.      sqli
1ab00 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1ab10 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
1ab20 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a  MERIC | SQLITE_J
1ab30 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1ab40 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  }.  }else if( pL
1ab50 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1ab60 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
1ab70 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41      /* Case 4: A
1ab80 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
1ab90 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
1aba0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1abb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
1abc0 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
1abd0 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
1abe0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1abf0 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
1ac00 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
1ac10 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
1ac20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
1ac30 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1ac40 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
1ac50 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
1ac60 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
1ac70 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
1ac80 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
1ac90 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
1aca0 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
1acb0 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
1acc0 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
1acd0 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
1ace0 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
1acf0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1ad00 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1ad10 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
1ad20 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
1ad30 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
1ad40 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
1ad50 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
1ad60 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
1ad70 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1ad80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ad90 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
1ada0 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
1adb0 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
1adc0 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
1add0 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
1ade0 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
1ae00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1ae10 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
1ae20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ae30 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
1ae40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1ae50 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
1ae60 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
1ae70 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1ae80 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
1ae90 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1aea0 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
1aeb0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1aec0 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
1aed0 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
1aee0 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
1aef0 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
1af00 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1af10 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
1af20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1af30 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
1af40 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
1af50 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1af60 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
1af70 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
1af80 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
1af90 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
1afa0 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
1afb0 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
1afc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1afd0 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
1afe0 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
1aff0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
1b000 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1b010 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
1b020 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
1b030 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
1b040 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
1b050 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1b060 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
1b070 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
1b080 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
1b090 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
1b0a0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1b0b0 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
1b0c0 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
1b0d0 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
1b0e0 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
1b0f0 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
1b100 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
1b110 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
1b120 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b140 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
1b150 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1b160 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
1b170 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 54 2c        OP_SeekGT,
1b180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
1b190 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1b1a0 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
1b1b0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1b1c0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 20 20      OP_SeekLT,  
1b1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
1b1e0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1b1f0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1b200 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1b210 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20 20 20 20    OP_SeekGE,    
1b220 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
1b230 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1b240 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
1b250 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1b260 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20 20 20 20  OP_SeekLE       
1b270 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
1b280 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1b290 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
1b2a0 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
1b2b0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1b2c0 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
1b2d0 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20        OP_IdxGE, 
1b2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
1b2f0 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
1b300 73 20 26 26 20 21 62 52 65 76 20 26 26 20 21 65  s && !bRev && !e
1b310 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ndEq) */.      O
1b320 50 5f 49 64 78 47 54 2c 20 20 20 20 20 20 20 20  P_IdxGT,        
1b330 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63      /* 1: (end_c
1b340 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62  onstraints && !b
1b350 52 65 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a  Rev &&  endEq) *
1b360 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 45  /.      OP_IdxLE
1b370 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1b380 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
1b390 6e 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20  nts &&  bRev && 
1b3a0 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20  !endEq) */.     
1b3b0 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20 20 20 20   OP_IdxLT,      
1b3c0 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 65 6e 64        /* 3: (end
1b3d0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1b3e0 20 62 52 65 76 20 26 26 20 20 65 6e 64 45 71 29   bRev &&  endEq)
1b3f0 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75   */.    };.    u
1b400 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  16 nEq = pLoop->
1b410 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 20 20  u.btree.nEq;    
1b420 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
1b430 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
1b440 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b460 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
1b470 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72  r holding constr
1b480 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  aint values */. 
1b490 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1b4a0 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20  angeStart = 0;  
1b4b0 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1b4c0 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1b4d0 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57  e start */.    W
1b4e0 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1b4f0 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
1b500 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1b510 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
1b520 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  d */.    int sta
1b530 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
1b540 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1b550 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
1b560 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
1b570 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b  /.    int endEq;
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b590 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
1b5a0 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c  nge end uses ==,
1b5b0 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
1b5c0 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74   int start_const
1b5d0 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a  raints;       /*
1b5e0 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   Start of range 
1b5f0 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a  is constrained *
1b600 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  /.    int nConst
1b610 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
1b620 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b630 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
1b640 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
1b650 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1b660 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1b670 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  x we will be usi
1b680 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  ng */.    int iI
1b690 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  dxCur;          
1b6a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1b6b0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
1b6c0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e index */.    i
1b6d0 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30  nt nExtraReg = 0
1b6e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1b6f0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
1b700 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20  egisters needed 
1b710 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20  */.    int op;  
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
1b740 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  on opcode */.   
1b750 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66   char *zStartAff
1b760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b770 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74   Affinity for st
1b780 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  art of range con
1b790 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63  straint */.    c
1b7a0 68 61 72 20 63 45 6e 64 41 66 66 20 3d 20 30 3b  har cEndAff = 0;
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1b7c0 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20  ffinity for end 
1b7d0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
1b7e0 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38 20 62 53  int */.    u8 bS
1b7f0 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b  eekPastNull = 0;
1b800 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1b810 74 6f 20 73 65 65 6b 20 70 61 73 74 20 69 6e 69  to seek past ini
1b820 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20  tial nulls */.  
1b830 20 20 75 38 20 62 53 74 6f 70 41 74 4e 75 6c 6c    u8 bStopAtNull
1b840 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1b850 2a 20 41 64 64 20 63 6f 6e 64 69 74 69 6f 6e 20  * Add condition 
1b860 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 61 74 20  to terminate at 
1b870 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20 20 70 49  NULLs */..    pI
1b880 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
1b890 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
1b8a0 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
1b8b0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 61  ->iIdxCur;.    a
1b8c0 73 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f  ssert( nEq>=pLoo
1b8d0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
1b8e0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   );..    /* If t
1b8f0 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
1b900 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
1b910 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
1b920 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
1b930 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
1b940 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
1b950 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
1b960 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
1b970 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
1b980 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
1b990 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
1b9a0 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
1b9b0 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
1b9c0 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
1b9d0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1b9e0 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
1b9f0 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
1ba00 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
1ba10 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
1ba20 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
1ba30 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
1ba40 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
1ba50 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
1ba60 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1ba70 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
1ba80 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
1ba90 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
1baa0 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
1bab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49  .    assert( pWI
1bac0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
1bad0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49  .         || pWI
1bae0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
1baf0 45 78 70 72 3d 3d 31 0a 20 20 20 20 20 20 20 20  Expr==1.        
1bb00 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   || (pWInfo->wct
1bb10 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
1bb20 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b  DERBY_MIN)==0 );
1bb30 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
1bb40 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
1bb50 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21  RE_ORDERBY_MIN)!
1bb60 3d 30 0a 20 20 20 20 20 26 26 20 70 57 49 6e 66  =0.     && pWInf
1bb70 6f 2d 3e 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20  o->nOBSat>0.    
1bb80 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43   && (pIdx->nKeyC
1bb90 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  ol>nEq).    ){. 
1bba0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
1bbb0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
1bbc0 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 53  p==0 );.      bS
1bbd0 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b  eekPastNull = 1;
1bbe0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1bbf0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1bc00 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65   /* Find any ine
1bc10 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1bc20 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
1bc30 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a   start and end .
1bc40 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61      ** of the ra
1bc50 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nge. .    */.   
1bc60 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66   j = nEq;.    if
1bc70 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1bc80 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
1bc90 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
1bca0 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d  geStart = pLoop-
1bcb0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1bcc0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1bcd0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1bce0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1bcf0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1bd00 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
1bd10 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  eEnd = pLoop->aL
1bd20 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20  Term[j++];.     
1bd30 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
1bd40 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65        if( pRange
1bd50 53 74 61 72 74 3d 3d 30 0a 20 20 20 20 20 20 20  Start==0.       
1bd60 26 26 20 28 6a 20 3d 20 70 49 64 78 2d 3e 61 69  && (j = pIdx->ai
1bd70 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20  Column[nEq])>=0 
1bd80 0a 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d  .       && pIdx-
1bd90 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d  >pTable->aCol[j]
1bda0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20  .notNull==0.    
1bdb0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65    ){.        bSe
1bdc0 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a  ekPastNull = 1;.
1bdd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bde0 20 20 61 73 73 65 72 74 28 20 70 52 61 6e 67 65    assert( pRange
1bdf0 45 6e 64 3d 3d 30 20 7c 7c 20 28 70 52 61 6e 67  End==0 || (pRang
1be00 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
1be10 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
1be20 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
1be30 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
1be40 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
1be50 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
1be60 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61  = or IN.    ** a
1be70 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  nd store the val
1be80 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
1be90 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ms in an array o
1bea0 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
1beb0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
1bec0 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  egBase..    */. 
1bed0 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64     regBase = cod
1bee0 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
1bef0 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c  s(pParse,pLevel,
1bf00 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c 26  bRev,nExtraReg,&
1bf10 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
1bf20 61 73 73 65 72 74 28 20 7a 53 74 61 72 74 41 66  assert( zStartAf
1bf30 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  f==0 || sqlite3S
1bf40 74 72 6c 65 6e 33 30 28 7a 53 74 61 72 74 41 66  trlen30(zStartAf
1bf50 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 20 20 69  f)>=nEq );.    i
1bf60 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 20 63  f( zStartAff ) c
1bf70 45 6e 64 41 66 66 20 3d 20 7a 53 74 61 72 74 41  EndAff = zStartA
1bf80 66 66 5b 6e 45 71 5d 3b 0a 20 20 20 20 61 64 64  ff[nEq];.    add
1bf90 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
1bfa0 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  ddrNxt;..    /* 
1bfb0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1bfc0 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  a reverse order 
1bfd0 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e  scan on an ascen
1bfe0 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20  ding index, or. 
1bff0 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20     ** a forward 
1c000 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20  order scan on a 
1c010 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
1c020 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68  , interchange th
1c030 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20  e .    ** start 
1c040 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70  and end terms (p
1c050 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70  RangeStart and p
1c060 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a  RangeEnd)..    *
1c070 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70  /.    if( (nEq<p
1c080 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20  Idx->nKeyCol && 
1c090 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f  bRev==(pIdx->aSo
1c0a0 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51  rtOrder[nEq]==SQ
1c0b0 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20  LITE_SO_ASC)).  
1c0c0 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70     || (bRev && p
1c0d0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45  Idx->nKeyCol==nE
1c0e0 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
1c0f0 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a  SWAP(WhereTerm *
1c100 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61  , pRangeEnd, pRa
1c110 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 20  ngeStart);.     
1c120 20 53 57 41 50 28 75 38 2c 20 62 53 65 65 6b 50   SWAP(u8, bSeekP
1c130 61 73 74 4e 75 6c 6c 2c 20 62 53 74 6f 70 41 74  astNull, bStopAt
1c140 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Null);.    }..  
1c150 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1c160 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e  geStart && (pRan
1c170 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
1c180 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
1c190 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c1a0 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28  pRangeStart && (
1c1b0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
1c1c0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21  erator & WO_GE)!
1c1d0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1c1e0 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
1c1f0 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70   (pRangeEnd->eOp
1c200 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
1c210 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1c220 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
1c230 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70   (pRangeEnd->eOp
1c240 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21  erator & WO_GE)!
1c250 3d 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45  =0 );.    startE
1c260 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74  q = !pRangeStart
1c270 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d   || pRangeStart-
1c280 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1c290 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
1c2a0 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67  endEq =   !pRang
1c2b0 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e  eEnd || pRangeEn
1c2c0 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  d->eOperator & (
1c2d0 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
1c2e0 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
1c2f0 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72  nts = pRangeStar
1c300 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20  t || nEq>0;..   
1c310 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64   /* Seek the ind
1c320 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  ex cursor to the
1c330 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61   start of the ra
1c340 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  nge. */.    nCon
1c350 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
1c360 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61     if( pRangeSta
1c370 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
1c380 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1c390 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70  eStart->pExpr->p
1c3a0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
1c3b0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1c3c0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
1c3d0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
1c3e0 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72   if( (pRangeStar
1c3f0 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1c400 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20  M_VNULL)==0.    
1c410 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
1c420 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68  rCanBeNull(pRigh
1c430 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  t).      ){.    
1c440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c450 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1c460 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ll, regBase+nEq,
1c470 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
1c480 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1c490 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
1c4a0 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20    if( zStartAff 
1c4b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
1c4c0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1c4d0 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53  inity(pRight, zS
1c4e0 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53  tartAff[nEq])==S
1c4f0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b  QLITE_AFF_NONE){
1c500 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  .          /* Si
1c510 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  nce the comparis
1c520 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66  on is to be perf
1c530 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f  ormed with no co
1c540 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20  nversions.      
1c550 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74      ** applied t
1c560 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20  o the operands, 
1c570 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  set the affinity
1c580 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69   to apply to pRi
1c590 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ght to .        
1c5a0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    ** SQLITE_AFF_
1c5b0 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20  NONE.  */.      
1c5c0 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
1c5d0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
1c5e0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1c5f0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1c600 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1c610 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1c620 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
1c630 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
1c640 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
1c650 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1c660 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1c670 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43      }  .      nC
1c680 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
1c690 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1c6a0 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
1c6b0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1c6c0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
1c6d0 28 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20  ( bSeekPastNull 
1c6e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c6f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c700 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
1c710 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43  e+nEq);.      nC
1c720 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
1c730 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a     startEq = 0;.
1c740 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73        start_cons
1c750 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20  traints = 1;.   
1c760 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79   }.    codeApply
1c770 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
1c780 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
1c790 72 61 69 6e 74 20 2d 20 62 53 65 65 6b 50 61 73  raint - bSeekPas
1c7a0 74 4e 75 6c 6c 2c 20 7a 53 74 61 72 74 41 66 66  tNull, zStartAff
1c7b0 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61  );.    op = aSta
1c7c0 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73  rtOp[(start_cons
1c7d0 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73  traints<<2) + (s
1c7e0 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65  tartEq<<1) + bRe
1c7f0 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  v];.    assert( 
1c800 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  op!=0 );.    sql
1c810 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1c820 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
1c830 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
1c840 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
1c850 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1c860 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
1c870 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1c880 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20 20 74 65  =OP_Rewind);  te
1c890 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52  stcase( op==OP_R
1c8a0 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 56 64 62  ewind );.    Vdb
1c8b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1c8c0 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20 20 20 20  p==OP_Last);    
1c8d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1c8e0 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 56 64 62  _Last );.    Vdb
1c8f0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1c900 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 20 20  p==OP_SeekGT);  
1c910 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1c920 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20 56  _SeekGT );.    V
1c930 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c940 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 29 3b   op==OP_SeekGE);
1c950 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1c960 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20 20  OP_SeekGE );.   
1c970 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1c980 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45  v, op==OP_SeekLE
1c990 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1c9a0 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20  ==OP_SeekLE );. 
1c9b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1c9c0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
1c9d0 4c 54 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  LT);  testcase( 
1c9e0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 29 3b  op==OP_SeekLT );
1c9f0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
1ca00 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
1ca10 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1ca20 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
1ca30 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
1ca40 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
1ca50 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
1ca60 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
1ca70 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
1ca80 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
1ca90 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64  ight = pRangeEnd
1caa0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
1cab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1cac0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1cad0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
1cae0 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  q, 1);.      sql
1caf0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1cb00 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
1cb10 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
1cb20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d   if( (pRangeEnd-
1cb30 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1cb40 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20  VNULL)==0.      
1cb50 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
1cb60 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29  anBeNull(pRight)
1cb70 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1cb80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb90 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
1cba0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
1cbb0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20  ddrNxt);.       
1cbc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1cbd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cbe0 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
1cbf0 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
1cc00 74 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51 4c  t, cEndAff)!=SQL
1cc10 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20 20  ITE_AFF_NONE.   
1cc20 20 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 45      && !sqlite3E
1cc30 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
1cc40 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
1cc50 20 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20 20   cEndAff).      
1cc60 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 41  ){.        codeA
1cc70 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
1cc80 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  rse, regBase+nEq
1cc90 2c 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b 0a  , 1, &cEndAff);.
1cca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43        }.      nC
1ccb0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
1ccc0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1ccd0 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
1cce0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1ccf0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1cd00 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a 20  bStopAtNull ){. 
1cd10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cd20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1cd30 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
1cd40 71 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71 20  q);.      endEq 
1cd50 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  = 0;.      nCons
1cd60 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  traint++;.    }.
1cd70 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1cd80 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  e(db, zStartAff)
1cd90 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;..    /* Top of
1cda0 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a   the loop body *
1cdb0 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  /.    pLevel->p2
1cdc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1cdd0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
1cde0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
1cdf0 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
1ce00 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  is past the end 
1ce10 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
1ce20 0a 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74 72  .    if( nConstr
1ce30 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f 70  aint ){.      op
1ce40 20 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a 32   = aEndOp[bRev*2
1ce50 20 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20 20   + endEq];.     
1ce60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ce70 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
1ce80 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
1ce90 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
1cea0 69 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  int);.      test
1ceb0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
1cec0 47 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  GT );  VdbeCover
1ced0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1cee0 49 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20 74  IdxGT );.      t
1cef0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1cf00 49 64 78 47 45 20 29 3b 20 20 56 64 62 65 43 6f  IdxGE );  VdbeCo
1cf10 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1cf20 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20  OP_IdxGE );.    
1cf30 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1cf40 4f 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64 62  OP_IdxLT );  Vdb
1cf50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1cf60 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20  p==OP_IdxLT );. 
1cf70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1cf80 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20 20  p==OP_IdxLE );  
1cf90 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cfa0 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29  , op==OP_IdxLE )
1cfb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cfc0 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
1cfd0 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
1cfe0 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c  ed */.    disabl
1cff0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
1d000 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
1d010 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1d020 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
1d030 20 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c      if( omitTabl
1d040 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49  e ){.      /* pI
1d050 64 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  dx is a covering
1d060 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64   index.  No need
1d070 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d   to access the m
1d080 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ain table. */.  
1d090 20 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73 52    }else if( HasR
1d0a0 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
1d0b0 65 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  e) ){.      iRow
1d0c0 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65  idReg = ++pParse
1d0d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
1d0e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d0f0 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
1d100 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52  iIdxCur, iRowidR
1d110 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1d120 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1d130 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
1d140 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
1d150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d160 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65  AddOp2(v, OP_See
1d170 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  k, iCur, iRowidR
1d180 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65  eg);  /* Deferre
1d190 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 65  d seek */.    }e
1d1a0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
1d1b0 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
1d1c0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1d1d0 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20  Idx->pTable);.  
1d1e0 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1d1f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1d200 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d  nge(pParse, pPk-
1d210 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20  >nKeyCol);.     
1d220 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d   for(j=0; j<pPk-
1d230 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
1d240 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
1d250 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1d260 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f  (pIdx, pPk->aiCo
1d270 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  lumn[j]);.      
1d280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d290 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1d2a0 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69 52  , iIdxCur, k, iR
1d2b0 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20  owidReg+j);.    
1d2c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d2d0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1d2e0 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
1d2f0 43 75 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20  Cur, addrCont,. 
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d310 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
1d320 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Reg, pPk->nKeyCo
1d330 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
1d340 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (v);.    }..    
1d350 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
1d360 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
1d370 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
1d380 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
1d390 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
1d3a0 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
1d3b0 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
1d3c0 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
1d3d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d3e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d3f0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b   WHERE_ONEROW ){
1d400 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1d410 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1d420 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
1d430 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
1d440 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
1d450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d460 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1d470 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1d480 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
1d490 78 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  xCur;.    pLevel
1d4a0 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  ->p3 = (pLoop->w
1d4b0 73 46 6c 61 67 73 26 57 48 45 52 45 5f 55 4e 51  sFlags&WHERE_UNQ
1d4c0 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a  _WANTED)!=0 ? 1:
1d4d0 30 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  0;.    if( (pLoo
1d4e0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1d4f0 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
1d500 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
1d510 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
1d520 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
1d530 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
1d540 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1d550 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1d560 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1d570 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d580 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
1d590 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
1d5a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1d5b0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
1d5c0 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
1d5d0 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
1d5e0 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
1d5f0 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1d600 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
1d610 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1d620 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
1d630 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
1d640 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
1d650 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1d660 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
1d670 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
1d680 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
1d690 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1d6a0 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
1d6b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1d6c0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1d6d0 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
1d6e0 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
1d6f0 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
1d700 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
1d710 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
1d720 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
1d730 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
1d740 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
1d750 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
1d760 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1d770 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1d780 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1d7a0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1d7b0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1d7c0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
1d7d0 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
1d7e0 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
1d7f0 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
1d800 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
1d810 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
1d820 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
1d830 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1d840 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
1d850 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
1d860 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
1d870 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
1d880 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
1d890 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
1d8a0 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
1d8b0 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
1d8c0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1d8d0 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
1d8e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1d8f0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
1d900 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
1d910 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
1d920 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
1d930 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
1d940 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
1d950 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
1d960 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
1d970 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
1d980 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1d990 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
1d9a0 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
1d9b0 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
1d9c0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1d9d0 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
1d9e0 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
1d9f0 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
1da00 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
1da10 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
1da20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
1da30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1da40 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
1da50 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
1da60 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
1da70 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
1da80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
1da90 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
1daa0 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
1dab0 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
1dac0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1dad0 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
1dae0 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
1daf0 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
1db00 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
1db10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1db20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
1db30 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1db40 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
1db50 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
1db60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
1db70 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
1db80 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
1db90 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
1dba0 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
1dbb0 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
1dbc0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
1dbd0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
1dbe0 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
1dbf0 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
1dc00 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
1dc10 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
1dc20 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
1dc30 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
1dc40 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
1dc50 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
1dc60 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
1dc70 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
1dc80 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1dc90 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
1dca0 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
1dcb0 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
1dcc0 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
1dcd0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1dce0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
1dcf0 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
1dd00 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
1dd10 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
1dd20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd40 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
1dd50 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
1dd60 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
1dd70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1dd90 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
1dda0 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
1ddb0 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
1ddc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1ddd0 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20  l(v);  /* Start 
1dde0 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  of loop body */.
1ddf0 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74      int iRetInit
1de00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de20 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52   Address of regR
1de30 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20  eturn init */.  
1de40 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65    int untestedTe
1de50 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rms = 0;        
1de60 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72       /* Some ter
1de70 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ms not completel
1de80 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  y tested */.    
1de90 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1dec0 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  er */.    Expr *
1ded0 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1def0 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
1df00 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
1df10 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
1df20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
1df30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1df40 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
1df50 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
1df60 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29  erator & WO_OR )
1df70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
1df80 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1df90 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
1dfa0 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
1dfb0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1dfc0 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
1dfd0 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
1dfe0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1dff0 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
1e000 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
1e010 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f  ew SrcList in pO
1e020 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
1e030 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
1e040 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
1e050 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
1e060 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
1e070 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
1e080 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
1e090 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
1e0a0 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
1e0b0 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
1e0c0 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
1e0d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1e0e0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
1e0f0 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
1e100 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
1e110 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
1e120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e130 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
1e140 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
1e150 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1e160 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
1e170 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
1e180 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
1e190 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
1e1a0 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
1e1b0 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
1e1c0 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
1e1d0 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
1e1e0 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20  AllocRaw(db,.   
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1e210 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65  *pOrTab)+ nNotRe
1e220 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61  ady*sizeof(pOrTa
1e230 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  b->a[0]));.     
1e240 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29   if( pOrTab==0 )
1e250 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
1e260 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
1e270 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e  nAlloc = (u8)(nN
1e280 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20  otReady + 1);.  
1e290 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63      pOrTab->nSrc
1e2a0 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f   = pOrTab->nAllo
1e2b0 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  c;.      memcpy(
1e2c0 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49  pOrTab->a, pTabI
1e2d0 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61  tem, sizeof(*pTa
1e2e0 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f  bItem));.      o
1e2f0 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d  rigSrc = pWInfo-
1e300 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
1e310 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d      for(k=1; k<=
1e320 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b  nNotReady; k++){
1e330 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1e340 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26  &pOrTab->a[k], &
1e350 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b  origSrc[pLevel[k
1e360 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66  ].iFrom], sizeof
1e370 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b  (pOrTab->a[k]));
1e380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1e390 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  se{.      pOrTab
1e3a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1e3b0 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ist;.    }..    
1e3c0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1e3d0 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65  e rowset registe
1e3e0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  r to contain NUL
1e3f0 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69  L. An SQL NULL i
1e400 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  s .    ** equiva
1e410 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  lent to an empty
1e420 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a   rowset..    **.
1e430 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74      ** Also init
1e440 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e  ialize regReturn
1e450 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1e460 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  address of the i
1e470 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20  nstruction .    
1e480 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
1e490 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f  ollowing the OP_
1e4a0 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f  Return at the bo
1e4b0 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
1e4c0 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
1e4d0 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66   required in a f
1e4e0 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20  ew obscure LEFT 
1e4f0 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65  JOIN cases where
1e500 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20   control jumps. 
1e510 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74     ** over the t
1e520 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  op of the loop i
1e530 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
1e540 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
1e550 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72   the .    ** cor
1e560 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f  rect response fo
1e570 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  r the end-of-loo
1e580 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52  p code (the OP_R
1e590 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20  eturn) is to .  
1e5a0 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67    ** fall throug
1e5b0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
1e5c0 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20  struction, just 
1e5d0 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f  as an OP_Next do
1e5e0 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c  es if.    ** cal
1e5f0 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74  led on an uninit
1e600 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a  ialized cursor..
1e610 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1e620 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1e630 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
1e640 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
1e650 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
1e660 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1e670 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
1e680 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1e690 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1e6a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e6b0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
1e6c0 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
1e6d0 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
1e6e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e6f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
1e700 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
1e710 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  /* If the origin
1e720 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
1e730 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d  is z of the form
1e740 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  :  (x1 OR x2 OR 
1e750 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a  ...) AND y.    *
1e760 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79  * Then for every
1e770 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61   term xN, evalua
1e780 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70  te as the subexp
1e790 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20  ression: xN AND 
1e7a0 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  z.    ** That wa
1e7b0 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68  y, terms in y th
1e7c0 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20  at are factored 
1e7d0 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63  into the disjunc
1e7e0 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
1e7f0 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79   be picked up by
1e800 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
1e810 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57  alls to sqlite3W
1e820 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f  hereBegin() belo
1e830 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
1e840 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20   Actually, each 
1e850 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
1e860 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78   converted to "x
1e870 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77  N AND w" where w
1e880 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22   is.    ** the "
1e890 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72  interesting" ter
1e8a0 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20  ms of z - terms 
1e8b0 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  that did not ori
1e8c0 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20  ginate in the.  
1e8d0 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47    ** ON or USING
1e8e0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
1e8f0 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d  T JOIN, and term
1e900 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c  s that are usabl
1e910 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64  e as .    ** ind
1e920 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
1e930 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
1e940 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20  ation also only 
1e950 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28  applies if the (
1e960 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
1e970 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20   term.    ** is 
1e980 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1e990 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
1e9a0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
1e9b0 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74     ** See ticket
1e9c0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
1e9d0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
1e9e0 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a  f2369304e4.    *
1e9f0 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e  /.    if( pWC->n
1ea00 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20  Term>1 ){.      
1ea10 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  int iTerm;.     
1ea20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54   for(iTerm=0; iT
1ea30 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  erm<pWC->nTerm; 
1ea40 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  iTerm++){.      
1ea50 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1ea60 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
1ea70 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
1ea80 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20   &pWC->a[iTerm] 
1ea90 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69  == pTerm ) conti
1eaa0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1eab0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1eac0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
1ead0 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  oin) ) continue;
1eae0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1eaf0 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
1eb00 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
1eb10 4f 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20  ORINFO );.      
1eb20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d    testcase( pWC-
1eb30 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
1eb40 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1eb50 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1eb60 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
1eb70 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52  Flags & (TERM_OR
1eb80 49 4e 46 4f 7c 54 45 52 4d 5f 56 49 52 54 55 41  INFO|TERM_VIRTUA
1eb90 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
1eba0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d         if( (pWC-
1ebb0 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61  >a[iTerm].eOpera
1ebc0 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30  tor & WO_ALL)==0
1ebd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ebe0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1ebf0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1ec00 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1ec10 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71     pAndExpr = sq
1ec20 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1ec30 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72   pAndExpr, pExpr
1ec40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ec50 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
1ec60 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
1ec70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
1ec80 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c  (pParse, TK_AND,
1ec90 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29   0, pAndExpr, 0)
1eca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ecb0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1ecc0 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20  i<pOrWc->nTerm; 
1ecd0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  ii++){.      Whe
1ece0 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20  reTerm *pOrTerm 
1ecf0 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b  = &pOrWc->a[ii];
1ed00 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
1ed10 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
1ed20 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d  iCur || (pOrTerm
1ed30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1ed40 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
1ed50 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
1ed60 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
1ed70 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
1ed80 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
1ed90 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  an */.        Ex
1eda0 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f  pr *pOrExpr = pO
1edb0 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  rTerm->pExpr;.  
1edc0 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
1edd0 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
1ede0 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
1edf0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1ee00 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
1ee10 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
1ee20 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
1ee30 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
1ee40 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
1ee50 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
1ee60 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
1ee70 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
1ee80 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
1ee90 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f         pSubWInfo
1eea0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1eeb0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72  egin(pParse, pOr
1eec0 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c  Tab, pOrExpr, 0,
1eed0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
1eef0 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
1ef00 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  E | WHERE_AND_ON
1ef10 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  LY |.           
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
1ef30 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c  RE_FORCE_TABLE |
1ef40 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
1ef50 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a  ONLY, iCovCur);.
1ef60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ef70 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61  pSubWInfo || pPa
1ef80 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1ef90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1efa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
1efb0 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  bWInfo ){.      
1efc0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
1efd0 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  SubLoop;.       
1efe0 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
1eff0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
1f000 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
1f010 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
1f020 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65  ], iLevel, pLeve
1f030 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20  l->iFrom, 0.    
1f040 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1f050 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
1f060 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1f070 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
1f080 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1f090 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
1f0a0 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
1f0b0 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
1f0c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
1f0e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1f0f0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1f100 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c   pTabItem->pTab,
1f110 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20   -1, iCur, .    
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30       regRowid, 0
1f150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1f160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f170 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
1f180 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
1f190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
1f1c0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
1f1d0 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  , iSet);.       
1f1e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1f1f0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
1f200 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
1f210 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f220 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
1f230 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  turn, iLoopBody)
1f240 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
1f250 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
1f260 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
1f270 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
1f280 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
1f290 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
1f2a0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
1f2b0 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
1f2c0 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
1f2d0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
1f2e0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
1f2f0 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
1f300 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
1f310 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
1f320 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
1f330 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
1f340 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1f350 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
1f360 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
1f370 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
1f380 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
1f390 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66      /* If all of
1f3a0 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65   the OR-connecte
1f3b0 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69  d terms are opti
1f3c0 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
1f3d0 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
1f3e0 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65  * index, and the
1f3f0 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64   index is opened
1f400 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
1f410 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
1f420 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61          ** by ea
1f430 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
1f440 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d  e3WhereBegin() m
1f450 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ade by this loop
1f460 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20  , it may.       
1f470 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c     ** be possibl
1f480 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e  e to use that in
1f490 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e  dex as a coverin
1f4a0 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  g index..       
1f4b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
1f4c0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  ** If the call t
1f4d0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1f4e0 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75  gin() above resu
1f4f0 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74  lted in a scan t
1f500 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1f510 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
1f520 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68  and this is eith
1f530 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d  er the first OR-
1f540 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20  connected term. 
1f550 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1f560 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64  essed or the ind
1f570 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ex is the same a
1f580 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61  s that used by a
1f590 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20  ll previous.    
1f5a0 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20        ** terms, 
1f5b0 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20  set pCov to the 
1f5c0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
1f5d0 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77  ng index. Otherw
1f5e0 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20  ise, set .      
1f5f0 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e      ** pCov to N
1f600 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ULL to indicate 
1f610 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74  that no candidat
1f620 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
1f630 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20   will .         
1f640 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65   ** be available
1f650 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1f660 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f           pSubLoo
1f670 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  p = pSubWInfo->a
1f680 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  [0].pWLoop;.    
1f690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1f6a0 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
1f6b0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
1f6c0 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DEX)==0 );.     
1f6d0 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f       if( (pSubLo
1f6e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1f6f0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
1f700 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
1f710 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70  i==0 || pSubLoop
1f720 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1f730 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20  ==pCov).        
1f740 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1f750 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
1f760 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72  fo->a[0].iIdxCur
1f770 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20  ==iCovCur );.   
1f780 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
1f790 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
1f7a0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
1f7b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f7c0 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
1f7d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
1f7e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
1f7f0 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
1f800 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
1f810 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
1f820 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
1f830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1f840 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
1f850 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f860 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1f870 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
1f880 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28   = pCov;.    if(
1f890 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e   pCov ) pLevel->
1f8a0 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
1f8b0 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
1f8c0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
1f8d0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
1f8e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f8f0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41  xprDelete(db, pA
1f900 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
1f910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1f920 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
1f930 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
1f940 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
1f950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f960 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1f970 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
1f980 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
1f990 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f9a0 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
1f9b0 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
1f9c0 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
1f9d0 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
1f9e0 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
1f9f0 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
1fa00 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
1fa10 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
1fa20 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
1fa30 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
1fa40 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
1fa50 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
1fa60 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
1fa70 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
1fa80 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
1fa90 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
1faa0 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
1fab0 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
1fac0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
1fad0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
1fae0 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
1faf0 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
1fb00 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1fb10 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
1fb20 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
1fb30 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
1fb40 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
1fb50 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =1 );.    if( pT
1fb60 61 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73  abItem->isRecurs
1fb70 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
1fb80 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73  Tables marked is
1fb90 52 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f  Recursive have o
1fba0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
1fbb0 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
1fbc0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73  in.      ** a ps
1fbd0 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f  eudo-cursor.  No
1fbe0 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20   need to Rewind 
1fbf0 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72  or Next such cur
1fc00 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  sors. */.      p
1fc10 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1fc20 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oop;.    }else{.
1fc30 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
1fc40 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
1fc50 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
1fc60 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
1fc70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
1fc80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fc90 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
1fca0 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
1fcb0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1fcc0 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d  erageIf(v, bRev=
1fcd0 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  =0);.      VdbeC
1fce0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
1fcf0 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65  v!=0);.      pLe
1fd00 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
1fd10 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
1fd20 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
1fd30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
1fd40 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
1fd50 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
1fd60 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
1fd70 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
1fd80 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
1fd90 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
1fda0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
1fdb0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1fdc0 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
1fdd0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
1fde0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1fdf0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1fe00 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1fe10 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1fe20 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1fe30 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1fe40 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
1fe50 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
1fe60 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
1fe70 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
1fe80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1fe90 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1fea0 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
1feb0 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
1fec0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fed0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
1fee0 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
1fef0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1ff00 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1ff10 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
1ff20 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
1ff30 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
1ff40 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
1ff50 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1ff60 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
1ff70 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
1ff80 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
1ff90 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1ffa0 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
1ffb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ffc0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
1ffd0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
1ffe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1fff0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
20000 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
20010 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
20020 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
20030 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
20040 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
20050 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
20060 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
20070 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
20080 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
20090 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
200a0 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
200b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
200c0 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
200d0 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
200e0 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
200f0 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
20100 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
20110 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
20120 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
20130 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
20140 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
20150 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
20160 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
20170 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
20180 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
20190 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
201a0 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
201b0 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
201c0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
201d0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
201e0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
201f0 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
20200 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
20210 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
20220 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
20230 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
20240 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
20250 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
20260 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
20270 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
20280 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
20290 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
202a0 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
202b0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
202c0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
202d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
202e0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
202f0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
20300 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
20310 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
20320 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
20330 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
20340 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  ight & pLevel->n
20350 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
20360 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
20370 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
20380 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
20390 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
203a0 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
203b0 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
203c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
203d0 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
203e0 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
203f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
20400 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
20410 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
20420 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20430 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
20440 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
20450 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
20460 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72  nt((v, "begin tr
20470 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
20480 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c  int"));.    pEAl
20490 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  t = sqlite3Stack
204a0 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  AllocRaw(db, siz
204b0 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20  eof(*pEAlt));.  
204c0 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20    if( pEAlt ){. 
204d0 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70       *pEAlt = *p
204e0 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
204f0 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d    pEAlt->pLeft =
20500 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20   pE->pLeft;.    
20510 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
20520 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 41  alse(pParse, pEA
20530 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  lt, addrCont, SQ
20540 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
20550 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
20560 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41  tackFree(db, pEA
20570 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  lt);.    }.  }..
20580 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
20590 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
205a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
205b0 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
205c0 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74  act that.  ** at
205d0 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f   least one row o
205e0 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
205f0 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68  e has matched th
20600 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a  e left table.  .
20610 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
20620 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
20630 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
20640 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
20650 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
20660 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
20670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20680 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65  nteger, 1, pLeve
20690 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
206a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
206b0 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20  v, "record LEFT 
206c0 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
206d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
206e0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
206f0 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
20700 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43  C->a, j=0; j<pWC
20710 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  ->nTerm; j++, pT
20720 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  erm++){.      te
20730 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
20740 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20750 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
20760 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
20770 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
20780 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
20790 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
207a0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
207b0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
207c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
207d0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
207e0 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
207f0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
20800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
20810 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
20820 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
20830 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20840 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
20850 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
20860 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20870 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
20880 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
20890 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
208a0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
208b0 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
208c0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
208d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
208e0 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  turn pLevel->not
208f0 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65  Ready;.}..#if de
20900 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
20910 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66  _ENABLED) && def
20920 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
20930 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
20940 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20950 22 45 78 70 6c 61 6e 61 74 69 6f 6e 22 20 74 65  "Explanation" te
20960 78 74 20 66 6f 72 20 61 20 57 68 65 72 65 54 65  xt for a WhereTe
20970 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
20980 69 64 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54  id whereExplainT
20990 65 72 6d 28 56 64 62 65 20 2a 76 2c 20 57 68 65  erm(Vdbe *v, Whe
209a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
209b0 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
209c0 0a 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c  .  memcpy(zType,
209d0 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 69 66   "...", 4);.  if
209e0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
209f0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
20a00 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27  ) zType[0] = 'V'
20a10 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  ;.  if( pTerm->e
20a20 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
20a30 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
20a40 3d 20 27 45 27 3b 0a 20 20 69 66 28 20 45 78 70  = 'E';.  if( Exp
20a50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
20a60 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
20a70 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b  omJoin) ) zType[
20a80 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 73 71 6c 69  2] = 'L';.  sqli
20a90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
20aa0 28 76 2c 20 22 25 73 20 22 2c 20 7a 54 79 70 65  (v, "%s ", zType
20ab0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
20ac0 61 69 6e 45 78 70 72 28 76 2c 20 70 54 65 72 6d  ainExpr(v, pTerm
20ad0 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 23 65 6e 64  ->pExpr);.}.#end
20ae0 69 66 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45  if /* WHERETRACE
20af0 5f 45 4e 41 42 4c 45 44 20 26 26 20 53 51 4c 49  _ENABLED && SQLI
20b00 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
20b10 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64  XPLAIN */...#ifd
20b20 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
20b30 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
20b40 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
20b50 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
20b60 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
20b70 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20b80 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
20b90 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
20ba0 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
20bb0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
20bc0 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
20bd0 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
20be0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
20bf0 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
20c00 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20c10 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
20c20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
20c30 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
20c40 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
20c50 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  ab;.  sqlite3Deb
20c60 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
20c70 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
20c80 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
20ca0 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
20cb0 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
20cc0 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33  ereq);.  sqlite3
20cd0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
20ce0 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
20cf0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
20d00 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
20d10 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
20d20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
20d30 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
20d40 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
20d50 3d 30 20 29 7b 0a 20 20 20 20 20 63 6f 6e 73 74  =0 ){.     const
20d60 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
20d70 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
20d80 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61  e.pIndex && (zNa
20d90 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
20da0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d  pIndex->zName)!=
20db0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
20dc0 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
20dd0 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
20de0 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
20df0 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
20e00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
20e10 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
20e20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
20e30 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
20e40 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
20e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
20e60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
20e70 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
20e80 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
20e90 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
20ea0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
20eb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
20ec0 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
20ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
20ee0 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
20ef0 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
20f00 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
20f10 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
20f20 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
20f30 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
20f40 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
20f50 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
20f60 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
20f70 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
20f80 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
20f90 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
20fa0 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
20fb0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
20fc0 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
20fd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
20fe0 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
20ff0 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
21000 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
21010 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21020 69 6e 74 66 28 22 20 66 20 25 30 34 78 20 4e 20  intf(" f %04x N 
21030 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
21040 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73   p->nLTerm);.  s
21050 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
21060 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25  f(" cost %d,%d,%
21070 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c  d\n", p->rSetup,
21080 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
21090 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
210a0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
210b0 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
210c0 65 20 30 78 31 30 30 20 62 69 74 20 6f 66 20 77  e 0x100 bit of w
210d0 68 65 72 65 74 72 61 63 69 6e 67 20 69 73 20 73  heretracing is s
210e0 65 74 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c  et, then show al
210f0 6c 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72 61  l of the constra
21100 69 6e 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  int.  ** express
21110 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 68 65 72  ions in the Wher
21120 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d 5b 5d 20 61  eLoop.aLTerm[] a
21130 72 72 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rray..  */.  if(
21140 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73   p->nLTerm && (s
21150 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
21160 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 20   & 0x100)!=0 ){ 
21170 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45 20 30   /* WHERETRACE 0
21180 78 31 30 30 20 2a 2f 0a 20 20 20 20 69 6e 74 20  x100 */.    int 
21190 69 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  i;.    Vdbe *v =
211a0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
211b0 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69  >pVdbe;.    sqli
211c0 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28  te3ExplainBegin(
211d0 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  v);.    for(i=0;
211e0 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b   i<p->nLTerm; i+
211f0 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
21200 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 70 2d 3e  erm *pTerm = p->
21210 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20  aLTerm[i];.     
21220 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
21230 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21240 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
21250 69 6e 74 66 28 76 2c 20 22 20 20 28 25 64 29 20  intf(v, "  (%d) 
21260 23 25 2d 32 64 20 22 2c 20 69 2b 31 2c 20 28 69  #%-2d ", i+1, (i
21270 6e 74 29 28 70 54 65 72 6d 2d 70 57 43 2d 3e 61  nt)(pTerm-pWC->a
21280 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
21290 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b  3ExplainPush(v);
212a0 0a 20 20 20 20 20 20 77 68 65 72 65 45 78 70 6c  .      whereExpl
212b0 61 69 6e 54 65 72 6d 28 76 2c 20 70 54 65 72 6d  ainTerm(v, pTerm
212c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
212d0 45 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20  ExplainPop(v);. 
212e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
212f0 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a  ainNL(v);.    }.
21300 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
21310 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20  inFinish(v);.   
21320 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
21330 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
21340 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e  3VdbeExplanation
21350 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (v));.  }.#endif
21360 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21370 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65   Convert bulk me
21380 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69  mory into a vali
21390 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  d WhereLoop that
213a0 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a   can be passed.*
213b0 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c  * to whereLoopCl
213c0 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a  ear harmlessly..
213d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
213e0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65  hereLoopInit(Whe
213f0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d  reLoop *p){.  p-
21400 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54  >aLTerm = p->aLT
21410 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e  ermSpace;.  p->n
21420 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e  LTerm = 0;.  p->
21430 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  nLSlot = ArraySi
21440 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  ze(p->aLTermSpac
21450 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73  e);.  p->wsFlags
21460 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
21470 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f  lear the WhereLo
21480 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61  op.u union.  Lea
21490 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54  ve WhereLoop.pLT
214a0 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73  erm intact..*/.s
214b0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
214c0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73  LoopClearUnion(s
214d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
214e0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
214f0 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57   p->wsFlags & (W
21500 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
21510 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  E|WHERE_AUTO_IND
21520 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  EX) ){.    if( (
21530 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21540 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
21550 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62  !=0 && p->u.vtab
21560 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
21570 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21580 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
21590 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  );.      p->u.vt
215a0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
215b0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
215c0 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  .idxStr = 0;.   
215d0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77   }else if( (p->w
215e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
215f0 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  UTO_INDEX)!=0 &&
21600 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
21610 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex!=0 ){.      s
21620 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21630 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
21640 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  ex->zColAff);.  
21650 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
21660 66 6f 55 6e 72 65 66 28 70 2d 3e 75 2e 62 74 72  foUnref(p->u.btr
21670 65 65 2e 70 49 6e 64 65 78 2d 3e 70 4b 65 79 49  ee.pIndex->pKeyI
21680 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
21690 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
216a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
216b0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
216c0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
216d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
216e0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
216f0 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
21700 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
21710 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
21720 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
21730 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
21740 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
21750 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
21760 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
21770 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
21780 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
21790 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
217a0 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
217b0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
217c0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
217d0 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
217e0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
217f0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
21800 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
21810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21820 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
21830 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
21840 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
21850 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
21860 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
21870 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
21880 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21890 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
218a0 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
218b0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
218c0 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
218d0 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
218e0 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
218f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21900 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70   memcpy(paNew, p
21910 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66  ->aLTerm, sizeof
21920 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70  (p->aLTerm[0])*p
21930 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28  ->nLSlot);.  if(
21940 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
21950 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
21960 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
21970 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e  ->aLTerm);.  p->
21980 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a  aLTerm = paNew;.
21990 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b    p->nLSlot = n;
219a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
219b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
219c0 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66  ansfer content f
219d0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70  rom the second p
219e0 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69  Loop into the fi
219f0 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rst..*/.static i
21a00 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  nt whereLoopXfer
21a10 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
21a20 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68  ereLoop *pTo, Wh
21a30 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b  ereLoop *pFrom){
21a40 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
21a50 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
21a60 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
21a70 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20  Resize(db, pTo, 
21a80 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29  pFrom->nLTerm) )
21a90 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54  {.    memset(&pT
21aa0 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  o->u, 0, sizeof(
21ab0 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65  pTo->u));.    re
21ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
21ad0 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
21ae0 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
21af0 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
21b00 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
21b10 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
21b20 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
21b30 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
21b40 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
21b50 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
21b60 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
21b70 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
21b80 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
21b90 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
21ba0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
21bb0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
21bc0 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
21bd0 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
21be0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
21bf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21c00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
21c10 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
21c20 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
21c30 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
21c40 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
21c50 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
21c60 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
21c70 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
21c80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21c90 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  p);.}../*.** Fre
21ca0 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
21cb0 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
21cc0 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
21cd0 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
21ce0 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
21cf0 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
21d00 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
21d10 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
21d20 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
21d30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
21d40 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
21d50 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
21d60 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  p = pWInfo->pLoo
21d70 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ps;.      pWInfo
21d80 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
21d90 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
21da0 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
21db0 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, p);.    }.   
21dc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21dd0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
21de0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21df0 54 52 55 45 20 69 66 20 62 6f 74 68 20 6f 66 20  TRUE if both of 
21e00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
21e10 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
21e20 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20 73  (1)  X has the s
21e30 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
21e40 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32  t that Y.**   (2
21e50 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  )  X is a proper
21e60 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 0a   subset of Y.**.
21e70 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73 75  ** By "proper su
21e80 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68  bset" we mean th
21e90 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 20  at X uses fewer 
21ea0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
21eb0 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64  ms.** than Y and
21ec0 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
21ed0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
21ee0 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20  ed by X is also 
21ef0 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a  used.** by Y..**
21f00 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70 72  .** If X is a pr
21f10 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
21f20 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65 74   then Y is a bet
21f30 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f  ter choice and o
21f40 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20  ught.** to have 
21f50 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54  a lower cost.  T
21f60 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
21f70 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74 68  rns TRUE when th
21f80 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61  at cost .** rela
21f90 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65  tionship is inve
21fa0 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  rted and needs t
21fb0 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 0a 2a  o be adjusted..*
21fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
21fd0 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
21fe0 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e  perSubset(.  con
21ff0 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58  st WhereLoop *pX
22000 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
22010 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f   WhereLoop to co
22020 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  mpare */.  const
22030 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20   WhereLoop *pY  
22040 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
22050 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57 68   against this Wh
22060 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ereLoop */.){.  
22070 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20  int i, j;.  if( 
22080 70 58 2d 3e 6e 4c 54 65 72 6d 20 3e 3d 20 70 59  pX->nLTerm >= pY
22090 2d 3e 6e 4c 54 65 72 6d 20 29 20 72 65 74 75 72  ->nLTerm ) retur
220a0 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74  n 0; /* X is not
220b0 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a   a subset of Y *
220c0 2f 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e  /.  if( pX->rRun
220d0 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a   >= pY->rRun ){.
220e0 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e      if( pX->rRun
220f0 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65   > pY->rRun ) re
22100 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
22110 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
22120 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d  Y */.    if( pX-
22130 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74  >nOut > pY->nOut
22140 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
22150 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20  /* X costs more 
22160 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  than Y */.  }.  
22170 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d  for(i=pX->nLTerm
22180 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
22190 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c      for(j=pY->nL
221a0 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
221b0 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59  -){.      if( pY
221c0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d  ->aLTerm[j]==pX-
221d0 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65  >aLTerm[i] ) bre
221e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
221f0 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30  ( j<0 ) return 0
22200 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75  ;  /* X not a su
22210 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20  bset of Y since 
22220 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73  term X[i] not us
22230 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20  ed by Y */.  }. 
22240 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
22250 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65  ll conditions me
22260 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  et */.}../*.** T
22270 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ry to adjust the
22280 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   cost of WhereLo
22290 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77  op pTemplate upw
222a0 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64  ards or downward
222b0 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a  s so.** that:.**
222c0 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c  .**   (1) pTempl
222d0 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74  ate costs less t
222e0 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
222f0 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72  ereLoops that ar
22300 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20  e a proper.**   
22310 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54      subset of pT
22320 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20  emplate.**.**   
22330 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (2) pTemplate co
22340 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e  sts more than an
22350 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
22360 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65  ps for which pTe
22370 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  mplate.**       
22380 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
22390 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79  et..**.** To say
223a0 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73   "WhereLoop X is
223b0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
223c0 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61   of Y" means tha
223d0 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a  t X uses fewer.*
223e0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
223f0 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20  erms than Y and 
22400 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
22410 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
22420 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73  d by X is.** als
22430 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2a 0a  o used by Y..**.
22440 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
22450 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  nt is omitted fo
22460 72 20 53 4b 49 50 53 43 41 4e 20 6c 6f 6f 70 73  r SKIPSCAN loops
22470 2e 20 20 49 6e 20 61 20 53 4b 49 50 53 43 41 4e  .  In a SKIPSCAN
22480 20 6c 6f 6f 70 2c 20 74 68 65 0a 2a 2a 20 57 68   loop, the.** Wh
22490 65 72 65 4c 6f 6f 70 2e 6e 4c 54 65 72 6d 20 66  ereLoop.nLTerm f
224a0 69 65 6c 64 20 69 73 20 6e 6f 74 20 61 6e 20 61  ield is not an a
224b0 63 63 75 72 61 74 65 20 6d 65 61 73 75 72 65 20  ccurate measure 
224c0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
224d0 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65   WHERE.** clause
224e0 20 74 65 72 6d 73 20 63 6f 76 65 72 65 64 2c 20   terms covered, 
224f0 73 69 6e 63 65 20 73 6f 6d 65 20 6f 66 20 74 68  since some of th
22500 65 20 66 69 72 73 74 20 6e 4c 54 65 72 6d 20 65  e first nLTerm e
22510 6e 74 72 69 65 73 20 69 6e 20 61 4c 54 65 72 6d  ntries in aLTerm
22520 5b 5d 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 4e 55  [].** will be NU
22530 4c 4c 20 28 62 65 63 61 75 73 65 20 74 68 65 79  LL (because they
22540 20 61 72 65 20 73 6b 69 70 70 65 64 29 2e 20 20   are skipped).  
22550 54 68 61 74 20 6d 61 6b 65 73 20 69 74 20 6d 6f  That makes it mo
22560 72 65 20 64 69 66 66 69 63 75 6c 74 0a 2a 2a 20  re difficult.** 
22570 74 6f 20 63 6f 6d 70 61 72 65 20 74 68 65 20 6c  to compare the l
22580 6f 6f 70 73 2e 20 20 57 65 20 63 6f 75 6c 64 20  oops.  We could 
22590 61 64 64 20 65 78 74 72 61 20 63 6f 64 65 20 74  add extra code t
225a0 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  o do the compari
225b0 73 6f 6e 2c 20 61 6e 64 0a 2a 2a 20 70 65 72 68  son, and.** perh
225c0 61 70 73 20 77 65 20 77 69 6c 6c 20 73 6f 6d 65  aps we will some
225d0 64 61 79 2e 20 20 42 75 74 20 53 4b 49 50 53 43  day.  But SKIPSC
225e0 41 4e 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  AN is sufficient
225f0 6c 79 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64  ly uncommon, and
22600 20 74 68 69 73 0a 2a 2a 20 61 64 6a 75 73 74 6d   this.** adjustm
22610 65 6e 74 20 69 73 20 73 75 66 66 69 63 69 65 6e  ent is sufficien
22620 74 20 6d 69 6e 6f 72 2c 20 74 68 61 74 20 69 74  t minor, that it
22630 20 69 73 20 76 65 72 79 20 64 69 66 66 69 63 75   is very difficu
22640 6c 74 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 0a  lt to construct.
22650 2a 2a 20 61 20 74 65 73 74 20 63 61 73 65 20 77  ** a test case w
22660 68 65 72 65 20 74 68 65 20 65 78 74 72 61 20 63  here the extra c
22670 6f 64 65 20 77 6f 75 6c 64 20 69 6d 70 72 6f 76  ode would improv
22680 65 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  e the query plan
22690 2e 20 20 42 65 74 74 65 72 0a 2a 2a 20 74 6f 20  .  Better.** to 
226a0 61 76 6f 69 64 20 74 68 65 20 61 64 64 65 64 20  avoid the added 
226b0 63 6f 6d 70 6c 65 78 69 74 79 20 61 6e 64 20 6a  complexity and j
226c0 75 73 74 20 6f 6d 69 74 20 63 6f 73 74 20 61 64  ust omit cost ad
226d0 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 53 4b 49  justments to SKI
226e0 50 53 43 41 4e 0a 2a 2a 20 6c 6f 6f 70 73 2e 0a  PSCAN.** loops..
226f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
22700 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
22710 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  st(const WhereLo
22720 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70  op *p, WhereLoop
22730 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
22740 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e  if( (pTemplate->
22750 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
22760 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65  INDEXED)==0 ) re
22770 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 54 65  turn;.  if( (pTe
22780 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
22790 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
227a0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
227b0 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70   for(; p; p=p->p
227c0 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69  NextLoop){.    i
227d0 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
227e0 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f  plate->iTab ) co
227f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
22800 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
22810 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
22820 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22830 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
22840 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
22850 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
22860 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
22870 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
22880 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61  ubset(p, pTempla
22890 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  te) ){.      /* 
228a0 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
228b0 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73   cost downward s
228c0 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65  o that it is che
228d0 61 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20  aper than its . 
228e0 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70       ** subset p
228f0 20 2a 2f 0a 20 20 20 20 20 20 70 54 65 6d 70 6c   */.      pTempl
22900 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
22910 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
22920 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
22930 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65  nOut - 1;.    }e
22940 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  lse if( whereLoo
22950 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
22960 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  bset(pTemplate, 
22970 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p) ){.      /* A
22980 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
22990 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74  cost upward so t
229a0 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69  hat it is costli
229b0 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a  er than p since.
229c0 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61        ** pTempla
229d0 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  te is a proper s
229e0 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20  ubset of p */.  
229f0 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
22a00 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
22a10 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
22a20 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b  nOut = p->nOut +
22a30 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
22a40 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
22a50 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
22a60 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20  oops in *ppPrev 
22a70 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20  looking for one 
22a80 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73  that can be.** s
22a90 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65  upplanted by pTe
22aa0 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  mplate..**.** Re
22ab0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
22ac0 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20   WhereLoop list 
22ad0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72  contains an entr
22ae0 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c  y that can suppl
22af0 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65  ant.** pTemplate
22b00 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
22b10 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f   if pTemplate do
22b20 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e  es not belong on
22b30 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
22b40 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72   If pX is a Wher
22b50 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70  eLoop that pTemp
22b60 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e  late can supplan
22b70 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  t, then return t
22b80 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20  he.** link that 
22b90 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a  points to pX..**
22ba0 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65  .** If pTemplate
22bb0 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74   cannot supplant
22bc0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c   any existing el
22bd0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
22be0 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74  t but needs.** t
22bf0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
22c00 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74  e list, then ret
22c10 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22c20 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
22c30 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
22c40 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65   WhereLoop **whe
22c50 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
22c60 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  (.  WhereLoop **
22c70 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20  ppPrev,.  const 
22c80 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
22c90 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c  late.){.  WhereL
22ca0 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  oop *p;.  for(p=
22cb0 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70  (*ppPrev); p; pp
22cc0 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
22cd0 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
22ce0 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
22cf0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
22d00 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
22d10 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
22d20 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
22d30 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
22d40 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
22d50 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
22d60 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
22d70 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
22d80 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
22d90 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
22da0 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
22db0 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
22dc0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
22dd0 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
22de0 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
22df0 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
22e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
22e10 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
22e20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
22e30 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
22e40 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
22e50 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
22e60 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
22e70 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
22e80 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
22e90 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
22ea0 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
22eb0 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
22ec0 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
22ed0 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
22ee0 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
22ef0 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
22f00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
22f10 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
22f20 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
22f30 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
22f40 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
22f50 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
22f60 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
22f70 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
22f80 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
22f90 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
22fa0 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
22fb0 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
22fc0 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
22fd0 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
22fe0 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
22ff0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
23000 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
23010 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
23020 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74  .    /* If exist
23030 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20  ing WhereLoop p 
23040 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  is better than p
23050 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c  Template, pTempl
23060 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ate can be.    *
23070 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 57 68  * discarded.  Wh
23080 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74  ereLoop p is bet
23090 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20  ter if:.    **  
230a0 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d   (1)  p has no m
230b0 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ore dependencies
230c0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
230d0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32   and.    **   (2
230e0 29 20 20 70 20 68 61 73 20 61 6e 20 65 71 75 61  )  p has an equa
230f0 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  l or lower cost 
23100 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20  than pTemplate. 
23110 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
23120 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
23130 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
23140 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28  ->prereq    /* (
23150 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  1)  */.     && p
23160 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c  ->rSetup<=pTempl
23170 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20  ate->rSetup     
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23190 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2a) */.     && 
231a0 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61  p->rRun<=pTempla
231b0 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20  te->rRun        
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
231d0 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2b) */.     &&
231e0 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c   p->nOut<=pTempl
231f0 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23210 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b  * (2c) */.    ){
23220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
23230 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65    /* Discard pTe
23240 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a  mplate */.    }.
23250 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70  .    /* If pTemp
23260 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73 20 62  late is always b
23270 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68  etter than p, th
23280 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62 65  en cause p to be
23290 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20   overwritten.   
232a0 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61   ** with pTempla
232b0 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69  te.  pTemplate i
232c0 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 20  s better than p 
232d0 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
232e0 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20    pTemplate has 
232f0 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e  no more dependen
23300 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a  ces than p, and.
23310 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54      **   (2)  pT
23320 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65  emplate has an e
23330 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f  qual or lower co
23340 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a  st than p..    *
23350 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
23360 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
23370 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
23380 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f  late->prereq   /
23390 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26  * (1)  */.     &
233a0 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70  & p->rRun>=pTemp
233b0 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20  late->rRun      
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233d0 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a         /* (2a) *
233e0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
233f0 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t>=pTemplate->nO
23400 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23420 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b  * (2b) */.    ){
23430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23440 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c  ->rSetup>=pTempl
23450 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f  ate->rSetup ); /
23460 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  * SETUP-INVARIAN
23470 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20  T above */.     
23480 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75   break;   /* Cau
23490 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77  se p to be overw
234a0 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c  ritten by pTempl
234b0 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ate */.    }.  }
234c0 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72 65 76  .  return ppPrev
234d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
234e0 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57  t or replace a W
234f0 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75  hereLoop entry u
23500 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74  sing the templat
23510 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a  e supplied..**.*
23520 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68  * An existing Wh
23530 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69  ereLoop entry mi
23540 67 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74  ght be overwritt
23550 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65  en if the new te
23560 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74  mplate.** is bet
23570 74 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65  ter and has fewe
23580 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20  r dependencies. 
23590 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65   Or the template
235a0 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
235b0 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72  .** and no inser
235c0 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20  t will occur if 
235d0 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
235e0 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20  eLoop is faster 
235f0 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72  and has.** fewer
23600 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
23610 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  an the template.
23620 20 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65    Otherwise a ne
23630 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a  w WhereLoop is.*
23640 2a 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e  * added based on
23650 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a   the template..*
23660 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72  *.** If pBuilder
23670 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20  ->pOrSet is not 
23680 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72  NULL then we car
23690 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65  e about only the
236a0 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65  .** prerequisite
236b0 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e  s and rRun and n
236c0 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65  Out costs of the
236d0 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20   N best loops.  
236e0 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  That.** informat
236f0 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20  ion is gathered 
23700 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d  in the pBuilder-
23710 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20  >pOrSet object. 
23720 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a   This special.**
23730 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65   processing mode
23740 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f   is used only fo
23750 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63  r OR clause proc
23760 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68  essing..**.** Wh
23770 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  en accumulating 
23780 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28  multiple loops (
23790 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70  when pBuilder->p
237a0 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77  OrSet is NULL) w
237b0 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74  e.** still might
237c0 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c   overwrite simil
237d0 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68  ar loops with th
237e0 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  e new template i
237f0 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d  f the.** new tem
23800 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e  plate is better.
23810 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f    Loops may be o
23820 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
23830 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  e following .** 
23840 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d  conditions are m
23850 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  et:.**.**    (1)
23860 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
23870 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20  same iTab..**   
23880 20 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20   (2)  They have 
23890 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64  the same iSortId
238a0 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68  x..**    (3)  Th
238b0 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73  e template has s
238c0 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70  ame or fewer dep
238d0 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
238e0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
238f0 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74  **    (4)  The t
23900 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20  emplate has the 
23910 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f  same or lower co
23920 73 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  st than the curr
23930 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74  ent loop.*/.stat
23940 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
23950 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70  Insert(WhereLoop
23960 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
23970 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  r, WhereLoop *pT
23980 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72  emplate){.  Wher
23990 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20  eLoop **ppPrev, 
239a0 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  *p;.  WhereInfo 
239b0 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
239c0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71  er->pWInfo;.  sq
239d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
239e0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
239f0 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65  .  /* If pBuilde
23a00 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66  r->pOrSet is def
23a10 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ined, then only 
23a20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  keep track of th
23a30 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64  e costs.  ** and
23a40 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20   prereqs..  */. 
23a50 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70   if( pBuilder->p
23a60 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66 20  OrSet!=0 ){.#if 
23a70 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
23a80 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20 70  ED.    u16 n = p
23a90 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d  Builder->pOrSet-
23aa0 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a  >n;.    int x =.
23ab0 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65  #endif.    where
23ac0 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  OrInsert(pBuilde
23ad0 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70  r->pOrSet, pTemp
23ae0 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54  late->prereq, pT
23af0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20  emplate->rRun,. 
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
23b30 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52  ut);.#if WHERETR
23b40 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
23b50 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  x8 */.    if( sq
23b60 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
23b70 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73  & 0x8 ){.      s
23b80 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23b90 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20  f(x?"   or-%d:  
23ba0 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20  ":"   or-X:  ", 
23bb0 6e 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  n);.      whereL
23bc0 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
23bd0 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
23be0 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
23bf0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23c00 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
23c10 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69   Look for an exi
23c20 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
23c30 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74 68 20  to replace with 
23c40 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20  pTemplate.  */. 
23c50 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74   whereLoopAdjust
23c60 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Cost(pWInfo->pLo
23c70 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
23c80 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68 65 72  .  ppPrev = wher
23c90 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
23ca0 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  &pWInfo->pLoops,
23cb0 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20   pTemplate);..  
23cc0 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b  if( ppPrev==0 ){
23cd0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c  .    /* There al
23ce0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 57  ready exists a W
23cf0 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20  hereLoop on the 
23d00 6c 69 73 74 20 74 68 61 74 20 69 73 20 62 65 74  list that is bet
23d10 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
23d20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75  pTemplate, so ju
23d30 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c  st ignore pTempl
23d40 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ate */.#if WHERE
23d50 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
23d60 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20   0x8 */.    if( 
23d70 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
23d80 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
23d90 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23da0 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22  ntf("ins-noop: "
23db0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
23dc0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
23dd0 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
23de0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
23df0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23e00 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b  E_OK;  .  }else{
23e10 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65 76  .    p = *ppPrev
23e20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
23e30 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
23e40 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  nt it means that
23e50 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75   either p[] shou
23e60 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ld be overwritte
23e70 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d  n.  ** with pTem
23e80 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65  plate[] if p[] e
23e90 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d  xists, or if p==
23ea0 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  NULL then alloca
23eb0 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68  te a new.  ** Wh
23ec0 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65  ereLoop and inse
23ed0 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20  rt it..  */.#if 
23ee0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
23ef0 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69  ED /* 0x8 */.  i
23f00 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
23f10 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
23f20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
23f30 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23f40 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a  Printf("ins-del:
23f50 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72    ");.      wher
23f60 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42  eLoopPrint(p, pB
23f70 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
23f80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
23f90 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
23fa0 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68  new:  ");.    wh
23fb0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
23fc0 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
23fd0 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->pWC);.  }.#end
23fe0 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  if.  if( p==0 ){
23ff0 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
24000 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70   a new WhereLoop
24010 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65   to add to the e
24020 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a  nd of the list *
24030 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20  /.    *ppPrev = 
24040 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
24050 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
24060 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20  f(WhereLoop));. 
24070 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
24080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
24090 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  M;.    whereLoop
240a0 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e  Init(p);.    p->
240b0 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20  pNextLoop = 0;. 
240c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57   }else{.    /* W
240d0 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  e will be overwr
240e0 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  iting WhereLoop 
240f0 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65  p[].  But before
24100 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20   we do, first.  
24110 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20    ** go through 
24120 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
24130 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20  list and delete 
24140 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65  any other entrie
24150 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a  s besides.    **
24160 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c   p[] that are al
24170 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79 20  so supplated by 
24180 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
24190 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54   WhereLoop **ppT
241a0 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c  ail = &p->pNextL
241b0 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  oop;.    WhereLo
241c0 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20  op *pToDel;.    
241d0 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29  while( *ppTail )
241e0 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d  {.      ppTail =
241f0 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65   whereLoopFindLe
24200 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65  sser(ppTail, pTe
24210 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69  mplate);.      i
24220 66 28 20 4e 45 56 45 52 28 70 70 54 61 69 6c 3d  f( NEVER(ppTail=
24230 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
24240 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54     pToDel = *ppT
24250 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ail;.      if( p
24260 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b  ToDel==0 ) break
24270 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20  ;.      *ppTail 
24280 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c  = pToDel->pNextL
24290 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52  oop;.#if WHERETR
242a0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
242b0 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  x8 */.      if( 
242c0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
242d0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
242e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
242f0 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20  rintf("ins-del: 
24300 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ");.        wher
24310 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65  eLoopPrint(pToDe
24320 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  l, pBuilder->pWC
24330 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
24340 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  f.      whereLoo
24350 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44  pDelete(db, pToD
24360 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  el);.    }.  }. 
24370 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
24380 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
24390 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
243a0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
243b0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
243c0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
243d0 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
243e0 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
243f0 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
24400 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
24410 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
24420 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
24430 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
24440 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
24450 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65  Adjust the Where
24460 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20  Loop.nOut value 
24470 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f  downward to acco
24480 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  unt for terms of
24490 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
244a0 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65  ause that refere
244b0 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74  nce the loop but
244c0 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
244d0 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64  sed by an.** ind
244e0 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ex..**.** In the
244f0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
24500 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66 69 72  ntation, the fir
24510 73 74 20 65 78 74 72 61 20 57 48 45 52 45 20 63  st extra WHERE c
24520 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64 75 63  lause term reduc
24530 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  es.** the number
24540 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
24550 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31  by a factor of 1
24560 30 20 61 6e 64 20 65 61 63 68 20 61 64 64 69 74  0 and each addit
24570 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20 72 65  ional term.** re
24580 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
24590 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
245a0 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f 0a 73  by sqrt(2)..*/.s
245b0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
245c0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
245d0 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
245e0 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  C, WhereLoop *pL
245f0 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65 54 65 72  oop){.  WhereTer
24600 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20  m *pTerm, *pX;. 
24610 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f   Bitmask notAllo
24620 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70  wed = ~(pLoop->p
24630 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73  rereq|pLoop->mas
24640 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c  kSelf);.  int i,
24650 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70 74 69   j;..  if( !Opti
24660 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
24670 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
24680 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
24690 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20 29 7b  AdjustOutEst) ){
246a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
246b0 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
246c0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
246d0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
246e0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
246f0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
24700 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
24710 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
24720 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
24730 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
24740 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
24750 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
24760 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
24770 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
24780 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
24790 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
247a0 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
247b0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
247c0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
247d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
247e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
247f0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
24800 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
24810 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
24820 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
24830 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
24840 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
24850 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
24860 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  ){.      pLoop->
24870 6e 4f 75 74 20 2b 3d 20 28 70 54 65 72 6d 2d 3e  nOut += (pTerm->
24880 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 3f 20 70  truthProb<=0 ? p
24890 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
248a0 3a 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  : -1);.    }.  }
248b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76  .}../*.** We hav
248c0 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64  e so far matched
248d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
248e0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72  >u.btree.nEq ter
248f0 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e  ms of the .** in
24900 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20  dex pIndex. Try 
24910 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
24920 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  e..**.** When th
24930 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
24940 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d  alled, pBuilder-
24950 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74  >pNew->nOut cont
24960 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d  ains the .** num
24970 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
24980 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74  cted to be visit
24990 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20  ed by filtering 
249a0 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a  using the nEq .*
249b0 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66  * terms only. If
249c0 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c   it is modified,
249d0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72   this value is r
249e0 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74  estored before t
249f0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
24a00 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
24a10 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d  If pProbe->tnum=
24a20 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70  =0, that means p
24a30 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20  Index is a fake 
24a40 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74  index used for t
24a50 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
24a60 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74  IMARY KEY..*/.st
24a70 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
24a80 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
24a90 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
24aa0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20  der *pBuilder,  
24ab0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
24ac0 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20  oop factory */. 
24ad0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
24ae0 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
24af0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
24b00 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
24b10 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  zed */.  Index *
24b20 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20  pProbe,         
24b30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
24b40 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a  ndex on pSrc */.
24b50 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20    LogEst nInMul 
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b70 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20    /* log(Number 
24b80 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75  of iterations du
24b90 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20  e to IN) */.){. 
24ba0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
24bb0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
24bc0 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45  WInfo;  /* WHERE
24bd0 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74   analyse context
24be0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
24bf0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
24c00 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  arse;        /* 
24c10 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24c20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
24c30 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
24c40 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
24c50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c   connection mall
24c60 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  oc context */.  
24c70 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c90 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
24ca0 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73  eLoop under cons
24cb0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  truction */.  Wh
24cc0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ce0 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64   A WhereTerm und
24cf0 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
24d00 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b   */.  int opMask
24d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24d20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f        /* Valid o
24d30 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e  perators for con
24d40 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68  straints */.  Wh
24d50 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20  ereScan scan;   
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d70 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48   Iterator for WH
24d80 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42  ERE terms */.  B
24d90 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65  itmask saved_pre
24da0 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f  req;           /
24db0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
24dc0 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71   of pNew->prereq
24dd0 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
24de0 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  nLTerm;         
24df0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
24e00 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
24e10 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36  >nLTerm */.  u16
24e20 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20   saved_nEq;     
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24e40 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
24e50 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
24e60 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  nEq */.  u16 sav
24e70 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20  ed_nSkip;       
24e80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
24e90 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
24ea0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
24eb0 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  p */.  u32 saved
24ec0 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
24ed0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
24ee0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
24ef0 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
24f00 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
24f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24f20 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
24f30 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
24f40 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
24f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f60 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
24f70 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  the column in th
24f80 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
24f90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24fb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
24fc0 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
24fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24fe0 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
24ff0 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20   table size */. 
25000 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70   WhereTerm *pTop
25010 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b   = 0, *pBtm = 0;
25020 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74   /* Top and bott
25030 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  om range constra
25040 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20  ints */..  pNew 
25050 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
25060 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
25070 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
25080 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
25090 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
250a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
250b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
250c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
250d0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
250e0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
250f0 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  )==0 );.  if( pN
25100 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
25110 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
25120 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
25130 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
25140 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74  se if( pProbe->t
25150 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d  num<=0 || (pSrc-
25160 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
25170 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f  EFT)!=0 ){.    o
25180 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
25190 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
251a0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
251b0 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  else{.    opMask
251c0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
251d0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57  O_ISNULL|WO_GT|W
251e0 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
251f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
25200 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
25210 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
25220 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
25230 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
25240 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
25250 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq<=pProbe->nKe
25260 79 43 6f 6c 20 29 3b 0a 20 20 69 66 28 20 70 4e  yCol );.  if( pN
25270 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
25280 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  < pProbe->nKeyCo
25290 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  l ){.    iCol = 
252a0 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
252b0 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  [pNew->u.btree.n
252c0 45 71 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Eq];.  }else{.  
252d0 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d    iCol = -1;.  }
252e0 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  .  pTerm = where
252f0 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
25300 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
25310 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43  Src->iCursor, iC
25320 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
25330 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61              opMa
25340 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73  sk, pProbe);.  s
25350 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d  aved_nEq = pNew-
25360 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
25370 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e  saved_nSkip = pN
25380 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
25390 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72  p;.  saved_nLTer
253a0 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  m = pNew->nLTerm
253b0 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67  ;.  saved_wsFlag
253c0 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  s = pNew->wsFlag
253d0 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65  s;.  saved_prere
253e0 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  q = pNew->prereq
253f0 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d  ;.  saved_nOut =
25400 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70   pNew->nOut;.  p
25410 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
25420 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
25430 74 4c 6f 67 28 70 50 72 6f 62 65 2d 3e 61 69 52  tLog(pProbe->aiR
25440 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 0a 20  owLogEst[0]);.. 
25450 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69   /* Consider usi
25460 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69  ng a skip-scan i
25470 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  f there are no W
25480 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
25490 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61  traints.  ** ava
254a0 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c  ilable for the l
254b0 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f  eft-most terms o
254c0 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  f the index, and
254d0 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65 0a   if the average.
254e0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    ** number of r
254f0 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65  epeats in the le
25500 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73  ft-most terms is
25510 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a 20   at least 18. . 
25520 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67   **.  ** The mag
25530 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73 20  ic number 18 is 
25540 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65 20  selected on the 
25550 62 61 73 69 73 20 74 68 61 74 20 73 63 61 6e 6e  basis that scann
25560 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a  ing 17 rows.  **
25570 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
25580 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20 61  s quicker than a
25590 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65 76  n index seek (ev
255a0 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68 65  en though if the
255b0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74   index.  ** cont
255c0 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
255d0 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73 73  2^17 rows we ass
255e0 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69 6e  ume otherwise in
255f0 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66 0a   other parts of.
25600 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e 20    ** the code). 
25610 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74 20  And, even if it 
25620 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c  is not, it shoul
25630 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63  d not be too muc
25640 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20  h slower. .  ** 
25650 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
25660 64 2c 20 74 68 65 20 65 78 74 72 61 20 73 65 65  d, the extra see
25670 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70 20  ks could end up 
25680 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e  being significan
25690 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78  tly.  ** more ex
256a0 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61  pensive.  */.  a
256b0 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69 74  ssert( 42==sqlit
256c0 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b 0a  e3LogEst(18) );.
256d0 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 0a 20    if( pTerm==0. 
256e0 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d    && saved_nEq==
256f0 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26  saved_nSkip.   &
25700 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50  & saved_nEq+1<pP
25710 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20  robe->nKeyCol.  
25720 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
25730 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
25740 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e  q+1]>=42  /* TUN
25750 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72  ING: Minimum for
25760 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20   skip-scan */.  
25770 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c   && (rc = whereL
25780 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
25790 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
257a0 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  +1))==SQLITE_OK.
257b0 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20    ){.    LogEst 
257c0 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d  nIter;.    pNew-
257d0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
257e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
257f0 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70  e.nSkip++;.    p
25800 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
25810 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b  ->nLTerm++] = 0;
25820 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
25830 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50  gs |= WHERE_SKIP
25840 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20  SCAN;.    nIter 
25850 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
25860 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d  ogEst[saved_nEq]
25870 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
25880 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
25890 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  +1];.    pNew->n
258a0 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20  Out -= nIter;.  
258b0 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
258c0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
258d0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
258e0 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29   nIter + nInMul)
258f0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
25900 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
25910 20 7d 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53   }.  for(; rc==S
25920 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
25930 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68  m!=0; pTerm = wh
25940 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
25950 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65 4f 70  n)){.    u16 eOp
25960 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61   = pTerm->eOpera
25970 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68  tor;   /* Shorth
25980 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65  and for pTerm->e
25990 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Operator */.    
259a0 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64 78 3b  LogEst rCostIdx;
259b0 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  .    LogEst nOut
259c0 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20 20 20  Unadjusted;     
259d0 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72     /* nOut befor
259e0 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45 52 45  e IN() and WHERE
259f0 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a   adjustments */.
25a00 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b      int nIn = 0;
25a10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25a20 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
25a30 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65  TAT4.    int nRe
25a40 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65  cValid = pBuilde
25a50 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65  r->nRecValid;.#e
25a60 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 65 4f  ndif.    if( (eO
25a70 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p==WO_ISNULL || 
25a80 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26  (pTerm->wtFlags&
25a90 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a  TERM_VNULL)!=0).
25aa0 20 20 20 20 20 26 26 20 28 69 43 6f 6c 3c 30 20       && (iCol<0 
25ab0 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61  || pSrc->pTab->a
25ac0 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c  Col[iCol].notNul
25ad0 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  l).    ){.      
25ae0 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e  continue; /* ign
25af0 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c  ore IS [NOT] NUL
25b00 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  L constraints on
25b10 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
25b20 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  s */.    }.    i
25b30 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
25b40 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
25b50 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
25b60 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  e;..    pNew->ws
25b70 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
25b80 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
25b90 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
25ba0 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
25bb0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
25bc0 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69  ed_nLTerm;.    i
25bd0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
25be0 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
25bf0 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
25c00 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
25c10 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
25c20 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
25c30 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e   = pTerm;.    pN
25c40 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61  ew->prereq = (sa
25c50 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65  ved_prereq | pTe
25c60 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29  rm->prereqRight)
25c70 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   & ~pNew->maskSe
25c80 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  lf;..    assert(
25c90 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20   nInMul==0.     
25ca0 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
25cb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
25cc0 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20  UMN_NULL)!=0 .  
25cd0 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
25ce0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25cf0 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20  COLUMN_IN)!=0 . 
25d00 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
25d10 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25d20 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20  _SKIPSCAN)!=0 . 
25d30 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65     );..    if( e
25d40 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  Op & WO_IN ){.  
25d50 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
25d60 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
25d70 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
25d80 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
25d90 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
25da0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
25db0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
25dc0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
25dd0 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
25de0 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
25df0 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
25e00 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
25e10 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
25e20 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
25e30 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
25e40 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
25e50 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
25e60 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
25e70 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
25e80 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
25e90 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
25ea0 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
25eb0 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73  .        nIn = s
25ec0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78  qlite3LogEst(pEx
25ed0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
25ee0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
25ef0 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30     assert( nIn>0
25f00 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61   );  /* RHS alwa
25f10 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65  ys has 2 or more
25f20 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70   terms...  The p
25f30 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20  arser.          
25f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
25f50 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28   changes "x IN (
25f60 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20  ?)" into "x=?". 
25f70 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  */..    }else if
25f80 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 29 20  ( eOp & (WO_EQ) 
25f90 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
25fa0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
25fb0 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
25fc0 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 28   if( iCol<0 || (
25fd0 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 4e 65  nInMul==0 && pNe
25fe0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  w->u.btree.nEq==
25ff0 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d  pProbe->nKeyCol-
26000 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  1) ){.        if
26010 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50 72  ( iCol>=0 && pPr
26020 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  obe->onError==OE
26030 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  _None ){.       
26040 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
26050 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41   |= WHERE_UNQ_WA
26060 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 65  NTED;.        }e
26070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
26080 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
26090 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
260a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
260b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
260c0 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
260d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
260e0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
260f0 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  LUMN_NULL;.    }
26100 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28  else if( eOp & (
26110 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
26120 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26130 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20  eOp & WO_GT );. 
26140 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
26150 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  Op & WO_GE );.  
26160 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
26170 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
26180 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54  N_RANGE|WHERE_BT
26190 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  M_LIMIT;.      p
261a0 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Btm = pTerm;.   
261b0 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20     pTop = 0;.   
261c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
261d0 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f  sert( eOp & (WO_
261e0 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
261f0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
26200 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20   & WO_LT );.    
26210 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
26220 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
26230 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
26240 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
26250 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
26260 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70  IMIT;.      pTop
26270 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
26280 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73  pBtm = (pNew->ws
26290 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
262a0 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20  M_LIMIT)!=0 ?.  
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
262d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20  pNew->nLTerm-2] 
262e0 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  : 0;.    }..    
262f0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
26300 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73   pNew->nOut is s
26310 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
26320 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65   of rows expecte
26330 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76  d to.    ** be v
26340 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69 6e  isited by the in
26350 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20  dex scan before 
26360 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d  considering term
26370 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20   pTerm, or the. 
26380 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20     ** values of 
26390 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20  nIn and nInMul. 
263a0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
263b0 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c  assuming that al
263c0 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28  l .    ** "x IN(
263d0 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20  ...)" terms are 
263e0 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22 78  replaced with "x
263f0 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63   = ?". This bloc
26400 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a  k updates.    **
26410 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e   the value of pN
26420 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f  ew->nOut to acco
26430 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62  unt for pTerm (b
26440 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75  ut not nIn/nInMu
26450 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  l).  */.    asse
26460 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
26470 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
26480 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
26490 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
264a0 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
264b0 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74    /* Adjust nOut
264c0 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61   using stat3/sta
264d0 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20  t4 data. Or, if 
264e0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
264f0 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a  3/stat4.      **
26500 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d   data, using som
26510 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65  e other estimate
26520 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72  .  */.      wher
26530 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50  eRangeScanEst(pP
26540 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
26550 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77  pBtm, pTop, pNew
26560 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26570 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b      int nEq = ++
26580 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
26590 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  q;.      assert(
265a0 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c   eOp & (WO_ISNUL
265b0 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 29 20 29  L|WO_EQ|WO_IN) )
265c0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
265d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
265e0 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20  ed_nOut );.     
265f0 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
26600 68 50 72 6f 62 3c 3d 30 20 26 26 20 69 43 6f 6c  hProb<=0 && iCol
26610 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  >=0 ){.        a
26620 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f  ssert( (eOp & WO
26630 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29  _IN) || nIn==0 )
26640 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
26650 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  se( eOp & WO_IN 
26660 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
26670 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
26680 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
26690 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
266a0 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e   nIn;.        pN
266b0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
266c0 48 45 52 45 5f 4c 49 4b 45 4c 49 48 4f 4f 44 3b  HERE_LIKELIHOOD;
266d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  .      }else{.#i
266e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
266f0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
26700 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  4.        tRowcn
26710 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
26720 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
26730 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
26740 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
26750 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
26760 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
26770 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
26780 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  l.         && Op
26790 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
267a0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74 61  d(db, SQLITE_Sta
267b0 74 33 29 20 0a 20 20 20 20 20 20 20 20 20 26 26  t3) .         &&
267c0 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d   ((eOp & WO_IN)=
267d0 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72  =0 || !ExprHasPr
267e0 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
267f0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
26800 74 29 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  t)).         && 
26810 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
26820 20 57 48 45 52 45 5f 4c 49 4b 45 4c 49 48 4f 4f   WHERE_LIKELIHOO
26830 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  D)==0.        ){
26840 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
26850 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
26860 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
26870 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
26880 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  EQ|WO_ISNULL))!=
26890 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
268a0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
268b0 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
268c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
268d0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
268e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
268f0 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
26900 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
26910 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70  uilder, pExpr->p
26920 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  Right, &nOut);. 
26930 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
26940 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
26950 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
26960 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
26970 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
26980 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
26990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
269a0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
269b0 54 45 5f 4f 4b 20 7c 7c 20 6e 4f 75 74 3e 30 20  TE_OK || nOut>0 
269c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
269d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
269e0 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49  OUND ) rc = SQLI
269f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
26a00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26a10 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20  OK ) break;     
26a20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74       /* Jump out
26a30 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f   of the pTerm lo
26a40 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  op */.          
26a50 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20  if( nOut ){.    
26a60 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
26a70 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ut = sqlite3LogE
26a80 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  st(nOut);.      
26a90 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
26aa0 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20  nOut>saved_nOut 
26ab0 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73  ) pNew->nOut = s
26ac0 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20  aved_nOut;.     
26ad0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
26ae0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
26af0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
26b00 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
26b10 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  ==0 ).#endif.   
26b20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
26b30 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28   pNew->nOut += (
26b40 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
26b50 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62  Est[nEq] - pProb
26b60 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e  e->aiRowLogEst[n
26b70 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  Eq-1]);.        
26b80 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49    if( eOp & WO_I
26b90 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
26ba0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
26bb0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
26bc0 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75  ikelihood() valu
26bd0 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61  e, assume that a
26be0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
26bf0 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65   "col IS NULL" e
26c00 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65  xpression matche
26c10 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20  s twice as many 
26c20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20 20 20  rows .          
26c30 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e    ** as (col=?).
26c40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26c50 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30  pNew->nOut += 10
26c60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26c80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
26c90 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68  t rCostIdx to th
26ca0 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69  e cost of visiti
26cb0 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73  ng selected rows
26cc0 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20   in index. Add. 
26cd0 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77     ** it to pNew
26ce0 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73  ->rRun, which is
26cf0 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74   currently set t
26d00 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  o the cost of th
26d10 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73  e index.    ** s
26d20 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20  eek only. Then, 
26d30 69 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e  if this is a non
26d40 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c  -covering index,
26d50 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66   add the cost of
26d60 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67  .    ** visiting
26d70 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
26d80 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f   main table.  */
26d90 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20  .    rCostIdx = 
26da0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b  pNew->nOut + 1 +
26db0 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
26dc0 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61  dxRow)/pSrc->pTa
26dd0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
26de0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
26df0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
26e00 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64  LogSize, rCostId
26e10 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65  x);.    if( (pNe
26e20 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  w->wsFlags & (WH
26e30 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
26e40 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20  RE_IPK))==0 ){. 
26e50 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
26e60 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
26e70 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  dd(pNew->rRun, p
26e80 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b  New->nOut + 16);
26e90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4f 75 74  .    }..    nOut
26ea0 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e 65  Unadjusted = pNe
26eb0 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65  w->nOut;.    pNe
26ec0 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75  w->rRun += nInMu
26ed0 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65  l + nIn;.    pNe
26ee0 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75  w->nOut += nInMu
26ef0 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65  l + nIn;.    whe
26f00 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
26f10 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  st(pBuilder->pWC
26f20 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 63 20  , pNew);.    rc 
26f30 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
26f40 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
26f50 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  );..    if( pNew
26f60 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
26f70 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
26f80 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  {.      pNew->nO
26f90 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
26fa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26fb0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
26fc0 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20  OutUnadjusted;. 
26fd0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
26fe0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
26ff0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
27000 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  =0.     && pNew-
27010 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28 70 50  >u.btree.nEq<(pP
27020 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 2b 20  robe->nKeyCol + 
27030 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d  (pProbe->zName!=
27040 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0)).    ){.     
27050 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
27060 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
27070 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
27080 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20  nInMul+nIn);.   
27090 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75   }.    pNew->nOu
270a0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
270b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
270c0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
270d0 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72  AT4.    pBuilder
270e0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
270f0 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
27100 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72    }.  pNew->prer
27110 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65  eq = saved_prere
27120 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  q;.  pNew->u.btr
27130 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
27140 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  Eq;.  pNew->u.bt
27150 72 65 65 2e 6e 53 6b 69 70 20 3d 20 73 61 76 65  ree.nSkip = save
27160 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d  d_nSkip;.  pNew-
27170 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
27180 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  _wsFlags;.  pNew
27190 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
271a0 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  Out;.  pNew->nLT
271b0 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
271c0 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rm;.  return rc;
271d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
271e0 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 70   True if it is p
271f0 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e  ossible that pIn
27200 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73 65  dex might be use
27210 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d  ful in.** implem
27220 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
27230 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42   BY clause in pB
27240 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  uilder..**.** Re
27250 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42  turn False if pB
27260 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20  uilder does not 
27270 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52  contain an ORDER
27280 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a   BY clause or.**
27290 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
272a0 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74  way for pIndex t
272b0 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69  o be useful in i
272c0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74  mplementing that
272d0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
272e0 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
272f0 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c  nt indexMightHel
27300 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20  pWithOrderBy(.  
27310 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
27320 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e   *pBuilder,.  In
27330 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69  dex *pIndex,.  i
27340 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20  nt iCursor.){.  
27350 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20  ExprList *pOB;. 
27360 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20   int ii, jj;..  
27370 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f  if( pIndex->bUno
27380 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20  rdered ) return 
27390 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20  0;.  if( (pOB = 
273a0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
273b0 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29  ->pOrderBy)==0 )
273c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
273d0 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e  (ii=0; ii<pOB->n
273e0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
273f0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73   Expr *pExpr = s
27400 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
27410 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d  llate(pOB->a[ii]
27420 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
27430 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
27440 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
27450 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
27460 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
27470 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   ){.      for(jj
27480 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
27490 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
274a0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
274b0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ->iColumn==pInde
274c0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20  x->aiColumn[jj] 
274d0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
274e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
274f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
27500 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74 6d  ** Return a bitm
27510 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e 64  ask where 1s ind
27520 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 63  icate that the c
27530 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
27540 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  umn of.** the ta
27550 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20 61  ble is used by a
27560 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  n index.  Only t
27570 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75  he first 63 colu
27580 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  mns are consider
27590 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  ed..*/.static Bi
275a0 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49  tmask columnsInI
275b0 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
275c0 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d  ){.  Bitmask m =
275d0 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66   0;.  int j;.  f
275e0 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  or(j=pIdx->nColu
275f0 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  mn-1; j>=0; j--)
27600 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49  {.    int x = pI
27610 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
27620 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b  .    if( x>=0 ){
27630 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27640 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20   x==BMS-1 );.   
27650 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
27660 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69  BMS-2 );.      i
27670 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c  f( x<BMS-1 ) m |
27680 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20  = MASKBIT(x);.  
27690 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
276a0 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20   m;.}../* Check 
276b0 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72 74  to see if a part
276c0 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70  ial index with p
276d0 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20 63  PartIndexWhere c
276e0 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e  an be used.** in
276f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75 65   the current que
27700 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ry.  Return true
27710 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e   if it can be an
27720 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
27730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
27740 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
27750 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20  Index(int iTab, 
27760 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
27770 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b  , Expr *pWhere){
27780 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
27790 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
277a0 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70  for(i=0, pTerm=p
277b0 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
277c0 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
277d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
277e0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
277f0 70 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  pr(pTerm->pExpr,
27800 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 29   pWhere, iTab) )
27810 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
27820 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
27830 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
27840 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
27850 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  r a single table
27860 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65   of the join whe
27870 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  re the table.** 
27880 69 73 20 69 64 65 6e 66 69 65 64 20 62 79 20 70  is idenfied by p
27890 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
278a0 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
278b0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
278c0 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65  o be.** a b-tree
278d0 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69   table, not a vi
278e0 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
278f0 2a 2a 20 54 68 65 20 63 6f 73 74 73 20 28 57 68  ** The costs (Wh
27900 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66  ereLoop.rRun) of
27910 20 74 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70   the b-tree loop
27920 73 20 61 64 64 65 64 20 62 79 20 74 68 69 73 20  s added by this 
27930 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20  function.** are 
27940 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 66 6f  calculated as fo
27950 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72  llows:.**.** For
27960 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73   a full scan, as
27970 73 75 6d 69 6e 67 20 74 68 65 20 74 61 62 6c 65  suming the table
27980 20 28 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e 74   (or index) cont
27990 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a  ains nRow rows:.
279a0 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  **.**     cost =
279b0 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20 20 20   nRow * 3.0     
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
279d0 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61  / full-table sca
279e0 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  n.**     cost = 
279f0 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20 20 20 20  nRow * K        
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
27a10 20 73 63 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e   scan of coverin
27a20 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63  g index.**     c
27a30 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b  ost = nRow * (K+
27a40 33 2e 30 29 20 20 20 20 20 20 20 20 20 20 20 20  3.0)            
27a50 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e      // scan of n
27a60 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
27a70 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20  x.**.** where K 
27a80 69 73 20 61 20 76 61 6c 75 65 20 62 65 74 77 65  is a value betwe
27a90 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 20 73  en 1.1 and 3.0 s
27aa0 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  et based on the 
27ab0 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73 74  relative .** est
27ac0 69 6d 61 74 65 64 20 61 76 65 72 61 67 65 20 73  imated average s
27ad0 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ize of the index
27ae0 20 61 6e 64 20 74 61 62 6c 65 20 72 65 63 6f 72   and table recor
27af0 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  ds..**.** For an
27b00 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 77 68 65   index scan, whe
27b10 72 65 20 6e 56 69 73 69 74 20 69 73 20 74 68 65  re nVisit is the
27b20 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   number of index
27b30 20 72 6f 77 73 20 76 69 73 69 74 65 64 0a 2a 2a   rows visited.**
27b40 20 62 79 20 74 68 65 20 73 63 61 6e 2c 20 61 6e   by the scan, an
27b50 64 20 6e 53 65 65 6b 20 69 73 20 74 68 65 20 6e  d nSeek is the n
27b60 75 6d 62 65 72 20 6f 66 20 73 65 65 6b 20 6f 70  umber of seek op
27b70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65  erations require
27b80 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64  d on .** the ind
27b90 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a  ex b-tree:.**.**
27ba0 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65       cost = nSee
27bb0 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b  k * (log(nRow) +
27bc0 20 4b 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20   K * nVisit)    
27bd0 20 20 20 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e        // coverin
27be0 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63  g index.**     c
27bf0 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c  ost = nSeek * (l
27c00 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e  og(nRow) + (K+3.
27c10 30 29 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20  0) * nVisit)    
27c20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20  // non-covering 
27c30 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  index.**.** Norm
27c40 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20 31  ally, nSeek is 1
27c50 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65 73 20 67  . nSeek values g
27c60 72 65 61 74 65 72 20 74 68 61 6e 20 31 20 63 6f  reater than 1 co
27c70 6d 65 20 61 62 6f 75 74 20 69 66 20 74 68 65 20  me about if the 
27c80 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
27c90 20 69 6e 63 6c 75 64 65 73 20 22 78 20 49 4e 20   includes "x IN 
27ca0 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75 73  (....)" terms us
27cb0 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 22  ed in place of "
27cc0 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a  x=?". Or when .*
27cd0 2a 20 69 6d 70 6c 69 63 69 74 20 22 78 20 49 4e  * implicit "x IN
27ce0 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
27cf0 74 62 6c 29 22 20 74 65 72 6d 73 20 61 72 65 20  tbl)" terms are 
27d00 61 64 64 65 64 20 66 6f 72 20 73 6b 69 70 2d 73  added for skip-s
27d10 63 61 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cans..*/.static 
27d20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
27d30 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
27d40 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
27d50 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
27d60 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
27d70 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45   */.  Bitmask mE
27d80 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
27d90 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
27da0 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
27db0 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
27dc0 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
27dd0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
27de0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
27df0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
27e00 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27e20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
27e30 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
27e40 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
27e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
27e60 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
27e70 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
27e80 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
27e90 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
27ea0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
27eb0 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
27ec0 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
27ed0 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
27ee0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
27ef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
27f00 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
27f10 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
27f20 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
27f30 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
27f40 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
27f50 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
27f60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
27f70 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
27f80 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
27f90 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
27fa0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
27fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
27fc0 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
27fd0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
27fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
27ff0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
28000 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
28010 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
28020 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
28030 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
28040 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
28050 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
28060 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
28070 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28090 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
280a0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
280b0 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
280c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
280d0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
280e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
280f0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
28100 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
28110 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
28120 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
28130 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
28140 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
28150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
28160 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
28170 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
28180 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
28190 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
281a0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
281b0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
281c0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
281d0 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
281e0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
281f0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
28200 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
28210 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
28220 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
28230 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
28240 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
28250 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  ex ){.    /* An 
28260 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
28270 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61  e specifies a pa
28280 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
28290 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72  o use */.    pPr
282a0 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
282b0 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ex;.  }else if( 
282c0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
282d0 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  ){.    pProbe = 
282e0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
282f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
28300 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
28310 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
28320 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
28330 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
28340 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
28350 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
28360 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
28370 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
28380 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
28390 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
283a0 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
283b0 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
283c0 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
283d0 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
283e0 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
283f0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
28400 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
28410 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
28420 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
28430 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
28440 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
28450 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
28460 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65  x));.    sPk.nKe
28470 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50  yCol = 1;.    sP
28480 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69  k.aiColumn = &ai
28490 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50  ColumnPk;.    sP
284a0 6b 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20  k.aiRowLogEst = 
284b0 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20  aiRowEstPk;.    
284c0 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  sPk.onError = OE
284d0 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50  _Replace;.    sP
284e0 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  k.pTable = pTab;
284f0 0a 20 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f  .    sPk.szIdxRo
28500 77 20 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  w = pTab->szTabR
28510 6f 77 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  ow;.    aiRowEst
28520 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52  Pk[0] = pTab->nR
28530 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69  owLogEst;.    ai
28540 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b  RowEstPk[1] = 0;
28550 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53  .    pFirst = pS
28560 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  rc->pTab->pIndex
28570 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  ;.    if( pSrc->
28580 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b  notIndexed==0 ){
28590 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
285a0 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68  al indices of th
285b0 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79  e table are only
285c0 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74   considered if t
285d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20  he.      ** NOT 
285e0 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65  INDEXED qualifie
285f0 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  r is omitted fro
28600 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  m the FROM claus
28610 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70  e */.      sPk.p
28620 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20  Next = pFirst;. 
28630 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20     }.    pProbe 
28640 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53  = &sPk;.  }.  rS
28650 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  ize = pTab->nRow
28660 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69  LogEst;.  rLogSi
28670 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a  ze = estLog(rSiz
28680 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  e);..#ifndef SQL
28690 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
286a0 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75  IC_INDEX.  /* Au
286b0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20  tomatic indexes 
286c0 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64  */.  if( !pBuild
286d0 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26  er->pOrSet.   &&
286e0 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65   (pWInfo->pParse
286f0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
28700 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21  LITE_AutoIndex)!
28710 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70  =0.   && pSrc->p
28720 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21  Index==0.   && !
28730 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69  pSrc->viaCorouti
28740 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  ne.   && !pSrc->
28750 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26  notIndexed.   &&
28760 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a   HasRowid(pTab).
28770 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43     && !pSrc->isC
28780 6f 72 72 65 6c 61 74 65 64 0a 20 20 20 26 26 20  orrelated.   && 
28790 21 70 53 72 63 2d 3e 69 73 52 65 63 75 72 73 69  !pSrc->isRecursi
287a0 76 65 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47  ve.  ){.    /* G
287b0 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64  enerate auto-ind
287c0 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f  ex WhereLoops */
287d0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
287e0 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65  pTerm;.    Where
287f0 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70  Term *pWCEnd = p
28800 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
28810 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  rm;.    for(pTer
28820 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51  m=pWC->a; rc==SQ
28830 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
28840 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
28850 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
28860 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
28870 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
28880 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28890 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
288a0 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
288b0 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20  pSrc, 0) ){.    
288c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
288d0 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  e.nEq = 1;.     
288e0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
288f0 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  .nSkip = 0;.    
28900 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
28910 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
28920 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
28930 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
28940 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
28950 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
28960 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d   /* TUNING: One-
28970 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f  time cost for co
28980 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f  mputing the auto
28990 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20  matic index is. 
289a0 20 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 78         ** approx
289b0 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32  imately 7*N*log2
289c0 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74  (N) where N is t
289d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
289e0 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s in.        ** 
289f0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
28a00 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20  indexed. */.    
28a10 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
28a20 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53   = rLogSize + rS
28a30 69 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65 72  ize + 28;  asser
28a40 74 28 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 28==sqlite3Lo
28a50 67 45 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20  gEst(7) );.     
28a60 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
28a70 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
28a80 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
28a90 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
28aa0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
28ab0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
28ac0 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
28ad0 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
28ae0 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
28af0 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69      ** of knowni
28b00 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65  ng how selective
28b10 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
28b20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20  ultimately be.  
28b30 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  It would.       
28b40 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61   ** not be unrea
28b50 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20  sonable to make 
28b60 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20  this value much 
28b70 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  larger. */.     
28b80 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
28b90 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d  43;  assert( 43=
28ba0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
28bb0 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  0) );.        pN
28bc0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
28bd0 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67  e3LogEstAdd(rLog
28be0 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29  Size,pNew->nOut)
28bf0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
28c00 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
28c10 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20  AUTO_INDEX;.    
28c20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
28c30 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72   = mExtra | pTer
28c40 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
28c50 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
28c60 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
28c70 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
28c80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
28c90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
28ca0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
28cb0 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
28cc0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
28cd0 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
28ce0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
28cf0 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
28d00 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
28d10 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
28d20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50    if( pProbe->pP
28d30 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
28d40 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61      && !whereUsa
28d50 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
28d60 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c  pNew->iTab, pWC,
28d70 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
28d80 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  xWhere) ){.     
28d90 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50   continue;  /* P
28da0 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61  artial index ina
28db0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
28dc0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  his query */.   
28dd0 20 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70   }.    rSize = p
28de0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
28df0 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  st[0];.    pNew-
28e00 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30  >u.btree.nEq = 0
28e10 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
28e20 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ree.nSkip = 0;. 
28e30 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
28e40 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
28e50 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
28e60 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
28e70 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  0;.    pNew->pre
28e80 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
28e90 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
28ea0 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Size;.    pNew->
28eb0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
28ec0 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d   pProbe;.    b =
28ed0 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
28ee0 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c  ithOrderBy(pBuil
28ef0 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72  der, pProbe, pSr
28f00 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
28f10 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f   /* The ONEPASS_
28f20 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65  DESIRED flags ne
28f30 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74  ver occurs toget
28f40 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42  her with ORDER B
28f50 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  Y */.    assert(
28f60 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
28f70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
28f80 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
28f90 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20   || b==0 );.    
28fa0 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
28fb0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
28fc0 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
28fd0 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
28fe0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
28ff0 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
29000 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
29010 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
29020 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
29030 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
29040 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e   0;.      /* TUN
29050 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c  ING: Cost of ful
29060 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
29070 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20  (N*3.0). */.    
29080 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
29090 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20  Size + 16;.     
290a0 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
290b0 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
290c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
290d0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
290e0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
290f0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
29100 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  = rSize;.      i
29110 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
29120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29130 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20  Bitmask m;.     
29140 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43   if( pProbe->isC
29150 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20  overing ){.     
29160 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
29170 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   = WHERE_IDX_ONL
29180 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
29190 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30  D;.        m = 0
291a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
291b0 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d         m = pSrc-
291c0 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
291d0 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62  mnsInIndex(pProb
291e0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
291f0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d  ->wsFlags = (m==
29200 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f  0) ? (WHERE_IDX_
29210 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58  ONLY|WHERE_INDEX
29220 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45  ED) : WHERE_INDE
29230 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  XED;.      }..  
29240 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e      /* Full scan
29250 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20   via index */.  
29260 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20      if( b.      
29270 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54   || !HasRowid(pT
29280 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  ab).       || ( 
29290 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  m==0.         &&
292a0 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
292b0 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
292c0 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64  && (pProbe->szId
292d0 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62  xRow<pTab->szTab
292e0 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26  Row).         &&
292f0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
29300 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
29310 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
29320 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
29330 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
29340 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20  .bUseCis.       
29350 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
29360 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d  nEnabled(pWInfo-
29370 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  >pParse->db, SQL
29380 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e  ITE_CoverIdxScan
29390 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20  ).          ).  
293a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
293b0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
293c0 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
293d0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
293e0 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69  e cost of visiti
293f0 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77  ng the index row
29400 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20  s is N*K, where 
29410 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  K is.        ** 
29420 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20  between 1.1 and 
29430 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  3.0, depending o
29440 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73  n the relative s
29450 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20  izes of the.    
29460 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
29470 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 49 66 20   table rows. If 
29480 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
29490 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
294a0 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  n,.        ** al
294b0 73 6f 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  so add the cost 
294c0 6f 66 20 76 69 73 69 74 69 6e 67 20 74 61 62 6c  of visiting tabl
294d0 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20  e rows (N*3.0). 
294e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
294f0 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
29500 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d   1 + (15*pProbe-
29510 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d  >szIdxRow)/pTab-
29520 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20  >szTabRow;.     
29530 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20     if( m!=0 ){. 
29540 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
29550 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
29560 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
29570 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20  n, rSize+16);.  
29580 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
29590 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
295a0 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
295b0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
295c0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
295d0 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
295e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
295f0 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
29600 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
29610 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
29620 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65   }..    rc = whe
29630 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
29640 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
29650 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a  rc, pProbe, 0);.
29660 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
29670 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
29680 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53  AT4.    sqlite3S
29690 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42  tat4ProbeFree(pB
296a0 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20  uilder->pRec);. 
296b0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
296c0 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  cValid = 0;.    
296d0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
296e0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
296f0 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
29700 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
29710 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
29720 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
29730 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
29740 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
29750 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62  pSrc->pIndex ) b
29760 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
29770 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
29780 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
29790 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
297a0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
297b0 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
297c0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
297d0 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  in identified by
297e0 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  .** pBuilder->pN
297f0 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
29800 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
29810 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74  eed to be a virt
29820 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
29830 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
29840 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20  opAddVirtual(.  
29850 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
29860 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20   *pBuilder,  /* 
29870 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
29880 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
29890 74 6d 61 73 6b 20 6d 45 78 74 72 61 0a 29 7b 0a  tmask mExtra.){.
298a0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
298b0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
298c0 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
298d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
298e0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
298f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29900 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
29910 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
29920 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
29930 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
29940 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
29950 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
29960 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
29970 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
29980 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
29990 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
299a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
299b0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
299c0 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
299d0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
299e0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
299f0 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
29a00 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
29a10 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
29a20 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
29a30 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
29a40 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
29a50 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a   iTerm, mxTerm;.
29a60 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
29a70 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20  t;.  int seenIn 
29a80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
29a90 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
29aa0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73  IN operator is s
29ab0 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  een */.  int see
29ac0 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nVar = 0;       
29ad0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
29ae0 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20   a non-constant 
29af0 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65  constraint is se
29b00 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61  en */.  int iPha
29b10 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
29b20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74       /* 0: const
29b30 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73   w/o IN, 1: cons
29b40 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a  t, 2: no IN,  2:
29b50 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f   IN */.  WhereLo
29b60 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  op *pNew;.  int 
29b70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29b80 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
29b90 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
29ba0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
29bb0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
29bc0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
29bd0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
29be0 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  C;.  pNew = pBui
29bf0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
29c00 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  rc = &pWInfo->pT
29c10 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
29c20 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
29c30 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
29c40 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
29c50 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
29c60 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
29c70 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
29c80 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c  pWC, pSrc, pBuil
29c90 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  der->pOrderBy);.
29ca0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
29cb0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
29cc0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d  E_NOMEM;.  pNew-
29cd0 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70  >prereq = 0;.  p
29ce0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
29cf0 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
29d00 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
29d10 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e  TABLE;.  pNew->n
29d20 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65  LTerm = 0;.  pNe
29d30 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
29d40 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65  ee = 0;.  pUsage
29d50 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
29d60 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
29d70 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
29d80 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
29d90 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72  aint;.  if( wher
29da0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
29db0 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  pNew, nConstrain
29dc0 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
29dd0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
29de0 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  Info);.    retur
29df0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
29e00 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73    }..  for(iPhas
29e10 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20  e=0; iPhase<=3; 
29e20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69  iPhase++){.    i
29e30 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69  f( !seenIn && (i
29e40 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20  Phase&1)!=0 ){. 
29e50 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20       iPhase++;. 
29e60 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e       if( iPhase>
29e70 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  3 ) break;.    }
29e80 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61  .    if( !seenVa
29e90 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20  r && iPhase>1 ) 
29ea0 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43  break;.    pIdxC
29eb0 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
29ec0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
29ed0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
29ee0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
29ef0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
29f00 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
29f10 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
29f20 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
29f30 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
29f40 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
29f50 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
29f60 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63  [j];.      switc
29f70 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20  h( iPhase ){.   
29f80 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20       case 0:    
29f90 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
29fa0 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72  hout IN operator
29fb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
29fc0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
29fd0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
29fe0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
29ff0 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
2a000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2a010 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eenIn = 1;.     
2a020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a030 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
2a040 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20  eqRight!=0 ){.  
2a050 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61            seenVa
2a060 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
2a070 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
2a080 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2a090 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_IN)==0 ){.    
2a0a0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2a0b0 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
2a0c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a0d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a0e0 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a     case 1:    /*
2a0f0 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   Constants with 
2a100 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
2a110 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2a120 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  ( seenIn );.    
2a130 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2a140 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
2a150 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29  >prereqRight==0)
2a160 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2a170 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
2a180 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
2a190 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
2a1a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2a1b0 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
2a1c0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2a1d0 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
2a1e0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2a1f0 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
2a200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a210 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
2a220 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
2a230 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
2a240 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
2a250 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
2a260 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2a270 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
2a280 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2a290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2a2a0 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
2a2b0 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
2a2c0 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
2a2d0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
2a2e0 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
2a2f0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
2a300 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
2a310 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
2a320 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
2a330 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
2a340 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
2a350 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2a360 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2a370 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
2a380 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
2a390 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
2a3a0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
2a3b0 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
2a3c0 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
2a3d0 6c 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e  le)2;.    pIdxIn
2a3e0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
2a3f0 73 20 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d  s = 25;.    rc =
2a400 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
2a410 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
2a420 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  xInfo);.    if( 
2a430 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c  rc ) goto whereL
2a440 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
2a450 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
2a460 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
2a470 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2a480 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
2a490 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
2a4a0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
2a4b0 45 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72  Extra;.    mxTer
2a4c0 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  m = -1;.    asse
2a4d0 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rt( pNew->nLSlot
2a4e0 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b  >=nConstraint );
2a4f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2a500 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2a510 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ) pNew->aLTerm[i
2a520 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
2a530 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
2a540 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
2a550 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
2a560 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
2a570 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69  +){.      if( (i
2a580 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d  Term = pUsage[i]
2a590 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e  .argvIndex - 1)>
2a5a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  =0 ){.        j 
2a5b0 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
2a5c0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
2a5d0 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e   if( iTerm>=nCon
2a5e0 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20  straint.        
2a5f0 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20   || j<0.        
2a600 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72   || j>=pWC->nTer
2a610 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e  m.         || pN
2a620 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
2a630 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  ]!=0.        ){.
2a640 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2a650 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2a660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2a670 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2a680 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20  %s.xBestIndex() 
2a690 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54  malfunction", pT
2a6a0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2a6b0 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
2a6c0 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
2a6d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a6e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2a6f0 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm==nConstraint
2a700 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  -1 );.        te
2a710 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a  stcase( j==0 );.
2a720 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2a730 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  ( j==pWC->nTerm-
2a740 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  1 );.        pTe
2a750 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
2a760 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2a770 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e  rereq |= pTerm->
2a780 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
2a790 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65       assert( iTe
2a7a0 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  rm<pNew->nLSlot 
2a7b0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2a7c0 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d  >aLTerm[iTerm] =
2a7d0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
2a7e0 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d  if( iTerm>mxTerm
2a7f0 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72   ) mxTerm = iTer
2a800 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  m;.        testc
2a810 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29  ase( iTerm==15 )
2a820 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2a830 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b  se( iTerm==16 );
2a840 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2a850 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b  rm<16 && pUsage[
2a860 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e  i].omit ) pNew->
2a870 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
2a880 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20  |= 1<<iTerm;.   
2a890 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2a8a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2a8b0 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
2a8c0 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
2a8d0 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  ].omit==0 ){.   
2a8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2a8f0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ot attempt to us
2a900 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  e an IN constrai
2a910 6e 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61  nt if the virtua
2a920 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  l table.        
2a930 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74      ** says that
2a940 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
2a950 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EQ constraint ca
2a960 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f  nnot be safely o
2a970 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20  mitted..        
2a980 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
2a990 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73  attempt to use s
2a9a0 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
2a9b0 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68  , some rows migh
2a9c0 74 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20  t be.           
2a9d0 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20   ** repeated in 
2a9e0 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20  the output. */. 
2a9f0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2aa00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2aa10 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
2aa20 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
2aa30 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
2aa40 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
2aa50 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20  ay not.         
2aa60 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20   ** consume the 
2aa70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2aa80 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20  because (1) the 
2aa90 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d  order of IN term
2aaa0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
2aab0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
2aac0 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
2aad0 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
2aae0 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
2aaf0 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74       ** (2) Mult
2ab00 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f  iple outputs fro
2ab10 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61  m a single IN va
2ab20 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72  lue will not mer
2ab30 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ge.          ** 
2ab40 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20  together.  */.  
2ab50 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
2ab60 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2ab70 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  d = 0;.        }
2ab80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ab90 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74     if( i>=nConst
2aba0 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70  raint ){.      p
2abb0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78  New->nLTerm = mx
2abc0 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73  Term+1;.      as
2abd0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
2abe0 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
2abf0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
2ac00 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
2ac10 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
2ac20 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2ac30 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2ac40 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2ac50 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20  FreeIdxStr;.    
2ac60 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
2ac70 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
2ac80 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2ac90 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
2aca0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
2acb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2acc0 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
2acd0 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  i8)(pIdxInfo->or
2ace0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a  derByConsumed ?.
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad10 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
2ad20 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20  nOrderBy : 0);. 
2ad30 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
2ad40 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
2ad50 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
2ad60 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c  3LogEstFromDoubl
2ad70 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  e(pIdxInfo->esti
2ad80 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20  matedCost);.    
2ad90 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
2ada0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
2adb0 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
2adc0 52 6f 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65  Rows);.      whe
2add0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2ade0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2adf0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
2ae00 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
2ae10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ae20 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
2ae30 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
2ae40 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2ae50 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2ae60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ae70 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
2ae80 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
2ae90 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2aea0 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
2aeb0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
2aec0 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
2aed0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2aee0 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
2aef0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2af00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2af10 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2af20 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
2af30 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
2af40 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
2af50 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
2af60 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
2af70 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
2af80 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
2af90 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2afa0 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  dOr(WhereLoopBui
2afb0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
2afc0 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b  Bitmask mExtra){
2afd0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2afe0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2aff0 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
2b000 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
2b010 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2b020 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2b030 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
2b040 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b050 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
2b060 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
2b070 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2b080 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
2b090 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
2b0a0 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74  sSum, sCur;.  st
2b0b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b0c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70  m *pItem;.  .  p
2b0d0 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
2b0e0 57 43 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  WC;.  if( pWInfo
2b0f0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2b100 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20  HERE_AND_ONLY ) 
2b110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b120 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43  ;.  pWCEnd = pWC
2b130 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
2b140 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
2b150 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d  der->pNew;.  mem
2b160 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69  set(&sSum, 0, si
2b170 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70  zeof(sSum));.  p
2b180 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
2b190 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
2b1a0 77 2d 3e 69 54 61 62 3b 0a 20 20 69 66 28 20 21  w->iTab;.  if( !
2b1b0 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e  HasRowid(pItem->
2b1c0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 53  pTab) ) return S
2b1d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 43 75 72  QLITE_OK;.  iCur
2b1e0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
2b1f0 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
2b200 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
2b210 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
2b220 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
2b230 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
2b240 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2b250 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
2b260 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2b270 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
2b280 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
2b290 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
2b2a0 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
2b2b0 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
2b2c0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
2b2d0 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2b2e0 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
2b2f0 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
2b300 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
2b310 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2b320 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
2b330 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
2b340 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
2b350 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
2b360 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
2b370 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
2b380 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2b390 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
2b3a0 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
2b3b0 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70     for(pOrTerm=p
2b3c0 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d  OrWC->a; pOrTerm
2b3d0 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65  <pOrWCEnd; pOrTe
2b3e0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
2b3f0 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
2b400 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
2b410 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2b420 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
2b430 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
2b440 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
2b450 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
2b460 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
2b470 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==iCur ){.      
2b480 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66      tempWC.pWInf
2b490 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
2b4a0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2b4b0 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a  C.pOuter = pWC;.
2b4c0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2b4d0 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
2b4e0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e          tempWC.n
2b4f0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
2b500 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
2b510 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
2b520 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
2b530 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  = &tempWC;.     
2b540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b550 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2b560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b570 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 6e  sCur.n = 0;.#ifn
2b580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b590 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2b5a0 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
2b5b0 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
2b5c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2b5d0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
2b5e0 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64  rtual(&sSubBuild
2b5f0 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
2b600 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2b610 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2b620 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2b630 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62  opAddBtree(&sSub
2b640 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
2b650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b660 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2b670 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e  LITE_OK || sCur.
2b680 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2b690 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b  if( sCur.n==0 ){
2b6a0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
2b6b0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
2b6c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2b6d0 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29  }else if( once )
2b6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  {.          wher
2b6f0 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26  eOrMove(&sSum, &
2b700 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  sCur);.         
2b710 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20   once = 0;.     
2b720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b730 20 20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73      WhereOrSet s
2b740 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20  Prev;.          
2b750 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72  whereOrMove(&sPr
2b760 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20  ev, &sSum);.    
2b770 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
2b780 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2b790 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20  i=0; i<sPrev.n; 
2b7a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2b7b0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75    for(j=0; j<sCu
2b7c0 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  r.n; j++){.     
2b7d0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
2b7e0 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50  Insert(&sSum, sP
2b7f0 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20  rev.a[i].prereq 
2b800 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72  | sCur.a[j].prer
2b810 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
2b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b830 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2b840 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e  (sPrev.a[i].rRun
2b850 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e  , sCur.a[j].rRun
2b860 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2b880 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2b890 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c  sPrev.a[i].nOut,
2b8a0 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29   sCur.a[j].nOut)
2b8b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2b8c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2b8e0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
2b8f0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65  m = 1;.      pNe
2b900 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70  w->aLTerm[0] = p
2b910 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77  Term;.      pNew
2b920 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2b930 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
2b940 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
2b950 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
2b960 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
2b970 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
2b980 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
2b990 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
2b9a0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
2b9b0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d  ITE_OK && i<sSum
2b9c0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
2b9d0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72    /* TUNING: Cur
2b9e0 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d  rently sSum.a[i]
2b9f0 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20  .rRun is set to 
2ba00 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63  the sum of the c
2ba10 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  osts.        ** 
2ba20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73  of all sub-scans
2ba30 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2ba40 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65   OR-scan. Howeve
2ba50 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69  r, due to roundi
2ba60 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72  ng.        ** er
2ba70 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20  rors, it may be 
2ba80 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66  that the cost of
2ba90 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20   the OR-scan is 
2baa0 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20  equal to its.   
2bab0 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70       ** most exp
2bac0 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e  ensive sub-scan.
2bad0 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73   Add the smalles
2bae0 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c  t possible penal
2baf0 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  ty .        ** (
2bb00 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75  equivalent to mu
2bb10 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f  ltiplying the co
2bb20 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65  st by 1.07) to e
2bb30 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20 20 20  nsure that .    
2bb40 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73      ** this does
2bb50 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68   not happen. Oth
2bb60 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52  erwise, for WHER
2bb70 45 20 63 6c 61 75 73 65 73 20 73 75 63 68 20 61  E clauses such a
2bb80 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
2bb90 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65   following where
2bba0 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
2bbb0 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20  ex on "y":.     
2bbc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2bbd0 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c       WHERE likel
2bbe0 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29  ihood(x=?, 0.99)
2bbf0 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20   OR y=?.        
2bc00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  **.        ** th
2bc10 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c  e planner may el
2bc20 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65  ect to "OR" toge
2bc30 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c  ther a full-tabl
2bc40 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20  e scan and an.  
2bc50 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c        ** index l
2bc60 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72  ookup. And other
2bc70 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72   similarly odd r
2bc80 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20  esults.  */.    
2bc90 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2bca0 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
2bcb0 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  + 1;.        pNe
2bcc0 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61  w->nOut = sSum.a
2bcd0 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  [i].nOut;.      
2bce0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2bcf0 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65   sSum.a[i].prere
2bd00 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  q;.        rc = 
2bd10 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2bd20 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2bd30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2bd40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2bd50 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
2bd60 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2bd70 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
2bd80 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
2bd90 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
2bda0 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2bdb0 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
2bdc0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2bdd0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2bde0 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Info;.  Bitmask 
2bdf0 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69  mExtra = 0;.  Bi
2be00 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
2be10 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
2be20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2be30 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
2be40 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
2be50 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2be60 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
2be70 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
2be80 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54  se->db;.  int nT
2be90 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
2bea0 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72  >nLevel;.  int r
2beb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bec0 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70   u8 priorJoinTyp
2bed0 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f  e = 0;.  WhereLo
2bee0 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  op *pNew;..  /* 
2bef0 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61  Loop over the ta
2bf00 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2bf10 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
2bf20 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  ight */.  pNew =
2bf30 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2bf40 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
2bf50 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54  (pNew);.  for(iT
2bf60 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
2bf70 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54  List->a; iTab<nT
2bf80 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20  abList; iTab++, 
2bf90 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e  pItem++){.    pN
2bfa0 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b  ew->iTab = iTab;
2bfb0 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  .    pNew->maskS
2bfc0 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
2bfd0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2bfe0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2bff0 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65  ;.    if( ((pIte
2c000 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  m->jointype|prio
2c010 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54  rJoinType) & (JT
2c020 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
2c030 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78  !=0 ){.      mEx
2c040 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  tra = mPrior;.  
2c050 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69    }.    priorJoi
2c060 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a  nType = pItem->j
2c070 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28  ointype;.    if(
2c080 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
2c090 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2c0a0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2c0b0 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
2c0c0 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
2c0d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2c0e0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
2c0f0 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  tree(pBuilder, m
2c100 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
2c110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c120 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2c130 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
2c140 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
2c150 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50  a);.    }.    mP
2c160 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61  rior |= pNew->ma
2c170 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20  skSelf;.    if( 
2c180 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
2c190 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
2c1a0 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43    }.  whereLoopC
2c1b0 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lear(db, pNew);.
2c1c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c1d0 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20  /*.** Examine a 
2c1e0 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68 20  WherePath (with 
2c1f0 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
2c200 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65 4c  the extra WhereL
2c210 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a  oop of the 5th.*
2c220 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f  * parameters) to
2c230 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70 75   see if it outpu
2c240 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  ts rows in the r
2c250 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20 42  equested ORDER B
2c260 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42  Y.** (or GROUP B
2c270 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75 69  Y) without requi
2c280 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20  ring a separate 
2c290 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20  sort operation. 
2c2a0 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a   Return N:.** .*
2c2b0 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72  *   N>0:   N ter
2c2c0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
2c2d0 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
2c2e0 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d  tisfied.**   N==
2c2f0 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20  0:  No terms of 
2c300 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2c310 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65  use are satisfie
2c320 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e  d.**   N<0:   Un
2c330 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61  known yet how ma
2c340 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45  ny terms of ORDE
2c350 52 20 42 59 20 6d 69 67 68 74 20 62 65 20 73 61  R BY might be sa
2c360 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a  tisfied.   .**.*
2c370 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63  * Note that proc
2c380 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45  essing for WHERE
2c390 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45  _GROUPBY and WHE
2c3a0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73  RE_DISTINCTBY is
2c3b0 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63   not as.** stric
2c3c0 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42  t.  With GROUP B
2c3d0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74  Y and DISTINCT t
2c3e0 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d  he only requirem
2c3f0 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65  ent is that.** e
2c400 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
2c410 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c  ppear immediatel
2c420 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e  y adjacent to on
2c430 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55  e another.  GROU
2c440 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54  P BY.** and DIST
2c450 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75  INCT do not requ
2c460 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65  ire rows to appe
2c470 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63  ar in any partic
2c480 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f  ular order as lo
2c490 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65 6c  ng.** as equivel
2c4a0 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f  ent rows are gro
2c4b0 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20  uped together.  
2c4c0 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42  Thus for GROUP B
2c4d0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a  Y and DISTINCT.*
2c4e0 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74  * the pOrderBy t
2c4f0 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63  erms can be matc
2c500 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72  hed in any order
2c510 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59  .  With ORDER BY
2c520 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72  , the .** pOrder
2c530 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65  By terms must be
2c540 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69   matched in stri
2c550 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74  ct left-to-right
2c560 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2c570 63 20 69 38 20 77 68 65 72 65 50 61 74 68 53 61  c i8 wherePathSa
2c580 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a  tisfiesOrderBy(.
2c590 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2c5a0 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57  nfo,    /* The W
2c5b0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2c5c0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2c5d0 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20  rBy,   /* ORDER 
2c5e0 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  BY or GROUP BY o
2c5f0 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  r DISTINCT claus
2c600 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
2c610 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
2c620 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
2c630 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20  rePath to check 
2c640 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
2c650 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69  ags,       /* Mi
2c660 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  ght contain WHER
2c670 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45  E_GROUPBY or WHE
2c680 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f  RE_DISTINCTBY */
2c690 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20  .  u16 nLoop,   
2c6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c6b0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
2c6c0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
2c6d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2c6e0 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64  pLast,     /* Ad
2c6f0 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  d this WhereLoop
2c700 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70   to the end of p
2c710 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
2c720 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76  .  Bitmask *pRev
2c730 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Mask     /* OUT:
2c740 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
2c750 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
2c760 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
2c770 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
2c780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2c790 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
2c7a0 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
2c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c7c0 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
2c7d0 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
2c7e0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2c7f0 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
2c800 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72  der */.  u8 isOr
2c810 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f  derDistinct;   /
2c820 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72  * All prior Wher
2c830 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72  eLoops are order
2c840 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75  -distinct */.  u
2c850 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  8 distinctColumn
2c860 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  s;   /* True if 
2c870 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49  the loop has UNI
2c880 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  QUE NOT NULL col
2c890 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d  umns */.  u8 isM
2c8a0 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2c8b0 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68  /* iColumn match
2c8c0 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
2c8d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2c8e0 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f   */.  u16 nKeyCo
2c8f0 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  l;          /* N
2c900 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c  umber of key col
2c910 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a  umns in pIndex *
2c920 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b  /.  u16 nColumn;
2c930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
2c940 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64  al number of ord
2c950 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ered columns in 
2c960 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  the index */.  u
2c970 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  16 nOrderBy;    
2c980 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
2c990 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
2c9a0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2c9b0 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
2c9c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2c9d0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20  of WhereLoop in 
2c9e0 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63  pPath being proc
2c9f0 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  essed */.  int i
2ca00 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2ca10 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2ca20 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca40 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
2ca50 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c  r current WhereL
2ca60 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  oop */.  int iCo
2ca70 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
2ca80 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  * A column numbe
2ca90 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69  r within table i
2caa0 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  Cur */.  WhereLo
2cab0 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f  op *pLoop = 0; /
2cac0 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c  * Current WhereL
2cad0 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73  oop being proces
2cae0 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54  sed. */.  WhereT
2caf0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
2cb00 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
2cb10 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2cb20 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
2cb30 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20  pOBExpr;        
2cb40 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
2cb50 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
2cb60 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43  BY clause */.  C
2cb70 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
2cb80 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20       /* COLLATE 
2cb90 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e  function from an
2cba0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2cbb0 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78   term */.  Index
2cbc0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
2cbd0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73   /* The index as
2cbe0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c  sociated with pL
2cbf0 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
2cc00 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
2cc10 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
2cc20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2cc30 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
2cc40 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a  obSat = 0;    /*
2cc50 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42   Mask of ORDER B
2cc60 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
2cc70 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69  d so far */.  Bi
2cc80 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20  tmask obDone;   
2cc90 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2cca0 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
2ccb0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  s */.  Bitmask o
2ccc0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2ccd0 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c  ;  /* Mask of al
2cce0 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c  l well-ordered l
2ccf0 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  oops */.  Bitmas
2cd00 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20  k ready;        
2cd10 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2cd20 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
2cd30 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  /*.  ** We sa
2cd40 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
2cd50 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20  is "one-row" if 
2cd60 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20  it generates no 
2cd70 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20  more than one.  
2cd80 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  ** row of output
2cd90 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69  .  A WhereLoop i
2cda0 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c  s one-row if all
2cdb0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2cdc0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
2cdd0 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20    (a) All index 
2cde0 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69  columns match wi
2cdf0 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  th WHERE_COLUMN_
2ce00 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68  EQ..  **  (b) Th
2ce10 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75  e index is uniqu
2ce20 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65  e.  ** Any Where
2ce30 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45  Loop with an WHE
2ce40 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e  RE_COLUMN_EQ con
2ce50 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72  straint on the r
2ce60 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e  owid is one-row.
2ce70 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d  .  ** Every one-
2ce80 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  row WhereLoop wi
2ce90 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52  ll have the WHER
2cea0 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74  E_ONEROW bit set
2ceb0 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a   in wsFlags..  *
2cec0 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
2ced0 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
2cee0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20  order-distinct" 
2cef0 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  if the set of co
2cf00 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  lumns from.  ** 
2cf10 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  that WhereLoop t
2cf20 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f  hat are in the O
2cf30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
2cf40 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  re different for
2cf50 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20   every.  ** row 
2cf60 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2cf70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  .  Every one-row
2cf80 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75   WhereLoop is au
2cf90 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
2cfa0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2cfb0 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74     A WhereLoop t
2cfc0 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d  hat has no colum
2cfd0 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ns in the ORDER 
2cfe0 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69  BY clause.  ** i
2cff0 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74  s not order-dist
2d000 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65  inct. To be orde
2d010 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f  r-distinct is no
2d020 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65  t quite the same
2d030 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55   as being.  ** U
2d040 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e  NIQUE since a UN
2d050 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69  IQUE column or i
2d060 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75  ndex can have mu
2d070 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74  ltiple rows that
2d080 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20   .  ** are NULL 
2d090 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  and NULL values 
2d0a0 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  are equivalent f
2d0b0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
2d0c0 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  f order-distinct
2d0d0 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64  ..  ** To be ord
2d0e0 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65  er-distinct, the
2d0f0 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65   columns must be
2d100 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
2d110 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  NULL..  **.  ** 
2d120 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20  The rowid for a 
2d130 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  table is always 
2d140 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
2d150 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20  ULL so whenever 
2d160 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61  the.  ** rowid a
2d170 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52  ppears in the OR
2d180 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2d190 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2d1a0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20   WhereLoop is.  
2d1b0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2d1c0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2d1d0 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  .  */..  assert(
2d1e0 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
2d1f0 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f    if( nLoop && O
2d200 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
2d210 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
2d220 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29  rderByIdxJoin) )
2d230 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f   return 0;..  nO
2d240 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
2d250 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74  y->nExpr;.  test
2d260 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d  case( nOrderBy==
2d270 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  BMS-1 );.  if( n
2d280 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20  OrderBy>BMS-1 ) 
2d290 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
2d2a0 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76  nnot optimize ov
2d2b0 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52  erly large ORDER
2d2c0 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65   BYs */.  isOrde
2d2d0 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
2d2e0 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49   obDone = MASKBI
2d2f0 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20  T(nOrderBy)-1;. 
2d300 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2d310 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20  sk = 0;.  ready 
2d320 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  = 0;.  for(iLoop
2d330 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69  =0; isOrderDisti
2d340 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44  nct && obSat<obD
2d350 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c  one && iLoop<=nL
2d360 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
2d370 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29     if( iLoop>0 )
2d380 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d   ready |= pLoop-
2d390 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70  >maskSelf;.    p
2d3a0 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f  Loop = iLoop<nLo
2d3b0 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  op ? pPath->aLoo
2d3c0 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74  p[iLoop] : pLast
2d3d0 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
2d3e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2d3f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
2d400 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
2d410 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
2d420 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44  ed ) obSat = obD
2d430 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  one;.      break
2d440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72  ;.    }.    iCur
2d450 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2d460 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
2d470 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  ab].iCursor;..  
2d480 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
2d490 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  y ORDER BY term 
2d4a0 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75  X that is a colu
2d4b0 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
2d4c0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  of.    ** the cu
2d4d0 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77  rrent loop for w
2d4e0 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65  hich there is te
2d4f0 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a  rm in the WHERE.
2d500 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
2d510 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e   the form X IS N
2d520 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20  ULL or X=? that 
2d530 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
2d540 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70  uter.    ** loop
2d550 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
2d560 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
2d570 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  y; i++){.      i
2d580 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2d590 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2d5a0 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
2d5b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2d5c0 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
2d5d0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2d5e0 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2d5f0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
2d600 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d610 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2d620 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2d630 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
2d640 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
2d650 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
2d660 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
2d670 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
2d680 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
2d690 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
2d6a0 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20  NULL, 0);.      
2d6b0 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
2d6c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2d6d0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
2d6e0 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26  ator&WO_EQ)!=0 &
2d6f0 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  & pOBExpr->iColu
2d700 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2d710 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c   const char *z1,
2d720 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43   *z2;.        pC
2d730 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2d740 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2d750 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2d760 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2d770 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2d780 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2d790 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2d7a0 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e      z1 = pColl->
2d7b0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70  zName;.        p
2d7c0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2d7d0 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
2d7e0 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  ->pParse, pTerm-
2d7f0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >pExpr);.       
2d800 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2d810 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2d820 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  oll;.        z2 
2d830 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
2d840 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2d850 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
2d860 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  2)!=0 ) continue
2d870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d880 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2d890 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (i);.    }..    
2d8a0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2d8b0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
2d8c0 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OW)==0 ){.      
2d8d0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2d8e0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29  gs & WHERE_IPK )
2d8f0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
2d900 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b   = 0;.        nK
2d910 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  eyCol = 0;.     
2d920 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a     nColumn = 1;.
2d930 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d940 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  (pIndex = pLoop-
2d950 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
2d960 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62  ==0 || pIndex->b
2d970 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  Unordered ){.   
2d980 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2d990 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d9a0 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49      nKeyCol = pI
2d9b0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  ndex->nKeyCol;. 
2d9c0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
2d9d0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
2d9e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2d9f0 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43  ( nColumn==nKeyC
2da00 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69  ol+1 || !HasRowi
2da10 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
2da20 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
2da30 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43  ert( pIndex->aiC
2da40 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d  olumn[nColumn-1]
2da50 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73 52 6f  ==(-1) || !HasRo
2da60 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
2da70 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73  le));.        is
2da80 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2da90 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
2daa0 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20  =OE_None;.      
2dab0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  }..      /* Loop
2dac0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c   through all col
2dad0 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
2dae0 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20  x and deal with 
2daf0 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a  the ones.      *
2db00 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63  * that are not c
2db10 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
2db20 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f   or IN..      */
2db30 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76  .      rev = rev
2db40 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  Set = 0;.      d
2db50 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
2db60 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
2db70 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  0; j<nColumn; j+
2db80 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62  +){.        u8 b
2db90 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20  Once;   /* True 
2dba0 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52  to run the ORDER
2dbb0 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20   BY search loop 
2dbc0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  */..        /* S
2dbd0 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20  kip over == and 
2dbe0 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f  IS NULL terms */
2dbf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
2dc00 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
2dc10 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4c  q.         && pL
2dc20 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  oop->u.btree.nSk
2dc30 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ip==0.         &
2dc40 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61  & ((i = pLoop->a
2dc50 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61  LTerm[j]->eOpera
2dc60 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f  tor) & (WO_EQ|WO
2dc70 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20  _ISNULL))!=0.   
2dc80 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2dc90 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e    if( i & WO_ISN
2dca0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
2dcb0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
2dcc0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a  rderDistinct );.
2dcd0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2dce0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
2dcf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dd00 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2dd10 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20    .        }..  
2dd20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65        /* Get the
2dd30 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
2dd40 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f  n the table (iCo
2dd50 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f  lumn) and sort o
2dd60 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rder.        ** 
2dd70 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65  (revIdx) for the
2dd80 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   j-th column of 
2dd90 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
2dda0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2ddb0 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
2ddc0 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2ddd0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
2dde0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [j];.          r
2ddf0 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e  evIdx = pIndex->
2de00 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
2de10 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2de20 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54  lumn==pIndex->pT
2de30 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43  able->iPKey ) iC
2de40 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
2de50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2de60 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d       iColumn = -
2de70 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  1;.          rev
2de80 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
2de90 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
2dea0 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20  n unconstrained 
2deb0 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68  column that migh
2dec0 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  t be NULL means 
2ded0 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20  that this.      
2dee0 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69    ** WhereLoop i
2def0 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72  s not well-order
2df00 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed.        */.  
2df10 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
2df20 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20  rDistinct.      
2df30 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30     && iColumn>=0
2df40 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d  .         && j>=
2df50 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2df60 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
2df70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61  Index->pTable->a
2df80 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  Col[iColumn].not
2df90 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  Null==0.        
2dfa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
2dfb0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
2dfc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2dfd0 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65       /* Find the
2dfe0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74   ORDER BY term t
2dff0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
2e000 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  to the j-th colu
2e010 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  mn.        ** of
2e020 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d   the index and m
2e030 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42  ark that ORDER B
2e040 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20  Y term off .    
2e050 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62      */.        b
2e060 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Once = 1;.      
2e070 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20    isMatch = 0;. 
2e080 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2e090 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65  bOnce && i<nOrde
2e0a0 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
2e0b0 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
2e0c0 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
2e0d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2e0e0 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
2e0f0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2e100 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
2e110 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
2e120 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
2e130 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2e140 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20  _GROUPBY );.    
2e150 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e160 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2e170 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b  RE_DISTINCTBY );
2e180 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2e190 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48  wctrlFlags & (WH
2e1a0 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52  ERE_GROUPBY|WHER
2e1b0 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d  E_DISTINCTBY))==
2e1c0 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20  0 ) bOnce = 0;. 
2e1d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2e1e0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2e1f0 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
2e200 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2e210 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
2e220 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
2e230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2e240 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  BExpr->iColumn!=
2e250 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
2e260 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2e270 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ( iColumn>=0 ){.
2e280 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2e290 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2e2a0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
2e2b0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
2e2c0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2e2d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2e2e0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
2e2f0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2e300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2e310 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
2e320 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ll->zName, pInde
2e330 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
2e340 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2e350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e360 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a     isMatch = 1;.
2e370 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2e380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e390 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26     if( isMatch &
2e3a0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2e3b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
2e3c0 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
2e3d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
2e3e0 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
2e3f0 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
2e400 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
2e410 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
2e420 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    ** Sort order 
2e430 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f  is irrelevant fo
2e440 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
2e450 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  use. */.        
2e460 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
2e470 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e480 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d  (rev ^ revIdx)!=
2e490 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
2e4a0 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74  ortOrder ) isMat
2e4b0 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
2e4c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e4d0 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64       rev = revId
2e4e0 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x ^ pOrderBy->a[
2e4f0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
2e500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
2e510 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
2e520 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
2e530 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
2e540 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Set = 1;.       
2e550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2e560 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
2e570 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
2e580 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  if( iColumn<0 ){
2e590 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2e5a0 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43  tcase( distinctC
2e5b0 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20  olumns==0 );.   
2e5c0 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
2e5d0 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20  tColumns = 1;.  
2e5e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e5f0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2e600 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
2e610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e620 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f    /* No match fo
2e630 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
2e640 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e   if( j==0 || j<n
2e650 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
2e660 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e670 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21  isOrderDistinct!
2e680 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2e690 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2e6a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2e6b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
2e6c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2e6d0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f      } /* end Loo
2e6e0 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78  p over all index
2e6f0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
2e700 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f    if( distinctCo
2e710 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20  lumns ){.       
2e720 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
2e730 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  erDistinct==0 );
2e740 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
2e750 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
2e760 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65      }.    } /* e
2e770 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f  nd-if not one-ro
2e780 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  w */..    /* Mar
2e790 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20  k off any other 
2e7a0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
2e7b0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c  hat reference pL
2e7c0 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  oop */.    if( i
2e7d0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
2e7e0 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73  {.      orderDis
2e7f0 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f  tinctMask |= pLo
2e800 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2e810 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2e820 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2e830 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a         Expr *p;.
2e840 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
2e850 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  mTerm;.        i
2e860 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2e870 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2e880 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
2e890 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2e8a0 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72  pr;.        mTer
2e8b0 6d 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  m = exprTableUsa
2e8c0 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ge(&pWInfo->sMas
2e8d0 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20  kSet,p);.       
2e8e0 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26   if( mTerm==0 &&
2e8f0 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
2e900 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e  onstant(p) ) con
2e910 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
2e920 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72  f( (mTerm&~order
2e930 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30  DistinctMask)==0
2e940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62   ){.          ob
2e950 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
2e960 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e970 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f     }.    }.  } /
2e980 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f  * End the loop o
2e990 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  ver all WhereLoo
2e9a0 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f  ps from outer-mo
2e9b0 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72  st down to inner
2e9c0 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f  -most */.  if( o
2e9d0 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72  bSat==obDone ) r
2e9e0 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72  eturn (i8)nOrder
2e9f0 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64  By;.  if( !isOrd
2ea00 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
2ea10 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79    for(i=nOrderBy
2ea20 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
2ea30 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
2ea40 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b   MASKBIT(i) - 1;
2ea50 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61  .      if( (obSa
2ea60 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e  t&m)==m ) return
2ea70 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   i;.    }.    re
2ea80 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
2ea90 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn -1;.}.../*.
2eaa0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f  ** If the WHERE_
2eab0 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
2eac0 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20  set in the mask 
2ead0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
2eae0 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a  3WhereBegin(),.*
2eaf0 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73  * the planner as
2eb00 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73  sumes that the s
2eb10 70 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42  pecified pOrderB
2eb20 79 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c  y list is actual
2eb30 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59  ly a GROUP.** BY
2eb40 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f   clause - and so
2eb50 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20   any order that 
2eb60 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72  groups rows as r
2eb70 65 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65  equired satisfie
2eb80 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  s the.** request
2eb90 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
2eba0 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  , in this case i
2ebb0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
2ebc0 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  e for the caller
2ebd0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a   to determine.**
2ebe0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2ebf0 74 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61  the rows are rea
2ec00 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65  lly being delive
2ec10 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  red in sorted or
2ec20 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20  der, or.** just 
2ec30 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72  in some other or
2ec40 64 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65  der that provide
2ec50 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67  s the required g
2ec60 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72  rouping. However
2ec70 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52  ,.** if the WHER
2ec80 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c  E_SORTBYGROUP fl
2ec90 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65  ag is also passe
2eca0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
2ecb0 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a  eBegin(), then.*
2ecc0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2ecd0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  may be called on
2ece0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68   the returned Wh
2ecf0 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  ereInfo object. 
2ed00 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72  It returns.** tr
2ed10 75 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72  ue if the rows r
2ed20 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f  eally will be so
2ed30 72 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63  rted in the spec
2ed40 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20  ified order, or 
2ed50 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69  false.** otherwi
2ed60 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  se..**.** For ex
2ed70 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a  ample, assuming:
2ed80 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
2ed90 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78  INDEX i1 ON t1(x
2eda0 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , Y);.**.** then
2edb0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
2edc0 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  * FROM t1 GROUP 
2edd0 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20  BY x,y ORDER BY 
2ede0 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74  x,y;   -- IsSort
2edf0 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c  ed()==1.**   SEL
2ee00 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
2ee10 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52  OUP BY y,x ORDER
2ee20 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73   BY y,x;   -- Is
2ee30 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69  Sorted()==0.*/.i
2ee40 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
2ee50 73 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66  sSorted(WhereInf
2ee60 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
2ee70 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63  sert( pWInfo->wc
2ee80 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2ee90 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73  _GROUPBY );.  as
2eea0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63  sert( pWInfo->wc
2eeb0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2eec0 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a  _SORTBYGROUP );.
2eed0 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
2eee0 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64  >sorted;.}..#ifd
2eef0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2ef00 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62  ABLED./* For deb
2ef10 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a  ugging use only:
2ef20 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
2ef30 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68   char *wherePath
2ef40 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a  Name(WherePath *
2ef50 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70  pPath, int nLoop
2ef60 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61  , WhereLoop *pLa
2ef70 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  st){.  static ch
2ef80 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20  ar zName[65];.  
2ef90 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
2efa0 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b  ; i<nLoop; i++){
2efb0 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74   zName[i] = pPat
2efc0 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64  h->aLoop[i]->cId
2efd0 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20  ; }.  if( pLast 
2efe0 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70  ) zName[i++] = p
2eff0 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61  Last->cId;.  zNa
2f000 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74  me[i] = 0;.  ret
2f010 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
2f020 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
2f030 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
2f040 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61  reLoop objects a
2f050 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  t pWInfo->pLoops
2f060 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
2f070 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  * attempts to fi
2f080 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
2f090 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73  st path that vis
2f0a0 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f  its each WhereLo
2f0b0 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69  op.** once.  Thi
2f0c0 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c  s path is then l
2f0d0 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70  oaded into the p
2f0e0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f  WInfo->a[].pWLoo
2f0f0 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  p fields..**.** 
2f100 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  Assume that the 
2f110 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2f120 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74  output rows that
2f130 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
2f140 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20   sorted.** will 
2f150 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74  be nRowEst (in t
2f160 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65  he 10*log2 repre
2f170 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c  sentation).  Or,
2f180 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a   ignore sorting.
2f190 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77  ** costs if nRow
2f1a0 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65  Est==0..**.** Re
2f1b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
2f1c0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c  n success or SQL
2f1d0 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d  ITE_NOMEM of a m
2f1e0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2f1f0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
2f200 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f210 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
2f220 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2f230 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73  o, LogEst nRowEs
2f240 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69  t){.  int mxChoi
2f250 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
2f260 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2f270 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
2f280 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20  s paths tracked 
2f290 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20  */.  int nLoop; 
2f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f2b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
2f2c0 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s in the join */
2f2d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2f2e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2f2f0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
2f300 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2f310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2f320 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
2f330 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
2f340 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
2f350 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2f360 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68   counter over th
2f370 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a  e terms of the j
2f380 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c  oin */.  int ii,
2f390 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20   jj;            
2f3a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2f3b0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49  ers */.  int mxI
2f3c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f3d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
2f3e0 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70  ext entry to rep
2f3f0 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  lace */.  int nO
2f400 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
2f410 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f420 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2f430 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45   terms */.  LogE
2f440 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20  st rCost;       
2f450 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
2f460 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 4c 6f 67   a path */.  Log
2f470 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20  Est nOut;       
2f480 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f490 20 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f 0a 20   of outputs */. 
2f4a0 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d   LogEst mxCost =
2f4b0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   0;        /* Ma
2f4c0 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20  ximum cost of a 
2f4d0 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a  set of paths */.
2f4e0 20 20 4c 6f 67 45 73 74 20 6d 78 4f 75 74 20 3d    LogEst mxOut =
2f4f0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d   0;         /* M
2f500 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76 61 6c 75  aximum nOut valu
2f510 65 20 6f 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e on the set of 
2f520 70 61 74 68 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  paths */.  int n
2f530 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20  To, nFrom;      
2f540 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f550 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20  f valid entries 
2f560 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72  in aTo[] and aFr
2f570 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50  om[] */.  WhereP
2f580 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20  ath *aFrom;     
2f590 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d      /* All nFrom
2f5a0 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72   paths at the pr
2f5b0 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a  evious level */.
2f5c0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f    WherePath *aTo
2f5d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2f5e0 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68  he nTo best path
2f5f0 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  s at the current
2f600 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72   level */.  Wher
2f610 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20  ePath *pFrom;   
2f620 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
2f630 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74  ent of aFrom[] t
2f640 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
2f650 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
2f660 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20  Path *pTo;      
2f670 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
2f680 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74  nt of aTo[] that
2f690 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
2f6a0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  on */.  WhereLoo
2f6b0 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20  p *pWLoop;      
2f6c0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
2f6d0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2f6e0 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  s */.  WhereLoop
2f6f0 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20   **pX;          
2f700 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79   /* Used to divy
2f710 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d   up the pSpace m
2f720 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61 72 20  emory */.  char 
2f730 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
2f740 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
2f750 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  y memory used by
2f760 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
2f770 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
2f780 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
2f790 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2f7a0 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
2f7b0 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
2f7c0 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
2f7d0 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
2f7e0 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
2f7f0 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
2f800 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
2f810 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
2f820 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
2f830 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
2f840 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
2f850 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
2f860 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
2f870 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
2f880 70 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p==1) ? 1 : (nLo
2f890 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
2f8a0 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
2f8b0 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
2f8c0 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
2f8d0 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
2f8e0 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
2f8f0 76 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20  ver\n"));..  /* 
2f900 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2f910 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f  tialize space fo
2f920 72 20 61 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20  r aTo and aFrom 
2f930 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a 65 6f  */.  ii = (sizeo
2f940 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a  f(WherePath)+siz
2f950 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
2f960 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a  nLoop)*mxChoice*
2f970 32 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71  2;.  pSpace = sq
2f980 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2f990 28 64 62 2c 20 69 69 29 3b 0a 20 20 69 66 28 20  (db, ii);.  if( 
2f9a0 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
2f9b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2f9c0 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50  .  aTo = (WhereP
2f9d0 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61  ath*)pSpace;.  a
2f9e0 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f  From = aTo+mxCho
2f9f0 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46  ice;.  memset(aF
2fa00 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  rom, 0, sizeof(a
2fa10 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20  From[0]));.  pX 
2fa20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28  = (WhereLoop**)(
2fa30 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b  aFrom+mxChoice);
2fa40 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69  .  for(ii=mxChoi
2fa50 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ce*2, pFrom=aTo;
2fa60 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72   ii>0; ii--, pFr
2fa70 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f  om++, pX += nLoo
2fa80 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61  p){.    pFrom->a
2fa90 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a  Loop = pX;.  }..
2faa0 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65    /* Seed the se
2fab0 61 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67  arch with a sing
2fac0 6c 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e  le WherePath con
2fad0 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65  taining zero Whe
2fae0 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20  reLoops..  **.  
2faf0 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f  ** TUNING: Do no
2fb00 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72  t let the number
2fb10 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67   of iterations g
2fb20 6f 20 61 62 6f 76 65 20 32 35 2e 20 20 49 66 20  o above 25.  If 
2fb30 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66  the cost.  ** of
2fb40 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75   computing an au
2fb50 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73  tomatic index is
2fb60 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77   not paid back w
2fb70 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
2fb80 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68  25.  ** rows, th
2fb90 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68  en do not use th
2fba0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
2fbb0 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d  x. */.  aFrom[0]
2fbc0 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72  .nRow = MIN(pPar
2fbd0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20  se->nQueryLoop, 
2fbe0 34 36 29 3b 20 20 61 73 73 65 72 74 28 20 34 36  46);  assert( 46
2fbf0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2fc00 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d  25) );.  nFrom =
2fc10 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d   1;..  /* Precom
2fc20 70 75 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66  pute the cost of
2fc30 20 73 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e   sorting the fin
2fc40 61 6c 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69  al result set, i
2fc50 66 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a  f the caller.  *
2fc60 2a 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  * to sqlite3Wher
2fc70 65 42 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e  eBegin() was con
2fc80 63 65 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72  cerned about sor
2fc90 74 69 6e 67 20 2a 2f 0a 20 20 69 66 28 20 70 57  ting */.  if( pW
2fca0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
2fcb0 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20  0 || nRowEst==0 
2fcc0 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e  ){.    aFrom[0].
2fcd0 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20  isOrdered = 0;. 
2fce0 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b     nOrderBy = 0;
2fcf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 46  .  }else{.    aF
2fd00 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
2fd10 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 4f 72 64 65   = -1;.    nOrde
2fd20 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f  rBy = pWInfo->pO
2fd30 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
2fd40 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
2fd50 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f   successively lo
2fd60 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20  nger WherePaths 
2fd70 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f  using the previo
2fd80 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  us generation.  
2fd90 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73  ** of WherePaths
2fda0 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f   as the basis fo
2fdb0 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65  r the next.  Kee
2fdc0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d  p track of the m
2fdd0 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73  xChoice.  ** bes
2fde0 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20  t paths at each 
2fdf0 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
2fe00 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
2fe10 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
2fe20 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b  +){.    nTo = 0;
2fe30 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  .    for(ii=0, p
2fe40 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e  From=aFrom; ii<n
2fe50 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f  From; ii++, pFro
2fe60 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  m++){.      for(
2fe70 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70  pWLoop=pWInfo->p
2fe80 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70  Loops; pWLoop; p
2fe90 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e  WLoop=pWLoop->pN
2fea0 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20  extLoop){.      
2feb0 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
2fec0 77 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  w;.        Bitma
2fed0 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
2fee0 20 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64          i8 isOrd
2fef0 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  ered = pFrom->is
2ff00 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
2ff10 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
2ff20 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
2ff30 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
2ff40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ff50 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
2ff60 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
2ff70 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
2ff80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ff90 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
2ffa0 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61  , pWLoop is a ca
2ffb0 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68  ndidate to be th
2ffc0 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20  e next loop. .  
2ffd0 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65        ** Compute
2ffe0 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20   its cost */.   
2fff0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
30000 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57  ite3LogEstAdd(pW
30010 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c  Loop->rSetup,pWL
30020 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f  oop->rRun + pFro
30030 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  m->nRow);.      
30040 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65    rCost = sqlite
30050 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74  3LogEstAdd(rCost
30060 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b  , pFrom->rCost);
30070 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
30080 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
30090 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
300a0 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
300b0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
300c0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
300d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
300e0 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20  Ordered<0 ){.   
300f0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
30100 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
30110 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
30120 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
30130 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
30140 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
30150 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
30160 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
30170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30180 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
30190 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  revMask);.      
301a0 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65      if( isOrdere
301b0 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65  d>=0 && isOrdere
301c0 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  d<nOrderBy ){.  
301d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
301e0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
301f0 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
30200 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
30210 72 65 20 4e 20 69 73 20 0a 20 20 20 20 20 20 20  re N is .       
30220 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62       ** the numb
30230 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f  er of rows to so
30240 72 74 20 69 73 3a 0a 20 20 20 20 20 20 20 20 20  rt is:.         
30250 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
30260 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
30270 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
30280 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
30290 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
302a0 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65   Or, if the orde
302b0 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20  r-by clause has 
302c0 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79  X terms but only
302d0 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 20   the last Y .   
302e0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
302f0 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64  s are out of ord
30300 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73  er, then block-s
30310 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75  orting will redu
30320 63 65 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ce the .        
30330 20 20 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63      ** sorting c
30340 6f 73 74 20 74 6f 3a 0a 20 20 20 20 20 20 20 20  ost to:.        
30350 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
30360 20 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28     **   cost = (
30370 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29  3.0 * N * log(N)
30380 29 20 2a 20 28 59 2f 58 29 0a 20 20 20 20 20 20  ) * (Y/X).      
30390 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
303a0 20 20 20 20 20 2a 2a 20 54 68 65 20 28 59 2f 58       ** The (Y/X
303b0 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d  ) term is implem
303c0 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63  ented using stac
303d0 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c  k variable rScal
303e0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
303f0 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
30400 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72          LogEst r
30410 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74  Scale, rSortCost
30420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
30430 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30  sert( nOrderBy>0
30440 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c   && 66==sqlite3L
30450 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
30460 20 20 20 20 20 20 20 20 20 20 72 53 63 61 6c 65            rScale
30470 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
30480 28 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64  ((nOrderBy-isOrd
30490 65 72 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72  ered)*100/nOrder
304a0 42 79 29 20 2d 20 36 36 3b 0a 20 20 20 20 20 20  By) - 66;.      
304b0 20 20 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20        rSortCost 
304c0 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73 74 4c  = nRowEst + estL
304d0 6f 67 28 6e 52 6f 77 45 73 74 29 20 2b 20 72 53  og(nRowEst) + rS
304e0 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 20 20  cale + 16;..    
304f0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
30500 47 3a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69  G: The cost of i
30510 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54  mplementing DIST
30520 49 4e 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54  INCT using a B-T
30530 52 45 45 20 69 73 0a 20 20 20 20 20 20 20 20 20  REE is.         
30540 20 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62 75     ** similar bu
30550 74 20 77 69 74 68 20 61 20 6c 61 72 67 65 72 20  t with a larger 
30560 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f 70  constant of prop
30570 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20 20  ortionality. .  
30580 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 75 6c            ** Mul
30590 74 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64 69  tiply by an addi
305a0 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f 66  tional factor of
305b0 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 20 20 20 20   3.0.  */.      
305c0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
305d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
305e0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
305f0 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CT ){.          
30600 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d      rSortCost +=
30610 20 31 36 3b 0a 20 20 20 20 20 20 20 20 20 20 20   16;.           
30620 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 57   }.            W
30630 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
30640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30650 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
30660 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e  =%-3d (%d/%d) in
30670 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64  creases cost %3d
30680 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20   to %-3d\n",.   
30690 20 20 20 20 20 20 20 20 20 20 20 20 20 72 53 6f               rSo
306a0 72 74 43 6f 73 74 2c 20 28 6e 4f 72 64 65 72 42  rtCost, (nOrderB
306b0 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
306c0 72 64 65 72 42 79 2c 20 72 43 6f 73 74 2c 0a 20  rderBy, rCost,. 
306d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
306e0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
306f0 72 43 6f 73 74 2c 72 53 6f 72 74 43 6f 73 74 29  rCost,rSortCost)
30700 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
30710 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
30720 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c 20  ogEstAdd(rCost, 
30730 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20 20  rSortCost);.    
30740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30760 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d   revMask = pFrom
30770 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
30780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
30790 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
307a0 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
307b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78   added to the mx
307c0 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66  Choice best so f
307d0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  ar */.        fo
307e0 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
307f0 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
30800 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
30810 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
30820 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20  op==maskNew.    
30830 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d         && ((pTo-
30840 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
30850 65 72 65 64 29 26 38 30 29 3d 3d 30 0a 20 20 20  ered)&80)==0.   
30860 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f          && ((pTo
30870 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26  ->rCost<=rCost &
30880 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75  & pTo->nRow<=nOu
30890 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  t) ||.          
308a0 20 20 20 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73        (pTo->rCos
308b0 74 3e 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d  t>=rCost && pTo-
308c0 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20 20  >nRow>=nOut)).  
308d0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
308e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
308f0 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20   jj==nTo-1 );.  
30900 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
30910 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
30930 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20  f( jj>=nTo ){.  
30940 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
30950 3d 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f  =mxChoice && rCo
30960 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69  st>=mxCost ){.#i
30970 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
30980 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
30990 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
309a0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
309b0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
309c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
309d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69  DebugPrintf("Ski
309e0 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
309f0 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
30a00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30a10 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
30a20 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
30a30 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
30a40 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
30a50 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
30a60 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
30a70 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
30a80 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
30a90 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  f.            co
30aa0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
30ab0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
30ac0 20 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20   Add a new Path 
30ad0 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74  to the aTo[] set
30ae0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
30af0 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29  ( nTo<mxChoice )
30b00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
30b10 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   Increase the si
30b20 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65  ze of the aTo se
30b30 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  t by one */.    
30b40 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f          jj = nTo
30b50 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
30b60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
30b70 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70   /* New path rep
30b80 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20  laces the prior 
30b90 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f  worst to keep co
30ba0 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69  unt below mxChoi
30bb0 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
30bc0 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20    jj = mxI;.    
30bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30be0 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d    pTo = &aTo[jj]
30bf0 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
30c00 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
30c10 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
30c20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
30c30 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
30c40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30c50 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77  DebugPrintf("New
30c60 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64      %s cost=%-3d
30c70 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
30c80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30c90 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
30ca0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
30cb0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
30cc0 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
30cd0 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
30ce0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
30cf0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
30d00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
30d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30d20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
30d30 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70 54  ost<=rCost && pT
30d40 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 20 29 7b  o->nRow<=nOut ){
30d50 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
30d60 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
30d70 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
30d80 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
30d90 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
30da0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
30db0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
30dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30dd0 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
30de0 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
30df0 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
30e00 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
30e10 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
30e20 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
30e30 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
30e40 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
30e50 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
30e60 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
30e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
30e80 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30e90 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74  f("   vs %s cost
30ea0 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25  =%-3d,%d order=%
30eb0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
30ec0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
30ed0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
30ee0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
30ef0 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
30f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f10 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
30f20 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
30f30 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
30f40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
30f50 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
30f60 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
30f70 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a  rCost==rCost );.
30f80 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
30f90 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
30fa0 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
30fb0 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
30fc0 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20  ==rCost+1 );.   
30fd0 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20         /* A new 
30fe0 61 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72 65  and better score
30ff0 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c   for a previousl
31000 79 20 63 72 65 61 74 65 64 20 65 71 75 69 76 61  y created equiva
31010 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66  lent path */.#if
31020 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
31030 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
31040 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
31050 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
31060 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
31070 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
31080 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
31090 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20          "Update 
310a0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
310b0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
310c0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
310d0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
310e0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
310f0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
31100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
31110 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
31120 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
31130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
31140 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
31150 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74  f("  was %s cost
31160 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
31170 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
31180 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
31190 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
311a0 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
311b0 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
311c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
311d0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
311e0 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ? pTo->isOrdered
311f0 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
31200 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
31210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31220 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61    /* pWLoop is a
31230 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74   winner.  Add it
31240 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
31250 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
31260 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c        pTo->maskL
31270 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  oop = pFrom->mas
31280 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
31290 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
312a0 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d    pTo->revLoop =
312b0 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20   revMask;.      
312c0 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f    pTo->nRow = nO
312d0 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  ut;.        pTo-
312e0 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a  >rCost = rCost;.
312f0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
31300 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
31310 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
31320 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
31330 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
31340 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
31350 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
31360 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
31370 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
31380 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
31390 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
313a0 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20     mxI = 0;.    
313b0 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
313c0 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
313d0 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d 20 61         mxOut = a
313e0 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20  To[0].nRow;.    
313f0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20        for(jj=1, 
31400 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c  pTo=&aTo[1]; jj<
31410 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20  mxChoice; jj++, 
31420 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
31430 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
31440 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 70 54  st>mxCost || (pT
31450 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74  o->rCost==mxCost
31460 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 6d 78   && pTo->nRow>mx
31470 4f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Out) ){.        
31480 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70        mxCost = p
31490 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20  To->rCost;.     
314a0 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d           mxOut =
314b0 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20   pTo->nRow;.    
314c0 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
314d0 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  jj;.            
314e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
314f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
31500 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
31510 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
31520 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20    /* >=2 */.    
31530 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
31540 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20  Trace>=2 ){.    
31550 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31560 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72  intf("---- after
31570 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e   round %d ----\n
31580 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  ", iLoop);.     
31590 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61   for(ii=0, pTo=a
315a0 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b  To; ii<nTo; ii++
315b0 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
315c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
315d0 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25  intf(" %s cost=%
315e0 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72  -3d nrow=%-3d or
315f0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
31600 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
31610 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
31620 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
31630 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
31640 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
31650 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e  ered>=0 ? (pTo->
31660 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a  isOrdered+'0') :
31670 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
31680 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
31690 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>0 ){.         
316a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
316b0 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78  ntf(" rev=0x%llx
316c0 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f  \n", pTo->revLoo
316d0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
316e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
316f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
31700 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  "\n");.        }
31710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
31720 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77  endif..    /* Sw
31730 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20  ap the roles of 
31740 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f  aFrom and aTo fo
31750 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72  r the next gener
31760 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72  ation */.    pFr
31770 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54  om = aTo;.    aT
31780 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61  o = aFrom;.    a
31790 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20  From = pFrom;.  
317a0 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20    nFrom = nTo;. 
317b0 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d   }..  if( nFrom=
317c0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
317d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
317e0 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75  , "no query solu
317f0 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  tion");.    sqli
31800 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
31810 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72  pace);.    retur
31820 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
31830 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64    }.  .  /* Find
31840 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
31850 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69   path.  pFrom wi
31860 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
31870 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68  ing to that path
31880 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46   */.  pFrom = aF
31890 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b  rom;.  for(ii=1;
318a0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29   ii<nFrom; ii++)
318b0 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  {.    if( pFrom-
318c0 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d  >rCost>aFrom[ii]
318d0 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d  .rCost ) pFrom =
318e0 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d   &aFrom[ii];.  }
318f0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
31900 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70  o->nLevel==nLoop
31910 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   );.  /* Load th
31920 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
31930 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a  th into pWInfo *
31940 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
31950 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
31960 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  oop++){.    Wher
31970 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
31980 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f   pWInfo->a + iLo
31990 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  op;.    pLevel->
319a0 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20  pWLoop = pWLoop 
319b0 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69  = pFrom->aLoop[i
319c0 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65  Loop];.    pLeve
319d0 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f  l->iFrom = pWLoo
319e0 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65  p->iTab;.    pLe
319f0 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
31a00 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
31a10 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
31a20 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20  ].iCursor;.  }. 
31a30 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
31a40 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
31a50 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
31a60 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
31a70 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
31a80 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
31a90 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f  ==0.   && pWInfo
31aa0 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
31ab0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
31ac0 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20  .   && nRowEst. 
31ad0 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
31ae0 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74  notUsed;.    int
31af0 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
31b00 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
31b10 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
31b20 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f  pResultSet, pFro
31b30 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
31b40 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e      WHERE_DISTIN
31b50 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  CTBY, nLoop-1, p
31b60 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
31b70 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b  p-1], &notUsed);
31b80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49  .    if( rc==pWI
31b90 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d  nfo->pResultSet-
31ba0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
31bb0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
31bc0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
31bd0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
31be0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
31bf0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
31c00 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
31c10 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
31c20 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
31c30 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
31c40 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49  ->isOrdered==pWI
31c50 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
31c60 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
31c70 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
31c80 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
31c90 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
31ca0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
31cb0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42       pWInfo->nOB
31cc0 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  Sat = pFrom->isO
31cd0 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 69 66  rdered;.      if
31ce0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
31cf0 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  <0 ) pWInfo->nOB
31d00 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Sat = 0;.      p
31d10 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
31d20 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
31d30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
31d40 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
31d50 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
31d60 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20  YGROUP).        
31d70 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
31d80 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  t==pWInfo->pOrde
31d90 72 42 79 2d 3e 6e 45 78 70 72 0a 20 20 20 20 29  rBy->nExpr.    )
31da0 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
31db0 6e 6f 74 55 73 65 64 20 3d 20 30 3b 0a 20 20 20  notUsed = 0;.   
31dc0 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20     int nOrder = 
31dd0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
31de0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
31df0 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  , pWInfo->pOrder
31e00 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  By, .          p
31e10 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31  From, 0, nLoop-1
31e20 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
31e30 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
31e40 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  d.      );.     
31e50 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
31e60 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20  >sorted==0 );.  
31e70 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74      pWInfo->sort
31e80 65 64 20 3d 20 28 6e 4f 72 64 65 72 3d 3d 70 57  ed = (nOrder==pW
31e90 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
31ea0 6e 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  nExpr);.    }.  
31eb0 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
31ec0 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
31ed0 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
31ee0 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
31ef0 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
31f00 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
31f10 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
31f20 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
31f30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
31f40 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
31f50 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
31f60 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
31f70 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
31f80 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
31f90 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
31fa0 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
31fb0 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
31fc0 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
31fd0 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
31fe0 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
31ff0 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
32000 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
32010 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
32020 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
32030 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
32040 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
32050 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
32060 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
32070 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
32080 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
32090 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
320a0 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
320b0 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
320c0 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
320d0 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
320e0 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
320f0 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
32100 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
32110 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
32120 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32130 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
32140 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
32150 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
32160 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
32170 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
32180 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
32190 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
321a0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
321b0 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
321c0 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
321d0 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
321e0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
321f0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a  Index *pIdx;.  .
32200 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
32210 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
32220 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
32230 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
32240 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75  RCE_TABLE ) retu
32250 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
32260 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
32270 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
32280 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
32290 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
322a0 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
322b0 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
322c0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
322d0 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
322e0 3e 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e  >zIndex ) return
322f0 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74   0;.  iCur = pIt
32300 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
32310 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
32320 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75  C;.  pLoop = pBu
32330 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
32340 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
32350 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  0;.  pLoop->u.bt
32360 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ree.nSkip = 0;. 
32370 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
32380 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
32390 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20   0, WO_EQ, 0);. 
323a0 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
323b0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
323c0 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
323d0 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  EQ|WHERE_IPK|WHE
323e0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70  RE_ONEROW;.    p
323f0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  Loop->aLTerm[0] 
32400 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f  = pTerm;.    pLo
32410 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  op->nLTerm = 1;.
32420 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
32430 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
32440 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
32450 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75  of a rowid looku
32460 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70  p is 10 */.    p
32470 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b  Loop->rRun = 33;
32480 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33    /* 33==sqlite3
32490 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20  LogEst(10) */.  
324a0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
324b0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
324c0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
324d0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
324e0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
324f0 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f  aLTermSpace==pLo
32500 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20  op->aLTerm );.  
32510 20 20 20 20 61 73 73 65 72 74 28 20 41 72 72 61      assert( Arra
32520 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54  ySize(pLoop->aLT
32530 65 72 6d 53 70 61 63 65 29 3d 3d 34 20 29 3b 0a  ermSpace)==4 );.
32540 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
32550 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
32560 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78   .       || pIdx
32570 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
32580 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  =0 .       || pI
32590 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61  dx->nKeyCol>Arra
325a0 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54  ySize(pLoop->aLT
325b0 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20  ermSpace) .     
325c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
325d0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
325e0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
325f0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
32600 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
32610 20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69 43   iCur, pIdx->aiC
32620 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f  olumn[j], 0, WO_
32630 45 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  EQ, pIdx);.     
32640 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
32650 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
32660 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
32670 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
32680 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d   }.      if( j!=
32690 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  pIdx->nKeyCol ) 
326a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
326b0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
326c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
326d0 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48  |WHERE_ONEROW|WH
326e0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
326f0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43     if( pIdx->isC
32700 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65  overing || (pIte
32710 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  m->colUsed & ~co
32720 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64  lumnsInIndex(pId
32730 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x))==0 ){.      
32740 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
32750 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
32760 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LY;.      }.    
32770 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
32780 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
32790 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
327a0 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
327b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
327c0 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20   pIdx;.      /* 
327d0 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
327e0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c  a unique index l
327f0 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20  ookup is 15 */. 
32800 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e       pLoop->rRun
32810 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73   = 39;  /* 39==s
32820 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29  qlite3LogEst(15)
32830 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
32840 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
32850 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
32860 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ){.    pLoop->nO
32870 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a  ut = (LogEst)1;.
32880 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
32890 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b  .pWLoop = pLoop;
328a0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  .    pLoop->mask
328b0 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26  Self = getMask(&
328c0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
328d0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49  , iCur);.    pWI
328e0 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75  nfo->a[0].iTabCu
328f0 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57  r = iCur;.    pW
32900 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
32910 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  1;.    if( pWInf
32920 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57  o->pOrderBy ) pW
32930 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20  Info->nOBSat =  
32940 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
32950 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
32960 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
32970 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
32980 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
32990 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
329a0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
329b0 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
329c0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
329d0 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f  E_DEBUG.    pLoo
329e0 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65  p->cId = '0';.#e
329f0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
32a00 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
32a10 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
32a20 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
32a30 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
32a40 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
32a50 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
32a60 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
32a70 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
32a80 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
32a90 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
32aa0 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
32ab0 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
32ac0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
32ad0 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
32ae0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
32af0 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
32b00 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
32b10 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
32b20 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
32b30 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
32b40 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
32b50 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
32b60 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
32b70 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
32b80 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
32b90 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
32ba0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
32bb0 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
32bc0 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
32bd0 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
32be0 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
32bf0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
32c00 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
32c10 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
32c20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
32c30 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
32c40 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
32c50 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
32c60 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
32c70 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
32c80 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
32c90 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
32ca0 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
32cb0 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
32cc0 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
32cd0 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
32ce0 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
32cf0 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
32d00 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
32d10 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
32d20 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
32d30 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
32d40 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
32d50 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
32d60 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
32d70 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
32d80 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
32d90 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
32da0 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
32db0 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
32dc0 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
32dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32de0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
32df0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
32e00 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
32e10 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
32e20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
32e30 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
32e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e50 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
32e60 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
32e70 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
32e80 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
32e90 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
32ea0 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
32eb0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
32ec0 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
32ed0 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
32ee0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
32ef0 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
32f00 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
32f10 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
32f20 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
32f30 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
32f40 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
32f50 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
32f60 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
32f70 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
32f80 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
32f90 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
32fa0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
32fb0 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
32fc0 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
32fd0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
32fe0 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
32ff0 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
33000 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
33010 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
33020 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
33030 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
33040 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
33050 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
33060 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
33070 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
33080 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
33090 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
330a0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
330b0 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
330c0 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
330d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
330e0 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
330f0 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
33100 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
33110 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
33120 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
33130 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
33140 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
33150 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
33160 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
33170 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
33180 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
33190 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
331a0 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
331b0 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
331c0 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
331d0 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
331e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
331f0 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
33200 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
33210 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
33220 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
33230 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
33240 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
33250 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
33260 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
33270 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
33280 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
33290 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
332a0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
332b0 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
332c0 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
332d0 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
332e0 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
332f0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
33300 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
33310 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
33320 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
33330 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
33340 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
33350 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
33360 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
33370 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
33380 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
33390 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
333a0 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
333b0 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
333c0 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
333d0 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
333e0 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
333f0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
33400 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
33410 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
33420 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
33430 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
33440 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
33450 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
33460 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
33470 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
33480 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
33490 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
334a0 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
334b0 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
334c0 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
334d0 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
334e0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
334f0 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
33500 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
33510 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
33520 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
33530 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
33540 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
33550 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
33560 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
33570 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
33580 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
33590 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
335a0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
335b0 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
335c0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
335d0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
335e0 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
335f0 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
33600 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
33610 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
33620 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
33630 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
33640 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
33650 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
33660 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
33670 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
33680 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
33690 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
336a0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
336b0 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52  lause (or the GR
336c0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  OUP BY clause.**
336d0 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   if the WHERE_GR
336e0 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
336f0 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29  t in wctrlFlags)
33700 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
33710 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65  tement.** if the
33720 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
33730 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
33740 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
33750 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
33760 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
33770 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
33780 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
33790 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20  hen pOrderBy is 
337a0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
337b0 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65  iIdxCur paramete
337c0 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
337d0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
337e0 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52  ex.  If .** WHER
337f0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
33800 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20  is set, iIdxCur 
33810 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
33820 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
33830 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f  .** to use for O
33840 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R clause process
33850 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20  ing.  The WHERE 
33860 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73  clause should us
33870 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66  e this.** specif
33880 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57  ic cursor.  If W
33890 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
338a0 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65  IRED is set, the
338b0 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20  n iIdxCur is.** 
338c0 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  the first cursor
338d0 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
338e0 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
338f0 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75  indices.  iIdxCu
33900 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75  r should.** be u
33910 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
33920 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
33930 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20  ursor depending 
33940 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69  on which index i
33950 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68  s.** used..*/.Wh
33960 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
33970 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
33980 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
33990 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
339a0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
339b0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
339c0 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  ,    /* FROM cla
339d0 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61  use: A list of a
339e0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
339f0 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
33a00 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
33a10 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
33a20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
33a30 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
33a40 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
33a50 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63   (or GROUP BY) c
33a60 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
33a70 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52  /.  ExprList *pR
33a80 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73  esultSet, /* Res
33a90 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71  ult set of the q
33aa0 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63  uery */.  u16 wc
33ab0 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
33ac0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
33ad0 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
33ae0 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
33af0 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  .h */.  int iIdx
33b00 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur           /*
33b10 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   If WHERE_ONETAB
33b20 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
33b30 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d  index cursor num
33b40 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ber */.){.  int 
33b50 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
33b60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
33b70 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
33b80 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
33b90 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
33ba0 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
33bb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33bc0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
33bd0 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
33be0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
33bf0 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
33c00 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
33c10 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
33c20 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
33c30 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
33c40 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
33c50 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
33c60 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
33c70 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
33c80 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
33c90 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
33ca0 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
33cb0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
33cc0 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20  er sWLB;     /* 
33cd0 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75  The WhereLoop bu
33ce0 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  ilder */.  Where
33cf0 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
33d00 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
33d10 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
33d20 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
33d30 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
33d40 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
33d50 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
33d60 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
33d70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
33d80 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
33d90 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f  a single WhereLo
33da0 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
33db0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
33dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
33dd0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
33de0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
33df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
33e00 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
33e10 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
33e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
33e40 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  */...  /* Variab
33e50 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
33e60 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  n */.  db = pPar
33e70 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74  se->db;.  memset
33e80 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f  (&sWLB, 0, sizeo
33e90 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20  f(sWLB));..  /* 
33ea0 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42  An ORDER/GROUP B
33eb0 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65  Y clause of more
33ec0 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63   than 63 terms c
33ed0 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
33ee0 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ed */.  testcase
33ef0 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
33f00 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42  rderBy->nExpr==B
33f10 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f  MS-1 );.  if( pO
33f20 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
33f30 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29  By->nExpr>=BMS )
33f40 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
33f50 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
33f60 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
33f70 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
33f80 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
33f90 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
33fa0 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
33fb0 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
33fc0 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
33fd0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
33fe0 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
33ff0 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
34000 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
34010 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
34020 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c  pt) ){.    wctrl
34030 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
34040 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20  WANT_DISTINCT;. 
34050 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d   }..  /* The num
34060 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
34070 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
34080 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
34090 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
340a0 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
340b0 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
340c0 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
340d0 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
340e0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
340f0 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
34100 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
34110 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
34120 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
34130 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
34140 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
34150 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
34160 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
34170 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
34180 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
34190 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
341a0 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
341b0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
341c0 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
341d0 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
341e0 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
341f0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
34200 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
34210 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
34220 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
34230 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
34240 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
34250 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
34260 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
34270 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
34280 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
34290 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
342a0 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
342b0 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
342c0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
342d0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
342e0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
342f0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
34300 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
34310 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
34320 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
34330 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
34340 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
34350 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
34360 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
34370 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
34380 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
34390 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
343a0 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
343b0 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
343c0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
343d0 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
343e0 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
343f0 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
34400 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
34410 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
34420 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
34430 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
34440 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
34450 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
34460 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
34470 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
34480 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
34490 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
344a0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
344b0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
344c0 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
344d0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
344e0 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
344f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
34500 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
34510 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
34520 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
34530 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
34540 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
34550 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
34560 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e  ss[0] = pWInfo->
34570 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
34580 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  = -1;.  pWInfo->
34590 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
345a0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  t;.  pWInfo->pPa
345b0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
345c0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
345d0 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
345e0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
345f0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57  = pOrderBy;.  pW
34600 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
34610 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
34620 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
34630 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  = pWInfo->iConti
34640 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
34650 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
34660 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
34670 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
34680 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  ;.  pWInfo->save
34690 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
346a0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
346b0 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
346c0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
346d0 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
346e0 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
346f0 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
34700 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
34710 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
34720 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
34730 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
34740 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
34750 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
34760 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
34770 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
34780 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
34790 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
347a0 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
347b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
347c0 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
347d0 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
347e0 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
347f0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
34800 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
34810 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
34820 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
34830 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
34840 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
34850 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
34860 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
34870 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65  pWInfo);.  where
34880 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  Split(&pWInfo->s
34890 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  WC, pWhere, TK_A
348a0 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53  ND);.    .  /* S
348b0 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57  pecial case: a W
348c0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
348d0 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45   is constant.  E
348e0 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a  valuate the.  **
348f0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
34900 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72  either jump over
34910 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
34920 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20   or fall thru.. 
34930 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
34940 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65  ii<sWLB.pWC->nTe
34950 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  rm; ii++){.    i
34960 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c  f( nTabList==0 |
34970 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
34980 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73  onstantNotJoin(s
34990 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70  WLB.pWC->a[ii].p
349a0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
349b0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
349c0 65 28 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70  e(pParse, sWLB.p
349d0 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c  WC->a[ii].pExpr,
349e0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
349f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34a00 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
34a10 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
34a20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b      sWLB.pWC->a[
34a30 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54  ii].wtFlags |= T
34a40 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
34a50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
34a60 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d  al case: No FROM
34a70 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69   clause.  */.  i
34a80 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29  f( nTabList==0 )
34a90 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  {.    if( pOrder
34aa0 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  By ) pWInfo->nOB
34ab0 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Sat = pOrderBy->
34ac0 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77  nExpr;.    if( w
34ad0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
34ae0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
34af0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
34b00 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
34b10 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
34b20 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
34b30 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
34b40 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
34b50 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
34b60 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
34b70 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
34b80 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
34b90 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
34ba0 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
34bb0 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
34bc0 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
34bd0 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
34be0 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
34bf0 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
34c00 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
34c10 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
34c20 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
34c30 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
34c40 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
34c50 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
34c60 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
34c70 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
34c80 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
34c90 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
34ca0 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
34cb0 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
34cc0 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
34cd0 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
34ce0 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
34cf0 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
34d00 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
34d10 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
34d20 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
34d30 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
34d40 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
34d50 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
34d60 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
34d70 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
34d80 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
34d90 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
34da0 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
34db0 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
34dc0 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  5..  **.  ** Not
34dd0 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20  e that bitmasks 
34de0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
34df0 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  all pTabList->nS
34e00 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a  rc tables in.  *
34e10 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20  * pTabList, not 
34e20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  just the first n
34e30 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20  TabList tables. 
34e40 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72   nTabList is nor
34e50 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c  mally.  ** equal
34e60 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
34e70 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
34e80 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
34e90 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  f the.  ** WHERE
34ea0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
34eb0 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  lag is set..  */
34ec0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
34ed0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
34ee0 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74  ii++){.    creat
34ef0 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
34f00 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
34f10 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  iCursor);.  }.#i
34f20 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b  fndef NDEBUG.  {
34f30 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54  .    Bitmask toT
34f40 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  heLeft = 0;.    
34f50 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
34f60 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
34f70 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
34f80 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k m = getMask(pM
34f90 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
34fa0 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
34fb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34fc0 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74  (m-1)==toTheLeft
34fd0 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c   );.      toTheL
34fe0 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a  eft |= m;.    }.
34ff0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
35000 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
35010 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
35020 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65  ns.  Note that e
35030 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
35040 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20  ht.  ** add new 
35050 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e  virtual terms on
35060 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
35070 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
35080 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   We do not.  ** 
35090 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
350a0 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65  these virtual te
350b0 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
350c0 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
350d0 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b  nd.  ** and work
350e0 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74   forward so that
350f0 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75   the added virtu
35100 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76  al terms are nev
35110 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  er processed..  
35120 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  */.  exprAnalyze
35130 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 70  All(pTabList, &p
35140 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69  WInfo->sWC);.  i
35150 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
35160 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
35170 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
35180 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72  .  }..  if( wctr
35190 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
351a0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
351b0 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e      if( isDistin
351c0 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72  ctRedundant(pPar
351d0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70  se, pTabList, &p
351e0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73  WInfo->sWC, pRes
351f0 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20  ultSet) ){.     
35200 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
35210 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e   marking is poin
35220 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69  tless.  Ignore i
35230 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  t. */.      pWIn
35240 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
35250 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
35260 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
35270 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
35280 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
35290 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65   to ORDER BY the
352a0 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d   result set to m
352b0 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f  ake distinct pro
352c0 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a  cessing easier *
352d0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
352e0 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
352f0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a  ERE_DISTINCTBY;.
35300 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
35310 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74  rderBy = pResult
35320 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Set;.    }.  }..
35330 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
35340 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
35350 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54  ects */.  WHERET
35360 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
35370 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
35380 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a  t ***\n"));.  /*
35390 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72   Display all ter
353a0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
353b0 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 20 64 65  clause */.#if de
353c0 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
353d0 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66  _ENABLED) && def
353e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
353f0 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
35400 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
35410 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30  ereTrace & 0x100
35420 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
35430 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
35440 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
35450 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65  sqlite3ExplainBe
35460 67 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28  gin(v);.    for(
35470 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d  i=0; i<sWLB.pWC-
35480 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
35490 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
354a0 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 23 25 2d  inPrintf(v, "#%-
354b0 32 64 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20  2d ", i);.      
354c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
354d0 73 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65  sh(v);.      whe
354e0 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c  reExplainTerm(v,
354f0 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d   &sWLB.pWC->a[i]
35500 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
35510 45 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20  ExplainPop(v);. 
35520 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
35530 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a  ainNL(v);.    }.
35540 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
35550 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20  inFinish(v);.   
35560 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
35570 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
35580 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e  3VdbeExplanation
35590 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (v));.  }.#endif
355a0 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21  .  if( nTabList!
355b0 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74  =1 || whereShort
355c0 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b  Cut(&sWLB)==0 ){
355d0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
355e0 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29  oopAddAll(&sWLB)
355f0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
35600 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
35610 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44  ror;.  .    /* D
35620 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
35630 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
35640 63 74 73 20 69 66 20 77 68 65 72 65 74 72 61 63  cts if wheretrac
35650 65 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  e is enabled */.
35660 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
35670 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30  E_ENABLED /* !=0
35680 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
35690 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
356a0 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
356b0 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *p;.      int i
356c0 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
356d0 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22  har zLabel[] = "
356e0 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
356f0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
35700 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20  wyxz".          
35710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35720 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
35730 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
35740 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20  STUVWYXZ";.     
35750 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70   for(p=pWInfo->p
35760 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70  Loops, i=0; p; p
35770 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69  =p->pNextLoop, i
35780 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
35790 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73  cId = zLabel[i%s
357a0 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a  izeof(zLabel)];.
357b0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
357c0 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70  pPrint(p, sWLB.p
357d0 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WC);.      }.   
357e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20   }.#endif.  .   
357f0 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
35800 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20  (pWInfo, 0);.   
35810 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
35820 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
35830 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
35840 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
35850 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
35860 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
35870 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
35880 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20  >nRowOut+1);.   
35890 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
358a0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
358b0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
358c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
358d0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
358e0 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61  y==0 && (db->fla
358f0 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
35900 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a  rseOrder)!=0 ){.
35910 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
35920 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29  Mask = (Bitmask)
35930 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  (-1);.  }.  if( 
35940 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
35950 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63  NEVER(db->malloc
35960 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67  Failed) ){.    g
35970 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
35980 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  ror;.  }.#ifdef 
35990 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
359a0 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 69  ED /* !=0 */.  i
359b0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
359c0 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  race ){.    int 
359d0 69 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ii;.    sqlite3D
359e0 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
359f0 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25   Solution nRow=%
35a00 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  d", pWInfo->nRow
35a10 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Out);.    if( pW
35a20 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29  Info->nOBSat>0 )
35a30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
35a40 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44  ebugPrintf(" ORD
35a50 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c  ERBY=%d,0x%llx",
35a60 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c   pWInfo->nOBSat,
35a70 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
35a80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  );.    }.    swi
35a90 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69  tch( pWInfo->eDi
35aa0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
35ab0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
35ac0 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
35ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
35ae0 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
35af0 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20  INCT=unique");. 
35b00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35b10 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
35b20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
35b30 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
35b40 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
35b50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
35b60 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  T=ordered");.   
35b70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35b80 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
35b90 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
35ba0 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
35bb0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
35bc0 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
35bd0 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20  T=unordered");. 
35be0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35bf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
35c00 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
35c10 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f  tf("\n");.    fo
35c20 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66  r(ii=0; ii<pWInf
35c30 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29  o->nLevel; ii++)
35c40 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
35c50 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61  pPrint(pWInfo->a
35c60 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c  [ii].pWLoop, sWL
35c70 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20  B.pWC);.    }.  
35c80 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74  }.#endif.  /* At
35c90 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61  tempt to omit ta
35ca0 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  bles from the jo
35cb0 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65  in that do not e
35cc0 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74  ffect the result
35cd0 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
35ce0 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26  ->nLevel>=2.   &
35cf0 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a  & pResultSet!=0.
35d00 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
35d10 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
35d20 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69  LITE_OmitNoopJoi
35d30 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  n).  ){.    Bitm
35d40 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 65 78  ask tabUsed = ex
35d50 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
35d60 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75  (pMaskSet, pResu
35d70 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ltSet);.    if( 
35d80 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 20  sWLB.pOrderBy ) 
35d90 74 61 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c  tabUsed |= exprL
35da0 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
35db0 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72  askSet, sWLB.pOr
35dc0 64 65 72 42 79 29 3b 0a 20 20 20 20 77 68 69 6c  derBy);.    whil
35dd0 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  e( pWInfo->nLeve
35de0 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68  l>=2 ){.      Wh
35df0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
35e00 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f  *pEnd;.      pLo
35e10 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70  op = pWInfo->a[p
35e20 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d  WInfo->nLevel-1]
35e30 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69  .pWLoop;.      i
35e40 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62  f( (pWInfo->pTab
35e50 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
35e60 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  Tab].jointype & 
35e70 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72  JT_LEFT)==0 ) br
35e80 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28  eak;.      if( (
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 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )==0.       && (
35ec0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
35ed0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
35ee0 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
35ef0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
35f00 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62  }.      if( (tab
35f10 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  Used & pLoop->ma
35f20 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65  skSelf)!=0 ) bre
35f30 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  ak;.      pEnd =
35f40 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73   sWLB.pWC->a + s
35f50 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  WLB.pWC->nTerm;.
35f60 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
35f70 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65  sWLB.pWC->a; pTe
35f80 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  rm<pEnd; pTerm++
35f90 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
35fa0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
35fb0 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
35fc0 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  lf)!=0.         
35fd0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
35fe0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
35ff0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
36000 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
36010 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36020 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36030 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e     if( pTerm<pEn
36040 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
36050 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
36060 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f  ff, ("-> drop lo
36070 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e  op %c not used\n
36080 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b  ", pLoop->cId));
36090 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
360a0 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e  Level--;.      n
360b0 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d  TabList--;.    }
360c0 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
360d0 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f  E(0xffff,("*** O
360e0 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
360f0 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57  d ***\n"));.  pW
36100 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51  Info->pParse->nQ
36110 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e  ueryLoop += pWIn
36120 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20  fo->nRowOut;..  
36130 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
36140 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
36150 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
36160 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
36170 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
36180 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
36190 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
361a0 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
361b0 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68  opriate..  ** Th
361c0 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
361d0 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  ithm only works 
361e0 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
361f0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20  use constrains. 
36200 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
36210 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69  t to update a si
36220 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20  ngle row..  */. 
36230 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
36240 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
36250 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
36260 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   || pWInfo->nLev
36270 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28  el==1 );.  if( (
36280 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
36290 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
362a0 45 44 29 21 3d 30 20 0a 20 20 20 26 26 20 28 70  ED)!=0 .   && (p
362b0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
362c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
362d0 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20 29  ERE_ONEROW)!=0 )
362e0 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b  {.    pWInfo->ok
362f0 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20  OnePass = 1;.   
36300 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
36310 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
36320 62 29 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  b) ){.      pWIn
36330 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d  fo->a[0].pWLoop-
36340 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
36350 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
36360 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65   }.  }..  /* Ope
36370 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
36380 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
36390 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
363a0 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
363b0 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
363c0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ables..  */.  no
363d0 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
363e0 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
363f0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
36400 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  >a; ii<nTabList;
36410 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29   ii++, pLevel++)
36420 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
36430 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
36440 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
36450 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
36460 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61  /* Index of data
36470 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
36480 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20  table/index */. 
36490 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
364a0 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
364b0 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ;..    pTabItem 
364c0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
364d0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
364e0 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
364f0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
36500 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
36510 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
36520 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
36530 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
36540 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  >pWLoop;.    if(
36550 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
36560 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
36570 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
36580 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
36590 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
365a0 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
365b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
365c0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
365d0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
365e0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
365f0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
36600 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
36610 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
36620 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
36630 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
36640 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
36650 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
36660 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
36670 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
36680 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
36690 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
366a0 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
366b0 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
366c0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
366d0 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
366e0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
366f0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
36700 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
36710 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
36720 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
36730 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
36740 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20  N_CLOSE)==0 ){. 
36750 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50       int op = OP
36760 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
36770 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f   if( pWInfo->okO
36780 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20  nePass ){.      
36790 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72    op = OP_OpenWr
367a0 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49  ite;.        pWI
367b0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
367c0 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d  s[0] = pTabItem-
367d0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
367e0 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  };.      sqlite3
367f0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
36800 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
36810 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
36820 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  op);.      asser
36830 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t( pTabItem->iCu
36840 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54  rsor==pLevel->iT
36850 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74  abCur );.      t
36860 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f  estcase( !pWInfo
36870 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
36880 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
36890 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
368a0 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  se( !pWInfo->okO
368b0 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
368c0 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
368d0 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
368e0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
368f0 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48  b->nCol<BMS && H
36900 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
36910 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
36920 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63   b = pTabItem->c
36930 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20  olUsed;.        
36940 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
36950 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e     for(; b; b=b>
36960 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  >1, n++){}.     
36970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
36980 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65  angeP4(v, sqlite
36990 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
369a0 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  (v)-1, .        
369b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369c0 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54      SQLITE_INT_T
369d0 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54  O_PTR(n), P4_INT
369e0 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  32);.        ass
369f0 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
36a00 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol );.      }.  
36a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
36a20 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
36a30 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
36a40 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
36a50 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
36a60 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
36a70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
36a80 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
36a90 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f  Index *pIx = pLo
36aa0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
36ab0 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ex;.      int iI
36ac0 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69  ndexCur;.      i
36ad0 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
36ae0 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 49  ead;.      /* iI
36af0 64 78 43 75 72 20 69 73 20 61 6c 77 61 79 73 20  dxCur is always 
36b00 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69  set if to a posi
36b10 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e  tive value if ON
36b20 45 50 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c  EPASS is possibl
36b30 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
36b40 74 28 20 69 49 64 78 43 75 72 21 3d 30 20 7c 7c  t( iIdxCur!=0 ||
36b50 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
36b60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
36b70 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
36b80 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
36b90 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
36ba0 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  ){.        Index
36bb0 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d   *pJ = pTabItem-
36bc0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
36bd0 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
36be0 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
36bf0 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72      assert( wctr
36c00 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
36c10 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29  NEPASS_DESIRED )
36c20 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
36c30 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70   ALWAYS(pJ) && p
36c40 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20  J!=pIx ){.      
36c50 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b      iIndexCur++;
36c60 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20  .          pJ = 
36c70 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  pJ->pNext;.     
36c80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20     }.        op 
36c90 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
36ca0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
36cb0 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
36cc0 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
36cd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 49 64     }else if( iId
36ce0 78 43 75 72 20 26 26 20 28 77 63 74 72 6c 46 6c  xCur && (wctrlFl
36cf0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
36d00 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  ABLE_ONLY)!=0 ){
36d10 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
36d20 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  ur = iIdxCur;.  
36d30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36d40 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70     iIndexCur = p
36d50 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
36d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
36d70 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
36d80 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
36d90 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63  assert( pIx->pSc
36da0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
36db0 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ema );.      ass
36dc0 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d  ert( iIndexCur>=
36dd0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
36de0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
36df0 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70  op, iIndexCur, p
36e00 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  Ix->tnum, iDb);.
36e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36e20 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
36e30 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
36e40 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
36e50 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  , "%s", pIx->zNa
36e60 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  me));.    }.    
36e70 69 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c  if( iDb>=0 ) sql
36e80 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
36e90 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
36ea0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
36eb0 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49  &= ~getMask(&pWI
36ec0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
36ed0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
36ee0 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  );.  }.  pWInfo-
36ef0 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  >iTop = sqlite3V
36f00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
36f10 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
36f20 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
36f30 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
36f40 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
36f50 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
36f60 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
36f70 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
36f80 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
36f90 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
36fa0 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
36fb0 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
36fc0 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
36fd0 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
36fe0 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
36ff0 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
37000 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
37010 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i++){.    pLevel
37020 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
37030 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ];.#ifndef SQLIT
37040 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
37050 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
37060 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
37070 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
37080 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
37090 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
370a0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
370b0 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
370c0 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
370d0 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
370e0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
370f0 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
37100 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
37110 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
37120 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
37130 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
37140 65 6e 64 69 66 0a 20 20 20 20 65 78 70 6c 61 69  endif.    explai
37150 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
37160 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
37170 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
37180 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
37190 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  );.    pLevel->a
371a0 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  ddrBody = sqlite
371b0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
371c0 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  (v);.    notRead
371d0 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
371e0 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
371f0 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
37200 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
37210 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  e = pLevel->addr
37220 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Cont;.  }..  /* 
37230 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d  Done. */.  VdbeM
37240 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
37250 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f   "Begin WHERE-co
37260 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  re"));.  return 
37270 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
37280 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
37290 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
372a0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
372b0 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
372c0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
372d0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
372e0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
372f0 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
37300 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
37310 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
37320 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
37330 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
37340 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
37350 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
37360 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
37370 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
37380 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
37390 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
373a0 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
373b0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
373c0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
373d0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
373e0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
373f0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
37400 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
37410 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
37420 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
37430 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
37440 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
37450 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
37460 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
37470 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
37480 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
37490 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ode..  */.  Vdbe
374a0 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
374b0 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72  , "End WHERE-cor
374c0 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  e"));.  sqlite3E
374d0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
374e0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
374f0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
37500 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
37510 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70   int addr;.    p
37520 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
37530 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70  >a[i];.    pLoop
37540 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
37550 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  p;.    sqlite3Vd
37560 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
37570 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
37580 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
37590 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
375a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
375b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70  3VdbeAddOp3(v, p
375c0 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
375d0 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
375e0 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a  2, pLevel->p3);.
375f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37600 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65  eChangeP5(v, pLe
37610 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20  vel->p5);.      
37620 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
37630 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
37640 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
37650 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20  >op==OP_Next);. 
37660 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
37670 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
37680 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20  p==OP_Prev);.   
37690 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
376a0 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
376b0 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20  =OP_VNext);.    
376c0 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
376d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
376e0 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
376f0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
37700 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
37710 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
37720 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
37730 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
37740 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
37750 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
37760 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
37770 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
37780 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
37790 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
377a0 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
377b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
377c0 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
377d0 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
377e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
377f0 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e  eAddOp2(v, pIn->
37800 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d  eEndLoopOp, pIn-
37810 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
37820 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
37830 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
37840 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
37850 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e  erageIf(v, pIn->
37860 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50  eEndLoopOp==OP_P
37870 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20  revIfOpen);.    
37880 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
37890 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  If(v, pIn->eEndL
378a0 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66  oopOp==OP_NextIf
378b0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  Open);.        s
378c0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
378d0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
378e0 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
378f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
37900 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
37910 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
37920 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
37930 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
37940 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
37950 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
37960 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
37970 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
37980 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
37990 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
379a0 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
379b0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
379c0 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63  v, "next skip-sc
379d0 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70  an on %s", pLoop
379e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
379f0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
37a00 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
37a10 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Here(v, pLevel->
37a20 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20  addrSkip);.     
37a30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
37a40 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Here(v, pLevel->
37a50 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20  addrSkip-2);.   
37a60 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
37a70 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
37a80 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
37a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
37aa0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
37ab0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20  el->iLeftJoin); 
37ac0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
37ad0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
37ae0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
37af0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
37b00 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
37b10 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  | (pLoop->wsFlag
37b20 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
37b30 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)!=0 );.      i
37b40 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
37b50 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
37b60 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
37b70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37b80 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
37b90 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ow, pTabList->a[
37ba0 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
37bb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
37bc0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
37bd0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
37be0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37bf0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
37c00 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
37c10 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
37c20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
37c30 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74  evel->op==OP_Ret
37c40 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  urn ){.        s
37c50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
37c60 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c  (v, OP_Gosub, pL
37c70 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
37c80 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
37c90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37ca0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37cb0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
37cc0 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
37cd0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  First);.      }.
37ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37cf0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
37d00 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
37d10 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
37d20 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c  (v, "End WHERE-l
37d30 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20  oop%d: %s", i,. 
37d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d50 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62      pWInfo->pTab
37d60 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
37d70 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61  iFrom].pTab->zNa
37d80 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  me));.  }..  /* 
37d90 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
37da0 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
37db0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
37dc0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
37dd0 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
37de0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
37df0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
37e00 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
37e10 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
37e20 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c  o->nLevel<=pTabL
37e30 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66  ist->nSrc );.  f
37e40 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
37e50 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e  WInfo->a; i<pWIn
37e60 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c  fo->nLevel; i++,
37e70 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
37e80 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20  int k, last;.   
37e90 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
37ea0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
37eb0 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  0;.    struct Sr
37ec0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
37ed0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
37ee0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
37ef0 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
37f00 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
37f10 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
37f20 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
37f30 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
37f40 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a  >pWLoop;..    /*
37f50 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e   For a co-routin
37f60 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50  e, change all OP
37f70 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63  _Column referenc
37f80 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  es to the table 
37f90 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
37fa0 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50  -routine into OP
37fb0 5f 53 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74  _SCopy of result
37fc0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20   contained in a 
37fd0 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a  register..    **
37fe0 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65   OP_Rowid become
37ff0 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a  s OP_Null..    *
38000 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74  /.    if( pTabIt
38010 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
38020 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
38030 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 6c  ailed ){.      l
38040 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
38050 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
38060 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65  .      k = pLeve
38070 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20  l->addrBody;.   
38080 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
38090 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b  VdbeGetOp(v, k);
380a0 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c  .      for(; k<l
380b0 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
380c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if