/ Hex Artifact Content
Login

Artifact 0a518940065c10ad8dedf8f2d6e73f1e14eb8472:


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 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
11790 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
117a0 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d  ){.      nRet -=
117b0 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   10;        asse
117c0 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
117d0 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20  ogEst(2) );.    
117e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65  }else{.      nRe
117f0 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20  t -= 20;        
11800 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69  assert( 20==sqli
11810 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a  te3LogEst(4) );.
11820 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11830 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nRet;.}../*.*
11840 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11850 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d  is used to estim
11860 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
11870 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
11880 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62   be visited.** b
11890 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e  y scanning an in
118a0 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
118b0 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72  of values. The r
118c0 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e  ange may have an
118d0 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c   upper.** bound,
118e0 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20   a lower bound, 
118f0 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45  or both. The WHE
11900 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
11910 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70  that set the upp
11920 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20  er.** and lower 
11930 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65  bounds are repre
11940 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72  sented by pLower
11950 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
11960 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a  ectively. For.**
11970 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
11980 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20  ng that index p 
11990 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a  is on t1(a):.**.
119a0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
119b0 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
119c0 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20   a < ? ....**   
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f   |_____|   |____
119f0 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _|.**           
11a00 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
11a10 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11a30 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a  Lower    pUpper.
11a40 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
11a50 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20  of the upper or 
11a60 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e  lower bound is n
11a70 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
11a80 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20   NULL is passed 
11a90 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74  in.** place of t
11aa0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11ab0 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
11ac0 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28  * The value in (
11ad0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
11ae0 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20  u.btree.nEq) is 
11af0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
11b00 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e   index.** column
11b10 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
11b20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
11b30 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
11b40 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
11b50 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f  f.** equality co
11b60 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69  nstraints optimi
11b70 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
11b80 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
11b90 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
11ba0 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
11bb0 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c   is on t1(a, b),
11bc0 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
11bd0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
11be0 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
11bf0 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
11c00 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
11c10 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
11c20 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68   set to 1 (as th
11c30 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
11c40 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73  ed column, b, is
11c50 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
11c60 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
11c70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
11c80 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
11c90 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
11ca0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
11cb0 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
11cc0 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
11cd0 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  q is set to 0..*
11ce0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
11cf0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11d00 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74  d, *pnOut is set
11d10 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c   to the sqlite3L
11d20 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a  ogEst() of the.*
11d30 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
11d40 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
11d50 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64  scan is expected
11d60 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75   to visit withou
11d70 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e  t .** considerin
11d80 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  g the range cons
11d90 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20  traints. If nEq 
11da0 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 74 68  is 0, this is th
11db0 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
11dc0 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
11dd0 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  x. Assuming no e
11de0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e  rror occurs, *pn
11df0 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20  Out is adjusted 
11e00 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20  (reduced).** to 
11e10 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
11e20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73  range contraints
11e30 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
11e40 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68  er..** .** In th
11e50 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
11e60 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a  ite_stat4 ANALYZ
11e70 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75  E data, or if su
11e80 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62  ch data cannot b
11e90 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68 20  e.** used, each 
11ea0 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79  range inequality
11eb0 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
11ec0 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66  rch space by a f
11ed0 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20  actor of 4. .** 
11ee0 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66 20  Hence a pair of 
11ef0 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f  constraints (x>?
11f00 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65   AND x<?) reduce
11f10 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e  s the expected n
11f20 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73  umber of.** rows
11f30 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61   visited by a fa
11f40 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73  ctor of 16..*/.s
11f50 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
11f60 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50  angeScanEst(.  P
11f70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11f80 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
11f90 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
11fa0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
11fb0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
11fc0 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72  pBuilder,.  Wher
11fd0 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
11fe0 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
11ff0 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
12000 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
12010 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
12020 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
12030 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
12040 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
12050 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
12060 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
12070 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20  ereLoop *pLoop  
12080 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65     /* Modify the
12090 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65   .nOut and maybe
120a0 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f   .rRun fields */
120b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
120c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
120d0 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f  nOut = pLoop->nO
120e0 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65  ut;.  LogEst nNe
120f0 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w;..#ifdef SQLIT
12100 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
12110 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20  R_STAT4.  Index 
12120 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
12130 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
12140 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
12150 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69  .btree.nEq;..  i
12160 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a  f( p->nSample>0.
12170 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69 6c     && nEq==pBuil
12180 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a 20  der->nRecValid. 
12190 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d    && nEq<p->nSam
121a0 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74  pleCol.   && Opt
121b0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
121c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
121d0 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b  ITE_Stat3) .  ){
121e0 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63  .    UnpackedRec
121f0 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
12200 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
12210 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20  tRowcnt a[2];.  
12220 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 2f    u8 aff;..    /
12230 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77 65  * Variable iLowe
12240 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  r will be set to
12250 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66   the estimate of
12260 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12270 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  ows in .    ** t
12280 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
12290 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  e less than the 
122a0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
122b0 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
122c0 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72  The.    ** lower
122d0 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65   bound being the
122e0 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
122f0 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65  f $P and $L, whe
12300 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20  re $P is the.   
12310 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66   ** key-prefix f
12320 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71  ormed by the nEq
12330 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20   values matched 
12340 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20  against the nEq 
12350 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a 2a  left-most.    **
12360 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
12370 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
12380 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
12390 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ower..    **.   
123a0 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65   ** Or, if pLowe
123b0 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20  r is NULL or $L 
123c0 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
123d0 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63  ted from it (bec
123e0 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20 69  ause it.    ** i
123f0 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
12400 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
12410 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
12420 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
12430 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 69  e.    ** range i
12440 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20 71  s $P. Due to a q
12450 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79 20  uirk in the way 
12460 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
12470 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20  works, even.    
12480 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69  ** if $L is avai
12490 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53  lable, whereKeyS
124a0 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64  tats() is called
124b0 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61   for both ($P) a
124c0 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a 24  nd .    ** ($P:$
124d0 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65  L) and the large
124e0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74  r of the two ret
124f0 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65  urned values use
12500 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
12510 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70   Similarly, iUpp
12520 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20  er is to be set 
12530 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
12540 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
12550 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65 73   rows.    ** les
12560 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65 72  s than the upper
12570 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
12580 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72 65  nge query. Where
12590 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
125a0 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
125b0 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
125c0 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
125d0 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
125e0 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
125f0 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20     ** of iUpper 
12600 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66  are requested of
12610 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
12620 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72   and the smaller
12630 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20   used..    */.  
12640 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
12650 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55  ;.    tRowcnt iU
12660 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e  pper;..    if( n
12670 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Eq==p->nKeyCol )
12680 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
12690 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
126a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
126b0 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62     aff = p->pTab
126c0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
126d0 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e  lumn[nEq]].affin
126e0 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  ity;.    }.    /
126f0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77  * Determine iLow
12700 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73  er and iUpper us
12710 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a  ing ($P) only. *
12720 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30  /.    if( nEq==0
12730 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
12740 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
12750 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  er = sqlite3LogE
12760 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
12770 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20  LogEst[0]);.    
12780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
12790 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20  Note: this call 
127a0 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a  could be optimiz
127b0 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20  ed away - since 
127c0 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20  the same values 
127d0 6d 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 68  must .      ** h
127e0 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
127f0 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20  ed when testing 
12800 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45  key $P in whereE
12810 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20  qualScanEst().  
12820 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b 65  */.      whereKe
12830 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
12840 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
12850 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
12860 30 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72  0];.      iUpper
12870 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
12880 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12890 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
128a0 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
128b0 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
128c0 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
128d0 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
128e0 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12900 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
12910 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
12920 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
12930 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
12940 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
12950 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
12960 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f  ert( (pLower->eO
12970 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
12980 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_GE))!=0 );. 
12990 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
129a0 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
129b0 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
129c0 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
129d0 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
129e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
129f0 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a  TE_OK && bOk ){.
12a00 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
12a10 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68  iNew;.        wh
12a20 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
12a30 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
12a40 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77  a);.        iNew
12a50 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77   = a[0] + ((pLow
12a60 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
12a70 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a 20  WO_GT) ? a[1] : 
12a80 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
12a90 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c  iNew>iLower ) iL
12aa0 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  ower = iNew;.   
12ab0 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
12ac0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
12ad0 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
12ae0 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
12af0 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20 75  Upper estimate u
12b00 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f  sing ($P:$U). */
12b10 0a 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20  .    if( pUpper 
12b20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  ){.      int bOk
12b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12b40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
12b50 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74  value is extract
12b60 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f  ed from pExpr */
12b70 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
12b80 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
12b90 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
12ba0 20 20 61 73 73 65 72 74 28 20 28 70 55 70 70 65    assert( (pUppe
12bb0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
12bc0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30  WO_LT|WO_LE))!=0
12bd0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
12be0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
12bf0 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
12c00 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
12c10 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b  , aff, nEq, &bOk
12c20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
12c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f  =SQLITE_OK && bO
12c40 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52 6f  k ){.        tRo
12c50 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
12c60 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
12c70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
12c80 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 1, a);.       
12c90 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28   iNew = a[0] + (
12ca0 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
12cb0 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61 5b  or & WO_LE) ? a[
12cc0 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
12cd0 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72   if( iNew<iUpper
12ce0 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77   ) iUpper = iNew
12cf0 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d  ;.        nOut--
12d00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12d10 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
12d20 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
12d30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12d40 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
12d50 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a  Upper>iLower ){.
12d60 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73          nNew = s
12d70 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70  qlite3LogEst(iUp
12d80 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20  per - iLower);. 
12d90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12da0 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20      nNew = 10;  
12db0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30        assert( 10
12dc0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
12dd0 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2) );.      }.  
12de0 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75      if( nNew<nOu
12df0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 75  t ){.        nOu
12e00 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
12e10 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  }.      pLoop->n
12e20 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
12e30 75 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ut;.      WHERET
12e40 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e  RACE(0x10, ("ran
12e50 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ge scan regions:
12e60 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
12e70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
12e90 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
12ea0 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
12eb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12ec0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
12ed0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
12ee0 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
12ef0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12f00 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b  METER(pBuilder);
12f10 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
12f20 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
12f30 65 72 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  er );.  nNew = w
12f40 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
12f50 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20  pLower, nOut);. 
12f60 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
12f70 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c  geAdjust(pUpper,
12f80 20 6e 4e 65 77 29 3b 0a 20 20 2f 2a 20 54 55 4e   nNew);.  /* TUN
12f90 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73  ING: If there is
12fa0 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61   both an upper a
12fb0 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 2c 20  nd lower limit, 
12fc0 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65  assume the range
12fd0 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64   is.  ** reduced
12fe0 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
12ff0 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e  l 75%. This mean
13000 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75  s that, by defau
13010 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65  lt, an open-ende
13020 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65  d.  ** range que
13030 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f  ry (e.g. col > ?
13040 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
13050 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65  match 1/4 of the
13060 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a   rows in the.  *
13070 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61  * index. While a
13080 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65   closed range (e
13090 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20  .g. col BETWEEN 
130a0 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69  ? AND ?) is esti
130b0 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61  mated to.  ** ma
130c0 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20  tch 1/64 of the 
130d0 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28  index. */ .  if(
130e0 20 70 4c 6f 77 65 72 20 26 26 20 70 55 70 70 65   pLower && pUppe
130f0 72 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a  r ) nNew -= 20;.
13100 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65    nOut -= (pLowe
13110 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21  r!=0) + (pUpper!
13120 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c  =0);.  if( nNew<
13130 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a  10 ) nNew = 10;.
13140 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
13150 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20  ) nOut = nNew;. 
13160 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
13170 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72  LogEst)nOut;.  r
13180 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
13190 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
131a0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
131b0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
131c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
131d0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
131e0 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
131f0 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
13200 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
13210 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
13220 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
13230 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
13240 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
13250 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
13260 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
13270 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
13280 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
13290 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
132a0 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
132b0 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
132c0 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
132d0 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
132e0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
132f0 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
13300 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
13310 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
13320 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
13330 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
13340 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
13350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13360 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
13370 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
13380 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
13390 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
133a0 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
133b0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
133c0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
133d0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
133e0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
133f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
13400 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
13410 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
13420 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
13430 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
13440 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
13450 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
13460 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
13470 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
13480 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
13490 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
134a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
134b0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
134c0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
134d0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
134e0 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
134f0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
13500 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
13510 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
13520 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
13530 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
13540 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
13550 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
13560 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
13570 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
13580 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
13590 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
135a0 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
135b0 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
135c0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
135d0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
135e0 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
135f0 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
13600 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
13610 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
13620 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
13630 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
13640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13650 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
13660 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13680 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
13690 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
136a0 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
136b0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
136c0 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62  stics */.  int b
136d0 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  Ok;..  assert( n
136e0 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Eq>=1 );.  asser
136f0 74 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79  t( nEq<=(p->nKey
13700 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  Col+1) );.  asse
13710 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
13720 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
13730 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
13740 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65   assert( pBuilde
13750 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71  r->nRecValid<nEq
13760 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c   );..  /* If val
13770 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69  ues are not avai
13780 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69  lable for all fi
13790 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65  elds of the inde
137a0 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  x to the left.  
137b0 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20  ** of this one, 
137c0 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20  no estimate can 
137d0 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20  be made. Return 
137e0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e  SQLITE_NOTFOUND.
137f0 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64   */.  if( pBuild
13800 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e  er->nRecValid<(n
13810 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  Eq-1) ){.    ret
13820 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
13830 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  UND;.  }..  /* T
13840 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
13850 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65  zation only. The
13860 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
13870 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
13880 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  ue().  ** below 
13890 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65  would return the
138a0 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f   same value.  */
138b0 0a 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b  .  if( nEq>p->nK
138c0 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e  eyCol ){.    *pn
138d0 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
138e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
138f0 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   }..  aff = p->p
13900 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
13910 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e  iColumn[nEq-1]].
13920 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d  affinity;.  rc =
13930 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
13940 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
13950 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
13960 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20  pr, aff, nEq-1, 
13970 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65  &bOk);.  pBuilde
13980 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
13990 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
139a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
139b0 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20  .  if( bOk==0 ) 
139c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
139d0 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64  TFOUND;.  pBuild
139e0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
139f0 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79  nEq;..  whereKey
13a00 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
13a10 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
13a20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
13a30 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
13a40 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
13a50 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a  (int)a[1]));.  *
13a60 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20  pnRow = a[1];.  
13a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13a80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13a90 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
13aa0 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65  _STAT4 */..#ifde
13ab0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13ac0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
13ad0 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
13ae0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
13af0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
13b00 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
13b10 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  ** an IN constra
13b20 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69  int where the ri
13b30 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
13b40 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
13b50 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66  .** is a list of
13b60 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c   values.  Exampl
13b70 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
13b80 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c  WHERE x IN (1,2,
13b90 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  3,4).**.** Write
13ba0 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
13bb0 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
13bc0 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
13bd0 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
13be0 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
13bf0 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
13c00 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
13c10 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
13c20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
13c30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13c40 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
13c50 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
13c60 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
13c70 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
13c80 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
13c90 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
13ca0 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
13cb0 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
13cc0 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
13cd0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
13ce0 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
13cf0 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
13d00 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
13d10 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
13d20 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e  atic int whereIn
13d30 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
13d40 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13d50 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
13d60 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
13d70 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
13d80 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
13d90 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74  lder,.  ExprList
13da0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
13db0 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
13dc0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
13dd0 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
13de0 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  )" */.  tRowcnt 
13df0 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
13e00 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
13e10 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
13e20 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
13e30 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
13e40 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
13e50 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f  Index;.  i64 nRo
13e60 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  w0 = sqlite3LogE
13e70 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
13e80 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e  LogEst[0]);.  in
13e90 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
13ea0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
13eb0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
13ec0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
13ed0 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
13ee0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
13ef0 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20  wcnt nEst;      
13f00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13f10 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
13f20 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52  gle term */.  tR
13f30 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20  owcnt nRowEst = 
13f40 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74  0;    /* New est
13f50 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
13f60 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
13f70 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
13f80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
13f90 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
13fa0 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
13fb0 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
13fc0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
13fd0 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78   && i<pList->nEx
13fe0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45  pr; i++){.    nE
13ff0 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
14000 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
14010 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
14020 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
14030 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
14040 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
14050 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
14060 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
14070 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
14080 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
14090 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
140a0 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77  ( nRowEst > nRow
140b0 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52  0 ) nRowEst = nR
140c0 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ow0;.    *pnRow 
140d0 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
140e0 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
140f0 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
14100 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f  : est=%g\n", nRo
14110 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73  wEst));.  }.  as
14120 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
14130 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56  nRecValid==nRecV
14140 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  alid );.  return
14150 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
14160 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
14170 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
14180 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
14190 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
141a0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
141b0 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
141c0 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
141d0 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
141e0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
141f0 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
14200 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
14210 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
14220 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
14230 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
14240 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
14250 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
14260 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
14270 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
14280 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
14290 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
142a0 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
142b0 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
142c0 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
142d0 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
142e0 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
142f0 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
14300 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
14310 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
14320 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
14330 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
14340 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
14350 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
14360 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
14370 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
14380 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
14390 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
143a0 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
143b0 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
143c0 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
143d0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
143e0 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
143f0 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
14400 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
14410 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
14420 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
14430 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
14440 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
14450 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
14460 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
14470 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
14480 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
14490 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
144a0 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
144b0 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
144c0 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
144d0 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
144e0 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
144f0 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
14500 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
14510 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
14520 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
14530 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
14540 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
14550 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
14560 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
14570 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
14580 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
14590 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
145a0 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
145b0 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
145c0 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
145d0 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
145e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
145f0 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
14600 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
14610 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
14620 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
14630 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
14640 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
14650 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26  ODED)==0.      &
14660 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
14670 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
14680 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
14690 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
146a0 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26 20  Join)).      && 
146b0 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64  (pLevel->notRead
146c0 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  y & pTerm->prere
146d0 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  qAll)==0.  ){.  
146e0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
146f0 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
14700 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69      if( pTerm->i
14710 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20  Parent>=0 ){.   
14720 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
14730 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70  ther = &pTerm->p
14740 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61  WC->a[pTerm->iPa
14750 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28  rent];.      if(
14760 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69   (--pOther->nChi
14770 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ld)==0 ){.      
14780 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
14790 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20  evel, pOther);. 
147a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
147b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
147c0 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  n OP_Affinity op
147d0 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68  code to apply th
147e0 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
147f0 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a  y string zAff.**
14800 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74   to the n regist
14810 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
14820 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20  base. .**.** As 
14830 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
14840 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
14850 20 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20   entries (which 
14860 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74  are no-ops) at t
14870 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  he.** beginning 
14880 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20  and end of zAff 
14890 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66  are ignored.  If
148a0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20   all entries in 
148b0 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49  zAff are.** SQLI
148c0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65  TE_AFF_NONE, the
148d0 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67  n no code gets g
148e0 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  enerated..**.** 
148f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
14900 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  es its own copy 
14910 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20  of zAff so that 
14920 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72  the caller is fr
14930 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20  ee.** to modify 
14940 7a 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20  zAff after this 
14950 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
14960 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14970 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
14980 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
14990 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e   int base, int n
149a0 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20  , char *zAff){. 
149b0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
149c0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
149d0 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  zAff==0 ){.    a
149e0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
149f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14a00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
14a10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d   }.  assert( v!=
14a20 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73  0 );..  /* Adjus
14a30 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20  t base and n to 
14a40 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45  skip over SQLITE
14a50 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65  _AFF_NONE entrie
14a60 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
14a70 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20  ng.  ** and end 
14a80 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  of the affinity 
14a90 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77  string..  */.  w
14aa0 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66  hile( n>0 && zAf
14ab0 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  f[0]==SQLITE_AFF
14ac0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d  _NONE ){.    n--
14ad0 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20  ;.    base++;.  
14ae0 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20    zAff++;.  }.  
14af0 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41  while( n>1 && zA
14b00 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f  ff[n-1]==SQLITE_
14b10 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
14b20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  n--;.  }..  /* C
14b30 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e  ode the OP_Affin
14b40 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68  ity opcode if th
14b50 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20  ere is anything 
14b60 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20  left to do. */. 
14b70 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
14b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14b90 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  2(v, OP_Affinity
14ba0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20  , base, n);.    
14bb0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
14bc0 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c  eP4(v, -1, zAff,
14bd0 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
14be0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
14bf0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
14c00 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a  base, n);.  }.}.
14c10 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
14c20 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
14c30 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  le equality term
14c40 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
14c50 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69  ause.  An equali
14c60 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62  ty.** term can b
14c70 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20  e either X=expr 
14c80 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20  or X IN (...).  
14c90 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65   pTerm is the te
14ca0 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64  rm to be .** cod
14cb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75  ed..**.** The cu
14cc0 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20  rrent value for 
14cd0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
14ce0 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
14cf0 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46  er iReg..**.** F
14d00 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  or a constraint 
14d10 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78  of the form X=ex
14d20 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  pr, the expressi
14d30 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  on is evaluated 
14d40 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c  and its.** resul
14d50 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  t is left on the
14d60 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e   stack.  For con
14d70 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
14d80 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a  form X IN (...).
14d90 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
14da0 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74  sets up a loop t
14db0 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65  hat will iterate
14dc0 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
14dd0 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63   of X..*/.static
14de0 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74   int codeEqualit
14df0 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  yTerm(.  Parse *
14e00 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
14e10 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
14e20 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
14e30 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20  rm *pTerm,   /* 
14e40 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  The term of the 
14e50 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
14e60 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
14e70 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
14e80 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f  , /* The level o
14e90 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
14ea0 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  e we are working
14eb0 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71   on */.  int iEq
14ec0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
14ed0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71 75  Index of the equ
14ee0 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68 69  ality term withi
14ef0 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a  n this level */.
14f00 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
14f10 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
14f20 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20  r reverse-order 
14f30 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f  IN operations */
14f40 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20  .  int iTarget  
14f50 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70         /* Attemp
14f60 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c  t to leave resul
14f70 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ts in this regis
14f80 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ter */.){.  Expr
14f90 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
14fa0 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  xpr;.  Vdbe *v =
14fb0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
14fc0 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20    int iReg;     
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14fe0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
14ff0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61   results */..  a
15000 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30  ssert( iTarget>0
15010 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70   );.  if( pX->op
15020 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69  ==TK_EQ ){.    i
15030 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
15040 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
15050 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
15060 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73  iTarget);.  }els
15070 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  e if( pX->op==TK
15080 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  _ISNULL ){.    i
15090 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
150a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
150b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
150c0 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64   0, iReg);.#ifnd
150d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
150e0 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b  UBQUERY.  }else{
150f0 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a  .    int eType;.
15100 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20      int iTab;.  
15110 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
15120 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c  *pIn;.    WhereL
15130 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65  oop *pLoop = pLe
15140 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20  vel->pWLoop;..  
15150 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
15160 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
15170 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20  RTUALTABLE)==0. 
15180 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75       && pLoop->u
15190 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
151a0 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d  .      && pLoop-
151b0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
151c0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d  >aSortOrder[iEq]
151d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
151e0 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29  stcase( iEq==0 )
151f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15200 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20  ( bRev );.      
15210 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20  bRev = !bRev;.  
15220 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15230 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
15240 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
15250 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  get;.    eType =
15260 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
15270 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20  dex(pParse, pX, 
15280 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70  0);.    if( eTyp
15290 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
152a0 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  X_DESC ){.      
152b0 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29  testcase( bRev )
152c0 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21  ;.      bRev = !
152d0 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bRev;.    }.    
152e0 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c  iTab = pX->iTabl
152f0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
15300 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
15310 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
15320 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
15330 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
15340 67 65 49 66 28 76 2c 20 62 52 65 76 29 3b 0a 20  geIf(v, bRev);. 
15350 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
15360 66 28 76 2c 20 21 62 52 65 76 29 3b 0a 20 20 20  f(v, !bRev);.   
15370 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
15380 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15390 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b  _MULTI_OR)==0 );
153a0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
153b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f  ags |= WHERE_IN_
153c0 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c  ABLE;.    if( pL
153d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d  evel->u.in.nIn==
153e0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
153f0 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
15400 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15410 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  l(v);.    }.    
15420 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
15430 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ++;.    pLevel->
15440 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20  u.in.aInLoop =. 
15450 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
15460 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61  eallocOrFree(pPa
15470 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d  rse->db, pLevel-
15480 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 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 20 73 69 7a               siz
154b0 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  eof(pLevel->u.in
154c0 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65  .aInLoop[0])*pLe
154d0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a  vel->u.in.nIn);.
154e0 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c      pIn = pLevel
154f0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a  ->u.in.aInLoop;.
15500 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20      if( pIn ){. 
15510 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76       pIn += pLev
15520 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31  el->u.in.nIn - 1
15530 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75  ;.      pIn->iCu
15540 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  r = iTab;.      
15550 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
15560 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
15570 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
15580 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
15590 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
155a0 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29  wid, iTab, iReg)
155b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
155c0 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
155d0 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
155e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
155f0 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c  Column, iTab, 0,
15600 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   iReg);.      }.
15610 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c        pIn->eEndL
15620 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  oopOp = bRev ? O
15630 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f  P_PrevIfOpen : O
15640 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20  P_NextIfOpen;.  
15650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15660 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
15670 6c 6c 2c 20 69 52 65 67 29 3b 20 56 64 62 65 43  ll, iReg); VdbeC
15680 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
156a0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20  vel->u.in.nIn = 
156b0 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
156c0 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72    }.  disableTer
156d0 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
156e0 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  ;.  return iReg;
156f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15700 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
15710 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d  l evaluate all =
15720 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
15730 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69  ints for an.** i
15740 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a  ndex scan..**.**
15750 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f   For example, co
15760 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28  nsider table t1(
15770 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74  a,b,c,d,e,f) wit
15780 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63  h index i1(a,b,c
15790 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  )..** Suppose th
157a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
157b0 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e  s this:  a==5 AN
157c0 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41  D b IN (1,2,3) A
157d0 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a  ND c>5 AND c<10.
157e0 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73  ** The index has
157f0 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65   as many as thre
15800 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
15810 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74  raints, but in t
15820 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  his.** example, 
15830 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61  the third "c" va
15840 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61  lue is an inequa
15850 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74  lity.  So only t
15860 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  wo .** constrain
15870 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54  ts are coded.  T
15880 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
15890 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
158a0 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d  o evaluate.** a=
158b0 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32  =5 and b IN (1,2
158c0 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e  ,3).  The curren
158d0 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61  t values for a a
158e0 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f  nd b will be sto
158f0 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63  red.** in consec
15900 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20  utive registers 
15910 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66  and the index of
15920 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
15930 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ter is returned.
15940 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
15950 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d  ample above nEq=
15960 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75  =2.  But this su
15970 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66  broutine works f
15980 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20  or any value.** 
15990 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67  of nEq including
159a0 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20   0.  If nEq==0, 
159b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
159c0 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a  nearly a no-op..
159d0 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  ** The only thin
159e0 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c  g it does is all
159f0 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c  ocate the pLevel
15a00 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65  ->iMem memory ce
15a10 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74  ll and.** comput
15a20 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  e the affinity s
15a30 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tring..**.** The
15a40 20 6e 45 78 74 72 61 52 65 67 20 70 61 72 61 6d   nExtraReg param
15a50 65 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e 20  eter is 0 or 1. 
15a60 20 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c 20   It is 0 if all 
15a70 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
15a80 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20  straints.** are 
15a90 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72 65  == or IN and are
15aa0 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 65 20   covered by the 
15ab0 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67 20  nEq.  nExtraReg 
15ac0 69 73 20 31 20 69 66 20 74 68 65 72 65 20 69 73  is 1 if there is
15ad0 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  .** an inequalit
15ae0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73 75  y constraint (su
15af0 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35 20  ch as the "c>=5 
15b00 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68 65  AND c<10" in the
15b10 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a   example) that.*
15b20 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74  * occurs after t
15b30 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20 63  he nEq quality c
15b40 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a  onstraints..**.*
15b50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
15b60 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67 65  llocates a range
15b70 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52 65   of nEq+nExtraRe
15b80 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  g memory cells a
15b90 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68  nd returns.** th
15ba0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
15bb0 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  irst memory cell
15bc0 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e 20   in that range. 
15bd0 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  The code that.**
15be0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
15bf0 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61  ine will use tha
15c00 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20 74  t memory range t
15c10 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f 72  o store keys for
15c20 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74 65  .** start and te
15c30 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74  rmination condit
15c40 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
15c50 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  ..** key value o
15c60 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
15c70 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
15c80 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
15c90 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
15ca0 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
15cb0 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
15cc0 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
15cd0 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
15ce0 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  se..**.** Before
15cf0 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41   returning, *pzA
15d00 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ff is set to poi
15d10 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
15d20 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63  ontaining a.** c
15d30 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
15d40 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
15d50 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  g of the index a
15d60 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
15d70 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  * sqlite3DbMallo
15d80 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74  c(). Except, ent
15d90 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79  ries in the copy
15da0 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   of the string a
15db0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
15dc0 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  h equality const
15dd0 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20  raints that use 
15de0 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72  NONE affinity ar
15df0 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49  e set to.** SQLI
15e00 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69  TE_AFF_NONE. Thi
15e10 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74  s is to deal wit
15e20 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68  h SQL such as th
15e30 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
15e40 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
15e50 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d  E t1(a TEXT PRIM
15e60 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20  ARY KEY, b);.** 
15e70 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
15e80 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57  M t1 AS t2, t1 W
15e90 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62  HERE t1.a = t2.b
15ea0 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ;.**.** In the e
15eb0 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
15ec0 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29  e index on t1(a)
15ed0 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69   has TEXT affini
15ee0 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a  ty. But since.**
15ef0 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
15f00 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61  side of the equa
15f10 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
15f20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20  (t2.b) has NONE 
15f30 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
15f40 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
15f50 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
15f60 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
15f70 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
15f80 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
15f90 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
15fa0 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
15fb0 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
15fc0 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
15fd0 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
15fe0 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
15ff0 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
16000 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74  _AFF_NONE..*/.st
16010 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
16020 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
16030 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16040 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
16050 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
16060 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
16070 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
16080 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
16090 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
160a0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ing */.  int bRe
160b0 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v,             /
160c0 2a 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72  * Reverse the or
160d0 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  der of IN operat
160e0 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ors */.  int nEx
160f0 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f  traReg,        /
16100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
16110 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  a registers to a
16120 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
16130 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20  r **pzAff       
16140 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74     /* OUT: Set t
16150 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e  o point to affin
16160 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
16170 0a 20 20 75 31 36 20 6e 45 71 3b 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 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
161a0 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
161b0 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
161c0 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20  /.  u16 nSkip;  
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
161f0 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  eft-most columns
16200 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64   to skip */.  Vd
16210 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
16220 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
16230 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73  he vm under cons
16240 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
16250 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
16260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16270 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75  he index being u
16280 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  sed for this loo
16290 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  p */.  WhereTerm
162a0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
162b0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
162c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
162d0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
162e0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
162f0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
16300 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
16310 20 69 6e 74 20 6a 3b 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 20 2f                 /
16330 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
16340 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
16370 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  er */.  int nReg
16380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16390 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
163a0 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
163b0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
163c0 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20  ar *zAff;       
163d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
163e0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74  ffinity string t
163f0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f  o return */..  /
16400 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  * This module is
16410 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20   only called on 
16420 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74  query plans that
16430 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a   use an index. *
16440 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  /.  pLoop = pLev
16450 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73  el->pWLoop;.  as
16460 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
16470 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
16480 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
16490 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  ;.  nEq = pLoop-
164a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
164b0 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  nSkip = pLoop->u
164c0 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20  .btree.nSkip;.  
164d0 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
164e0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
164f0 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
16500 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
16510 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d  out how many mem
16520 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c  ory cells we wil
16530 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f  l need then allo
16540 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a  cate them..  */.
16550 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72    regBase = pPar
16560 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
16570 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  nReg = pLoop->u.
16580 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74  btree.nEq + nExt
16590 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d  raReg;.  pParse-
165a0 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a  >nMem += nReg;..
165b0 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33    zAff = sqlite3
165c0 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
165d0 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65  >db, sqlite3Inde
165e0 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  xAffinityStr(v, 
165f0 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a  pIdx));.  if( !z
16600 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Aff ){.    pPars
16610 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
16620 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  led = 1;.  }..  
16630 69 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20  if( nSkip ){.   
16640 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70   int iIdxCur = p
16650 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
16660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16670 64 64 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f  ddOp1(v, (bRev?O
16680 50 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64  P_Last:OP_Rewind
16690 29 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20  ), iIdxCur);.   
166a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
166b0 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20  v, bRev==0);.   
166c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
166d0 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20  v, bRev!=0);.   
166e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
166f0 20 22 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61   "begin skip-sca
16700 6e 20 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e  n on %s", pIdx->
16710 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d  zName));.    j =
16720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16730 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
16740 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
16750 53 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Skip = sqlite3Vd
16760 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28  beAddOp4Int(v, (
16770 62 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f  bRev?OP_SeekLT:O
16780 50 5f 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20  P_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 20 69 49 64 78 43 75 72 2c 20         iIdxCur, 
167b0 30 2c 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69  0, regBase, nSki
167c0 70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  p);.    VdbeCove
167d0 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
167e0 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  0);.    VdbeCove
167f0 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d  rageIf(v, bRev!=
16800 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
16810 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
16820 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  );.    for(j=0; 
16830 6a 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20  j<nSkip; j++){. 
16840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16850 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
16860 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c  umn, iIdxCur, j,
16870 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
16880 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
16890 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20  >aiColumn[j]>=0 
168a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
168b0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
168c0 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
168d0 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
168e0 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20  [j]].zName));.  
168f0 20 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f    }.  }    ..  /
16900 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
16910 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16920 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
16930 74 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69  t( zAff==0 || (i
16940 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e  nt)strlen(zAff)>
16950 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d  =nEq );.  for(j=
16960 6e 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  nSkip; j<nEq; j+
16970 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
16980 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
16990 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
169a0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
169b0 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 );.    /* The
169c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63   following testc
169d0 61 73 65 20 69 73 20 74 72 75 65 20 66 6f 72 20  ase is true for 
169e0 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64  indices with red
169f0 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20  undant columns. 
16a00 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41  .    ** Ex: CREA
16a10 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
16a20 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54  1(a,b,a); SELECT
16a30 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
16a40 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f   a=0 AND b=0; */
16a50 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
16a60 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
16a70 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20   TERM_CODED)!=0 
16a80 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
16a90 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
16aa0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
16ab0 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45  ;.    r1 = codeE
16ac0 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
16ad0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
16ae0 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42  l, j, bRev, regB
16af0 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20  ase+j);.    if( 
16b00 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b  r1!=regBase+j ){
16b10 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d  .      if( nReg=
16b20 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
16b30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16b40 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42  Reg(pParse, regB
16b50 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
16b60 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20  gBase = r1;.    
16b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16b90 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
16ba0 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a  r1, regBase+j);.
16bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16bc0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
16bd0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
16be0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
16bf0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
16c00 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
16c10 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  IN );.    if( (p
16c20 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
16c30 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
16c40 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  IN))==0 ){.     
16c50 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
16c60 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
16c70 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
16c80 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
16c90 4e 75 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a  Null(pRight) ){.
16ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16cb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16cc0 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
16cd0 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  j, pLevel->addrB
16ce0 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rk);.        Vdb
16cf0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16d00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16d10 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  zAff ){.        
16d20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
16d30 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
16d40 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c  t, zAff[j])==SQL
16d50 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
16d60 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a            zAff[j
16d70 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
16d80 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
16d90 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
16da0 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
16db0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
16dc0 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a  ht, zAff[j]) ){.
16dd0 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a            zAff[j
16de0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
16df0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
16e00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16e10 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66  .  *pzAff = zAff
16e20 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61  ;.  return regBa
16e30 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  se;.}..#ifndef S
16e40 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
16e50 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  IN./*.** This ro
16e60 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65  utine is a helpe
16e70 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64  r for explainInd
16e80 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a  exRange() below.
16e90 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73  **.** pStr holds
16ea0 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20   the text of an 
16eb0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
16ec0 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20  we are building 
16ed0 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61  up one term.** a
16ee0 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
16ef0 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e  routine adds a n
16f00 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65  ew term to the e
16f10 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  nd of the expres
16f20 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61  sion..** Terms a
16f30 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20  re separated by 
16f40 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22  AND so add the "
16f50 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65  AND" text for se
16f60 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75  cond and subsequ
16f70 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c  ent.** terms onl
16f80 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
16f90 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54  d explainAppendT
16fa0 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20  erm(.  StrAccum 
16fb0 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20  *pStr,          
16fc0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
16fd0 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
16fe0 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69  built */.  int i
16ff0 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
17000 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
17010 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46  of this term.  F
17020 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a  irst is zero */.
17030 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
17040 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a  olumn,        /*
17050 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
17060 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  umn */.  const c
17070 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20  har *zOp        
17080 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17090 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  the operator */.
170a0 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29  ){.  if( iTerm )
170b0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
170c0 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41  Append(pStr, " A
170d0 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69  ND ", 5);.  sqli
170e0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
170f0 64 41 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75  dAll(pStr, zColu
17100 6d 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  mn);.  sqlite3St
17110 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
17120 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71  r, zOp, 1);.  sq
17130 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
17140 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31  end(pStr, "?", 1
17150 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  );.}../*.** Argu
17160 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63  ment pLevel desc
17170 72 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79  ribes a strategy
17180 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61   for scanning ta
17190 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a  ble pTab. This .
171a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
171b0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
171c0 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
171d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65   containing a de
171e0 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20  scription.** of 
171f0 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61  the subset of ta
17200 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64  ble rows scanned
17210 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79   by the strategy
17220 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20   in the form of 
17230 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73  an.** SQL expres
17240 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c  sion. Or, if all
17250 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65   rows are scanne
17260 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  d, NULL is retur
17270 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ned..**.** For e
17280 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71  xample, if the q
17290 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  uery:.**.**   SE
172a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
172b0 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32  HERE a=1 AND b>2
172c0 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61  ;.**.** is run a
172d0 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  nd there is an i
172e0 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20  ndex on (a, b), 
172f0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
17300 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
17310 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74  string similar t
17320 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20  o:.**.**   "a=? 
17330 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54  AND b>?".**.** T
17340 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
17350 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65  ter points to me
17360 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
17370 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
17380 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74  oc()..** It is t
17390 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
173a0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
173b0 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66  to free the buff
173c0 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  er when it is.**
173d0 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   no longer requi
173e0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  red..*/.static c
173f0 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65  har *explainInde
17400 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a  xRange(sqlite3 *
17410 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
17420 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61  Loop, Table *pTa
17430 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  b){.  Index *pIn
17440 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
17450 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75  tree.pIndex;.  u
17460 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  16 nEq = pLoop->
17470 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75  u.btree.nEq;.  u
17480 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70  16 nSkip = pLoop
17490 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b  ->u.btree.nSkip;
174a0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43  .  int i, j;.  C
174b0 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54  olumn *aCol = pT
174c0 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20  ab->aCol;.  i16 
174d0 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64  *aiColumn = pInd
174e0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ex->aiColumn;.  
174f0 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20  StrAccum txt;.. 
17500 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28   if( nEq==0 && (
17510 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
17520 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
17530 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
17540 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  T))==0 ){.    re
17550 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
17560 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
17570 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51  t(&txt, 0, 0, SQ
17580 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29  LITE_MAX_LENGTH)
17590 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b  ;.  txt.db = db;
175a0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
175b0 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
175c0 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69   (", 2);.  for(i
175d0 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b  =0; i<nEq; i++){
175e0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
175f0 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  i==pIndex->nKeyC
17600 6f 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  ol ) ? "rowid" :
17610 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69   aCol[aiColumn[i
17620 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  ]].zName;.    if
17630 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20  ( i>=nSkip ){.  
17640 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
17650 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a  dTerm(&txt, i, z
17660 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73  , "=");.    }els
17670 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  e{.      if( i )
17680 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
17690 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 41  Append(&txt, " A
176a0 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20  ND ", 5);.      
176b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
176c0 70 70 65 6e 64 28 26 74 78 74 2c 20 22 41 4e 59  ppend(&txt, "ANY
176d0 28 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 73 71  (", 4);.      sq
176e0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
176f0 65 6e 64 41 6c 6c 28 26 74 78 74 2c 20 7a 29 3b  endAll(&txt, z);
17700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
17710 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
17720 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20  t, ")", 1);.    
17730 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a  }.  }..  j = i;.
17740 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
17750 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
17760 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72  IMIT ){.    char
17770 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78   *z = (j==pIndex
17780 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72  ->nKeyCol ) ? "r
17790 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43  owid" : aCol[aiC
177a0 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
177b0 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
177c0 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b  ndTerm(&txt, i++
177d0 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20  , z, ">");.  }. 
177e0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
177f0 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
17800 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
17810 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d  *z = (j==pIndex-
17820 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f  >nKeyCol ) ? "ro
17830 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
17840 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
17850 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
17860 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a  dTerm(&txt, i, z
17870 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71  , "<");.  }.  sq
17880 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
17890 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31  end(&txt, ")", 1
178a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
178b0 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
178c0 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  h(&txt);.}../*.*
178d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
178e0 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
178f0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  s currently proc
17900 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49  essing an EXPLAI
17910 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20  N QUERY PLAN.** 
17920 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20  command. If the 
17930 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70  query being comp
17940 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41  iled is an EXPLA
17950 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61  IN QUERY PLAN, a
17960 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72   single.** recor
17970 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  d is added to th
17980 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63  e output to desc
17990 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73  ribe the table s
179a0 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20  can strategy in 
179b0 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73  .** pLevel..*/.s
179c0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
179d0 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72  inOneScan(.  Par
179e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17a00 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
17a10 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
17a20 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
17a30 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74     /* Table list
17a40 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72   this loop refer
17a50 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c  s to */.  WhereL
17a60 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
17a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61            /* Sca
17a80 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78  n to write OP_Ex
17a90 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72  plain opcode for
17aa0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
17ab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17ac0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
17ad0 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d  or "level" colum
17ae0 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
17af0 20 69 6e 74 20 69 46 72 6f 6d 2c 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 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66   /* Value for "f
17b20 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f  rom" column of o
17b30 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77  utput */.  u16 w
17b40 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
17b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
17b60 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71  ags passed to sq
17b70 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
17b80 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  ) */.){.#ifndef 
17b90 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
17ba0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
17bb0 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20  in==2 ).#endif. 
17bc0 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72   {.    struct Sr
17bd0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
17be0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
17bf0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
17c00 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
17c10 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
17c20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63     /* VM being c
17c30 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20  onstructed */.  
17c40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17c50 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
17c60 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
17c70 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
17c80 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20  zMsg;           
17c90 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
17ca0 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75  to add to EQP ou
17cb0 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tput */.    int 
17cc0 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  iId = pParse->iS
17cd0 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c  electId;  /* Sel
17ce0 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73  ect id (left-mos
17cf0 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29  t output column)
17d00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65   */.    int isSe
17d10 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  arch;           
17d20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
17d30 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73  r a SEARCH. Fals
17d40 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20  e for SCAN. */. 
17d50 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
17d60 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
17d70 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c   /* The controll
17d80 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ing WhereLoop ob
17d90 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20  ject */.    u32 
17da0 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
17db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
17dc0 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
17dd0 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20   this loop */.. 
17de0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
17df0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66  l->pWLoop;.    f
17e00 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73  lags = pLoop->ws
17e10 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28  Flags;.    if( (
17e20 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54  flags&WHERE_MULT
17e30 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46  I_OR) || (wctrlF
17e40 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41  lags&WHERE_ONETA
17e50 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75  BLE_ONLY) ) retu
17e60 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63  rn;..    isSearc
17e70 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52  h = (flags&(WHER
17e80 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
17e90 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30  E_TOP_LIMIT))!=0
17ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
17eb0 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49  ((flags&WHERE_VI
17ec0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26  RTUALTABLE)==0 &
17ed0 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  & (pLoop->u.btre
17ee0 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20  e.nEq>0)).      
17ef0 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46        || (wctrlF
17f00 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45  lags&(WHERE_ORDE
17f10 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52  RBY_MIN|WHERE_OR
17f20 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20  DERBY_MAX));..  
17f30 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
17f40 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
17f50 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52  , isSearch?"SEAR
17f60 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20  CH":"SCAN");.   
17f70 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
17f80 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  ect ){.      zMs
17f90 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
17fa0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
17fb0 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  s SUBQUERY %d", 
17fc0 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c  zMsg,pItem->iSel
17fd0 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ectId);.    }els
17fe0 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  e{.      zMsg = 
17ff0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
18000 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41  db, zMsg, "%s TA
18010 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70  BLE %s", zMsg, p
18020 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
18030 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
18040 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
18050 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
18060 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
18070 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c  Msg, "%s AS %s",
18080 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41   zMsg, pItem->zA
18090 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lias);.    }.   
180a0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57   if( (flags & (W
180b0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56  HERE_IPK|WHERE_V
180c0 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30  IRTUALTABLE))==0
180d0 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28  .     && ALWAYS(
180e0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
180f0 49 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29 7b  Index!=0).    ){
18100 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68  .      char *zWh
18110 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64  ere = explainInd
18120 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f  exRange(db, pLoo
18130 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  p, pItem->pTab);
18140 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
18150 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
18160 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  , zMsg,.        
18170 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
18180 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
18190 58 29 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  X) ? .          
181a0 20 20 20 20 20 20 20 20 20 22 25 73 20 55 53 49           "%s USI
181b0 4e 47 20 41 55 54 4f 4d 41 54 49 43 20 25 73 49  NG AUTOMATIC %sI
181c0 4e 44 45 58 25 2e 30 73 25 73 22 20 3a 0a 20 20  NDEX%.0s%s" :.  
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 20 22 25 73 20 55 53 49 4e 47 20 25 73 49 4e 44   "%s USING %sIND
181f0 45 58 20 25 73 25 73 22 29 2c 20 0a 20 20 20 20  EX %s%s"), .    
18200 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c             zMsg,
18210 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
18220 5f 49 44 58 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f  _IDX_ONLY) ? "CO
18230 56 45 52 49 4e 47 20 22 20 3a 20 22 22 29 2c 0a  VERING " : ""),.
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18250 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
18260 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68  ndex->zName, zWh
18270 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ere);.      sqli
18280 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57  te3DbFree(db, zW
18290 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  here);.    }else
182a0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
182b0 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28  ERE_IPK)!=0 && (
182c0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
182d0 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a  NSTRAINT)!=0 ){.
182e0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
182f0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
18300 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47   zMsg, "%s USING
18310 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
18320 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20   KEY", zMsg);.. 
18330 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 28       if( flags&(
18340 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
18350 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
18360 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
18370 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
18380 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
18390 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73   (rowid=?)", zMs
183a0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
183b0 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
183c0 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48  _BOTH_LIMIT)==WH
183d0 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29  ERE_BOTH_LIMIT )
183e0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
183f0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
18400 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
18410 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69  rowid>? AND rowi
18420 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d<?)", zMsg);.  
18430 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
18440 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
18450 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
18460 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
18470 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
18480 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20  "%s (rowid>?)", 
18490 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
184a0 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 66 6c  se if( ALWAYS(fl
184b0 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
184c0 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20  MIT) ){.        
184d0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
184e0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
184f0 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c   "%s (rowid<?)",
18500 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
18510 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
18520 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
18530 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20  LTABLE.    else 
18540 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
18550 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
18560 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  !=0 ){.      zMs
18570 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
18580 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
18590 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  s VIRTUAL TABLE 
185a0 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d  INDEX %d:%s", zM
185b0 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
185c0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
185d0 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f  tab.idxNum, pLoo
185e0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
185f0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
18600 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
18610 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
18620 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29  Msg, "%s", zMsg)
18630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18640 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
18650 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76  plain, iId, iLev
18660 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c  el, iFrom, zMsg,
18670 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
18680 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
18690 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ne explainOneSca
186a0 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  n(u,v,w,x,y,z).#
186b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
186c0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
186d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
186e0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74   code for the st
186f0 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65  art of the iLeve
18700 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65  l-th loop in the
18710 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
18720 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
18730 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49  described by pWI
18740 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  nfo..*/.static B
18750 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f  itmask codeOneLo
18760 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65  opStart(.  Where
18770 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
18780 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f  /* Complete info
18790 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
187a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
187b0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
187c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
187d0 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66  h level of pWInf
187e0 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65  o->a[] should be
187f0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d   coded */.  Bitm
18800 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
18810 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73   /* Which tables
18820 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61   are currently a
18830 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  vailable */.){. 
18840 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
18850 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
18860 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
18870 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
18880 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
18890 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
188a0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  e */.  int addrN
188b0 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  xt;         /* W
188c0 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20  here to jump to 
188d0 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
188e0 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a  e next IN case *
188f0 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c  /.  int omitTabl
18900 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
18910 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
18920 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  ndex only */.  i
18930 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
18940 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
18950 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
18960 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
18970 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
18980 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65  *pLevel;  /* The
18990 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20   where level to 
189a0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
189b0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
189c0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
189d0 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e 67  oop object being
189e0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
189f0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
18a00 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
18a10 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
18a20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
18a30 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
18a40 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
18a50 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61    /* A WHERE cla
18a60 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61  use term */.  Pa
18a70 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18a90 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
18aa0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
18ab0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
18ac0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
18ad0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
18ae0 20 20 56 64 62 65 20 2a 76 3b 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 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
18b10 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e  d stmt under con
18b20 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
18b30 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18b40 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
18b50 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
18b60 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20  erm being coded 
18b70 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b  */.  int addrBrk
18b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18b90 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
18ba0 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
18bb0 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
18bc0 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20  int addrCont;   
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
18bf0 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
18c00 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
18c10 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b  t iRowidReg = 0;
18c20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
18c30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
18c40 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20  is register, if 
18c50 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e  not zero */.  in
18c60 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  t iReleaseReg = 
18c70 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  0;      /* Temp 
18c80 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
18c90 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
18ca0 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  g */..  pParse =
18cb0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
18cc0 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
18cd0 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70  Vdbe;.  pWC = &p
18ce0 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62  WInfo->sWC;.  db
18cf0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
18d00 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
18d10 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20  o->a[iLevel];.  
18d20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
18d30 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74  pWLoop;.  pTabIt
18d40 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  em = &pWInfo->pT
18d50 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
18d60 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72  ->iFrom];.  iCur
18d70 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
18d80 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  rsor;.  pLevel->
18d90 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65  notReady = notRe
18da0 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26  ady & ~getMask(&
18db0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
18dc0 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76 20  , iCur);.  bRev 
18dd0 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61  = (pWInfo->revMa
18de0 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20  sk>>iLevel)&1;. 
18df0 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
18e00 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
18e10 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d  HERE_IDX_ONLY)!=
18e20 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  0 .           &&
18e30 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
18e40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
18e50 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20  CE_TABLE)==0;.  
18e60 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
18e70 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45  t((v, "Begin WHE
18e80 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69  RE-loop%d: %s",i
18e90 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e  Level,pTabItem->
18ea0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  pTab->zName));..
18eb0 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
18ec0 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61  ls for the "brea
18ed0 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65  k" and "continue
18ee0 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20  " instructions. 
18ef0 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
18f00 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
18f10 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72  to addrBrk to br
18f20 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
18f30 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20  p..  ** Jump to 
18f40 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64  cont to go immed
18f50 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65  iately to the ne
18f60 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
18f70 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  the.  ** loop.. 
18f80 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68   **.  ** When th
18f90 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
18fa0 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
18fb0 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20  ave a "addrNxt" 
18fc0 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20  label that.  ** 
18fd0 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
18fe0 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
18ff0 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
19000 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a  tion.  When.  **
19010 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
19020 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
19030 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
19040 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62  he "addrNxt" lab
19050 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73  el.  ** is the s
19060 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22  ame as "addrBrk"
19070 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b  ..  */.  addrBrk
19080 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
19090 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
190a0 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
190b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
190c0 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65    addrCont = pLe
190d0 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20  vel->addrCont = 
190e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
190f0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  abel(v);..  /* I
19100 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
19110 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
19120 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
19130 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a  allocate and.  *
19140 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
19150 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
19160 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
19170 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
19180 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
19190 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
191a0 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
191b0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
191c0 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
191d0 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
191e0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
191f0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
19200 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
19210 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
19220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19230 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
19240 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
19250 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
19260 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46  nt((v, "init LEF
19270 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
19280 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20  flag"));.  }..  
19290 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20  /* Special case 
192a0 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
192b0 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d   subquery implem
192c0 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
192d0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70  utine */.  if( p
192e0 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  TabItem->viaCoro
192f0 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
19300 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
19310 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
19320 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19330 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
19340 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  tCoroutine, regY
19350 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65  ield, 0, pTabIte
19360 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
19370 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
19380 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
19390 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
193a0 2c 20 72 65 67 59 69 65 6c 64 2c 20 61 64 64 72  , regYield, addr
193b0 42 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Brk);.    VdbeCo
193c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56  verage(v);.    V
193d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
193e0 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73  next row of \"%s
193f0 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  \"", pTabItem->p
19400 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
19410 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
19420 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a  P_Goto;.  }else.
19430 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19440 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
19450 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d  E.  if(  (pLoop-
19460 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
19470 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
19480 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  0 ){.    /* Case
19490 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69   1:  The table i
194a0 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  s a virtual-tabl
194b0 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c  e.  Use the VFil
194c0 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20  ter and VNext.  
194d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f    **          to
194e0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
194f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
19500 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56   iReg;   /* P3 V
19510 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c  alue for OP_VFil
19520 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ter */.    int a
19530 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20  ddrNotFound;.   
19540 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
19550 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
19560 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ;..    sqlite3Ex
19570 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
19580 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  se);.    iReg = 
19590 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
195a0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e  nge(pParse, nCon
195b0 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
195c0 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
195d0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a  Level->addrBrk;.
195e0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
195f0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
19600 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72  {.      int iTar
19610 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a  get = iReg+j+2;.
19620 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c        pTerm = pL
19630 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
19640 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
19650 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
19660 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
19670 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
19680 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  N ){.        cod
19690 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
196a0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
196b0 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54  vel, j, bRev, iT
196c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
196d0 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
196e0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
196f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19700 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19710 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65  Code(pParse, pTe
19720 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
19730 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  t, iTarget);.   
19740 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
19750 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19760 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
19770 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
19780 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20  xNum, iReg);.   
19790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
197a0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
197b0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69  , nConstraint, i
197c0 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  Reg+1);.    sqli
197d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
197e0 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75   OP_VFilter, iCu
197f0 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c  r, addrNotFound,
19800 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20   iReg,.         
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
19820 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  op->u.vtab.idxSt
19830 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
19840 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
19850 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
19860 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50  ? P4_MPRINTF : P
19870 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 56  4_STATIC);.    V
19880 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19890 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
198a0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
198b0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
198c0 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c  Constraint && j<
198d0 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  16; j++){.      
198e0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74  if( (pLoop->u.vt
198f0 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26  ab.omitMask>>j)&
19900 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  1 ){.        dis
19910 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
19920 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
19930 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
19940 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  }.    pLevel->op
19950 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20   = OP_VNext;.   
19960 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
19970 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
19980 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
19990 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
199a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
199b0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
199c0 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74  se, iReg, nConst
199d0 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71  raint+2);.    sq
199e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
199f0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c  p(pParse);.  }el
19a00 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
19a10 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19a20 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
19a30 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
19a40 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a  & WHERE_IPK)!=0.
19a50 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
19a60 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
19a70 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
19a80 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20  OLUMN_EQ))!=0.  
19a90 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32  ){.    /* Case 2
19aa0 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
19ab0 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
19ac0 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
19ad0 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  an.    **       
19ae0 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
19af0 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
19b00 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
19b10 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   Or.    **      
19b20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
19b30 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
19b40 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
19b50 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20   (...)".    **  
19b60 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63          construc
19b70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
19b80 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62  sert( pLoop->u.b
19b90 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20  tree.nEq==1 );. 
19ba0 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
19bb0 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20  ->aLTerm[0];.   
19bc0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
19bd0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
19be0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
19bf0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19c00 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
19c10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
19c20 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19c30 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
19c40 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
19c50 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19c60 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d  .    iRowidReg =
19c70 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
19c80 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
19c90 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76   pLevel, 0, bRev
19ca0 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
19cb0 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 52 65      if( iRowidRe
19cc0 67 21 3d 69 52 65 6c 65 61 73 65 52 65 67 20 29  g!=iReleaseReg )
19cd0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19ce0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
19cf0 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20  ReleaseReg);.   
19d00 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
19d10 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
19d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d30 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
19d40 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64  t, iRowidReg, ad
19d50 64 72 4e 78 74 29 3b 20 56 64 62 65 43 6f 76 65  drNxt); VdbeCove
19d60 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
19d70 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19d80 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
19d90 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69  iCur, addrNxt, i
19da0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56  RowidReg);.    V
19db0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19dc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19dd0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
19de0 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69  ge(pParse, iRowi
19df0 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71  dReg, 1);.    sq
19e00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
19e10 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
19e20 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
19e30 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
19e40 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
19e50 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
19e60 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20  P_Noop;.  }else 
19e70 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
19e80 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
19e90 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
19ea0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
19eb0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
19ec0 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  ANGE)!=0.  ){.  
19ed0 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65    /* Case 3:  We
19ee0 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
19ef0 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
19f00 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
19f10 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20   field..    */. 
19f20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
19f30 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  OP_Noop;.    int
19f40 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20   start;.    int 
19f50 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b  memEndValue = 0;
19f60 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
19f70 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
19f80 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
19f90 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
19fa0 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  j = 0;.    pStar
19fb0 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20  t = pEnd = 0;.  
19fc0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
19fd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
19fe0 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20  _LIMIT ) pStart 
19ff0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1a000 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c  j++];.    if( pL
1a010 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1a020 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
1a030 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61   pEnd = pLoop->a
1a040 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
1a050 61 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d  assert( pStart!=
1a060 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a  0 || pEnd!=0 );.
1a070 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
1a080 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
1a090 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61  tart;.      pSta
1a0a0 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
1a0b0 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20   pEnd = pTerm;. 
1a0c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
1a0d0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
1a0e0 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1a0f0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
1a100 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65  sion that define
1a110 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  s the start boun
1a120 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  d */.      int r
1a130 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20  1, rTemp;       
1a140 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f   /* Registers fo
1a150 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74  r holding the st
1a160 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a  art boundary */.
1a170 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
1a180 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74  llowing constant
1a190 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65   maps TK_xx code
1a1a0 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e  s into correspon
1a1b0 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73  ding .      ** s
1a1c0 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74  eek opcodes.  It
1a1d0 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61   depends on a pa
1a1e0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e  rticular orderin
1a1f0 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20  g of TK_xx.     
1a200 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1a210 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b  u8 aMoveOp[] = {
1a220 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1a230 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GT */  OP_Seek
1a240 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  GT,.           /
1a250 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53  * TK_LE */  OP_S
1a260 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20 20  eekLE,.         
1a270 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f    /* TK_LT */  O
1a280 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20  P_SeekLT,.      
1a290 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f       /* TK_GE */
1a2a0 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20    OP_SeekGE.    
1a2b0 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72    };.      asser
1a2c0 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b  t( TK_LE==TK_GT+
1a2d0 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b  1 );      /* Mak
1a2e0 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72  e sure the order
1a2f0 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ing.. */.      a
1a300 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
1a310 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+2 );      /*
1a320 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f    ... of the TK_
1a330 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a  xx values... */.
1a340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1a350 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20  _GE==TK_GT+3 ); 
1a360 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20       /*  ... is 
1a370 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20  correcct. */..  
1a380 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74      assert( (pSt
1a390 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
1a3a0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
1a3b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a3c0 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73   pStart->wtFlags
1a3d0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1a3e0 29 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53  );.      pX = pS
1a3f0 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
1a400 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
1a410 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a420 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  se( pStart->left
1a430 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20  Cursor!=iCur ); 
1a440 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f  /* transitive co
1a450 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
1a460 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1a470 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1a480 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
1a490 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  &rTemp);.      s
1a4a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a4b0 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e  (v, aMoveOp[pX->
1a4c0 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c  op-TK_GT], iCur,
1a4d0 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
1a4e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a4f0 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1a500 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1a510 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  f(v, pX->op==TK_
1a520 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  GT);.      VdbeC
1a530 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d  overageIf(v, pX-
1a540 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20  >op==TK_LE);.   
1a550 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1a560 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  f(v, pX->op==TK_
1a570 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LT);.      VdbeC
1a580 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d  overageIf(v, pX-
1a590 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20  >op==TK_GE);.   
1a5a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1a5b0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1a5c0 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
1a5d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
1a5e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1a5f0 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
1a600 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1a610 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
1a620 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a640 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
1a650 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
1a660 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  d, iCur, addrBrk
1a670 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1a680 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d  erageIf(v, bRev=
1a690 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  =0);.      VdbeC
1a6a0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
1a6b0 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  v!=0);.    }.   
1a6c0 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20   if( pEnd ){.   
1a6d0 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
1a6e0 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45     pX = pEnd->pE
1a6f0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
1a700 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
1a710 20 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d    assert( (pEnd-
1a720 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1a730 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20  VNULL)==0 );.   
1a740 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e     testcase( pEn
1a750 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  d->leftCursor!=i
1a760 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69  Cur ); /* Transi
1a770 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  tive constraints
1a780 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
1a790 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67  se( pEnd->wtFlag
1a7a0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1a7b0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64   );.      memEnd
1a7c0 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65  Value = ++pParse
1a7d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
1a7e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1a7f0 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1a800 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a  , memEndValue);.
1a810 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70        if( pX->op
1a820 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LT || pX->o
1a830 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p==TK_GT ){.    
1a840 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
1a850 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47  v ? OP_Le : OP_G
1a860 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
1a870 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1a880 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20   bRev ? OP_Lt : 
1a890 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20  OP_Gt;.      }. 
1a8a0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
1a8b0 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a  (pLevel, pEnd);.
1a8c0 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20      }.    start 
1a8d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1a8e0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1a8f0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52   pLevel->op = bR
1a900 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f  ev ? OP_Prev : O
1a910 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  P_Next;.    pLev
1a920 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
1a930 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1a940 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72  start;.    asser
1a950 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30  t( pLevel->p5==0
1a960 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74   );.    if( test
1a970 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
1a980 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
1a990 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a9a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a9b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1a9c0 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77  owid, iCur, iRow
1a9d0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1a9e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1a9f0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1aa00 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1aa10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1aa20 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73  dbeAddOp3(v, tes
1aa30 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  tOp, memEndValue
1aa40 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69  , addrBrk, iRowi
1aa50 64 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62  dReg);.      Vdb
1aa60 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74  eCoverageIf(v, t
1aa70 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  estOp==OP_Le);. 
1aa80 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1aa90 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f  eIf(v, testOp==O
1aaa0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Lt);.      Vdb
1aab0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74  eCoverageIf(v, t
1aac0 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  estOp==OP_Ge);. 
1aad0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1aae0 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f  eIf(v, testOp==O
1aaf0 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  P_Gt);.      sql
1ab00 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1ab10 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  (v, SQLITE_AFF_N
1ab20 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f  UMERIC | SQLITE_
1ab30 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1ab40 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1ab50 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1ab60 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
1ab70 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20  .    /* Case 4: 
1ab80 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20  A scan using an 
1ab90 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
1aba0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
1abb0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61   WHERE clause ma
1abc0 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f  y contain zero o
1abd0 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20  r more equality 
1abe0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1abf0 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22  terms ("==" or "
1ac00 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74  IN" operators) t
1ac10 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
1ac20 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   N.    **       
1ac30 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75    left-most colu
1ac40 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
1ac50 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f  . It may also co
1ac60 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ntain.    **    
1ac70 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20       inequality 
1ac80 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20  constraints (>, 
1ac90 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20  <, >= or <=) on 
1aca0 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20  the indexed.    
1acb0 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
1acc0 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65  n that immediate
1acd0 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e  ly follows the N
1ace0 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c   equalities. Onl
1acf0 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1ad00 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    the right-most
1ad10 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61   column can be a
1ad20 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74  n inequality - t
1ad30 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20  he rest must.   
1ad40 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20   **         use 
1ad50 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e  the "==" and "IN
1ad60 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72  " operators. For
1ad70 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1ad80 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1ad90 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
1ada0 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66  y,z), then the f
1adb0 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73  ollowing clauses
1adc0 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a   are all .    **
1add0 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
1ade0 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed:.    **.    *
1adf0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1ae00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ae10 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a     x=5 AND y=10.
1ae20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1ae30 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20    x=5 AND y<10. 
1ae40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ae50 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44   x=5 AND y>5 AND
1ae60 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
1ae70 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1ae80 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20  y=5 AND z<=10.  
1ae90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1aea0 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72      The z<10 ter
1aeb0 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  m of the followi
1aec0 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ng cannot be use
1aed0 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20  d, only.    **  
1aee0 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74         the x=5 t
1aef0 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  erm:.    **.    
1af00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1af10 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a  5 AND z<10.    *
1af20 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1af30 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69   N may be zero i
1af40 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
1af50 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1af60 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ts..    **      
1af70 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20     If there are 
1af80 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  no inequality co
1af90 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20  nstraints, then 
1afa0 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20  N is at.    **  
1afb0 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65         least one
1afc0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1afd0 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73          This cas
1afe0 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
1aff0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
1b000 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20   WHERE clause.  
1b010 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e    **         con
1b020 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20  straints but an 
1b030 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65  index is selecte
1b040 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64  d anyway, in ord
1b050 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  er.    **       
1b060 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
1b070 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
1b080 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
1b090 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a  ER BY..    */  .
1b0a0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1b0b0 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d   u8 aStartOp[] =
1b0c0 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20   {.      0,.    
1b0d0 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65    0,.      OP_Re
1b0e0 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  wind,           
1b0f0 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 2: (!start_co
1b100 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1b110 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20  rtEq &&  !bRev) 
1b120 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74  */.      OP_Last
1b130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b140 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   3: (!start_cons
1b150 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1b160 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f  Eq &&   bRev) */
1b170 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 54  .      OP_SeekGT
1b180 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  ,           /* 4
1b190 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1b1a0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1b1b0 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1b1c0 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 20       OP_SeekLT, 
1b1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20            /* 5: 
1b1e0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1b1f0 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1b200 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1b210 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20 20 20     OP_SeekGE,   
1b220 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73          /* 6: (s
1b230 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1b240 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1b250 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1b260 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20 20 20   OP_SeekLE      
1b270 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61        /* 7: (sta
1b280 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1b290 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20  &&  startEq &&  
1b2a0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1b2b0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1b2c0 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b   u8 aEndOp[] = {
1b2d0 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c  .      OP_IdxGE,
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1b2f0 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1b300 74 73 20 26 26 20 21 62 52 65 76 20 26 26 20 21  ts && !bRev && !
1b310 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20  endEq) */.      
1b320 4f 50 5f 49 64 78 47 54 2c 20 20 20 20 20 20 20  OP_IdxGT,       
1b330 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f       /* 1: (end_
1b340 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21  constraints && !
1b350 62 52 65 76 20 26 26 20 20 65 6e 64 45 71 29 20  bRev &&  endEq) 
1b360 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c  */.      OP_IdxL
1b370 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1b380 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   2: (end_constra
1b390 69 6e 74 73 20 26 26 20 20 62 52 65 76 20 26 26  ints &&  bRev &&
1b3a0 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20   !endEq) */.    
1b3b0 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20 20 20    OP_IdxLT,     
1b3c0 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 65 6e         /* 3: (en
1b3d0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1b3e0 20 20 62 52 65 76 20 26 26 20 20 65 6e 64 45 71    bRev &&  endEq
1b3f0 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
1b400 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  u16 nEq = pLoop-
1b410 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 20  >u.btree.nEq;   
1b420 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
1b430 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f  = or IN terms */
1b440 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65  .    int regBase
1b450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b460 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
1b470 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74  er holding const
1b480 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  raint values */.
1b490 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1b4a0 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20  RangeStart = 0; 
1b4b0 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
1b4c0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
1b4d0 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20  ge start */.    
1b4e0 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
1b4f0 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
1b500 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
1b510 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
1b520 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  nd */.    int st
1b530 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20  artEq;          
1b540 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1b550 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73  f range start us
1b560 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
1b570 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71  */.    int endEq
1b580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b590 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1b5a0 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d  ange end uses ==
1b5b0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1b5c0 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73    int start_cons
1b5d0 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f  traints;       /
1b5e0 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65  * Start of range
1b5f0 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
1b600 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  */.    int nCons
1b610 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
1b620 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b630 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1b640 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
1b650 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
1b660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1b670 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
1b680 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
1b690 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20  IdxCur;         
1b6a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1b6b0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
1b6c0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
1b6d0 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20  int nExtraReg = 
1b6e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1b6f0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
1b700 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64  registers needed
1b710 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 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 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
1b740 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
1b750 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66    char *zStartAf
1b760 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
1b770 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73  * Affinity for s
1b780 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f  tart of range co
1b790 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
1b7a0 63 68 61 72 20 63 45 6e 64 41 66 66 20 3d 20 30  char cEndAff = 0
1b7b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b7c0 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64  Affinity for end
1b7d0 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
1b7e0 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38 20 62  aint */.    u8 b
1b7f0 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30  SeekPastNull = 0
1b800 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1b810 20 74 6f 20 73 65 65 6b 20 70 61 73 74 20 69 6e   to seek past in
1b820 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f 0a 20  itial nulls */. 
1b830 20 20 20 75 38 20 62 53 74 6f 70 41 74 4e 75 6c     u8 bStopAtNul
1b840 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1b850 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74 69 6f 6e  /* Add condition
1b860 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 61 74   to terminate at
1b870 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20 20 70   NULLs */..    p
1b880 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
1b890 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
1b8a0 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
1b8b0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
1b8c0 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f  assert( nEq>=pLo
1b8d0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
1b8e0 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  p );..    /* If 
1b8f0 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66  this loop satisf
1b900 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72  ies a sort order
1b910 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75   (pOrderBy) requ
1b920 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a  est that .    **
1b930 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
1b940 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
1b950 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c  implement a "SEL
1b960 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20  ECT min(x) ..." 
1b970 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74  .    ** query, t
1b980 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hen the caller w
1b990 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74  ill only allow t
1b9a0 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66  he loop to run f
1b9b0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  or.    ** a sing
1b9c0 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68  le iteration. Th
1b9d0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1b9e0 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75  e first row retu
1b9f0 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75  rned.    ** shou
1ba00 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55  ld not have a NU
1ba10 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  LL value stored 
1ba20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d  in 'x'. If colum
1ba30 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20  n 'x' is.    ** 
1ba40 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66  the first one af
1ba50 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61  ter the nEq equa
1ba60 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1ba70 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20   in the index,. 
1ba80 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69     ** this requi
1ba90 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c  res some special
1baa0 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a   handling..    *
1bab0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  /.    assert( pW
1bac0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
1bad0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57  0.         || pW
1bae0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
1baf0 6e 45 78 70 72 3d 3d 31 0a 20 20 20 20 20 20 20  nExpr==1.       
1bb00 20 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63    || (pWInfo->wc
1bb10 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1bb20 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 20 29  RDERBY_MIN)==0 )
1bb30 3b 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  ;.    if( (pWInf
1bb40 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
1bb50 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
1bb60 21 3d 30 0a 20 20 20 20 20 26 26 20 70 57 49 6e  !=0.     && pWIn
1bb70 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 0a 20 20 20  fo->nOBSat>0.   
1bb80 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79    && (pIdx->nKey
1bb90 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  Col>nEq).    ){.
1bba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1bbb0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  oop->u.btree.nSk
1bbc0 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  ip==0 );.      b
1bbd0 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31  SeekPastNull = 1
1bbe0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1bbf0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1bc00 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
1bc10 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1bc20 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
1bc30 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
1bc40 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72  .    ** of the r
1bc50 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ange. .    */.  
1bc60 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69    j = nEq;.    i
1bc70 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1bc80 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
1bc90 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61  MIT ){.      pRa
1bca0 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70  ngeStart = pLoop
1bcb0 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1bcc0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
1bcd0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1bce0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1bcf0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
1bd00 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
1bd10 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61  geEnd = pLoop->a
1bd20 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
1bd30 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
1bd40 0a 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67  .      if( pRang
1bd50 65 53 74 61 72 74 3d 3d 30 0a 20 20 20 20 20 20  eStart==0.      
1bd60 20 26 26 20 28 6a 20 3d 20 70 49 64 78 2d 3e 61   && (j = pIdx->a
1bd70 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e 3d 30  iColumn[nEq])>=0
1bd80 20 0a 20 20 20 20 20 20 20 26 26 20 70 49 64 78   .       && pIdx
1bd90 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a  ->pTable->aCol[j
1bda0 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
1bdb0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53     ){.        bS
1bdc0 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b  eekPastNull = 1;
1bdd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1bde0 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e 67     assert( pRang
1bdf0 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70 52 61 6e  eEnd==0 || (pRan
1be00 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
1be10 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
1be20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  );..    /* Gener
1be30 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
1be40 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
1be50 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
1be60 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20  == or IN.    ** 
1be70 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61  and store the va
1be80 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65  lues of those te
1be90 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rms in an array 
1bea0 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
1beb0 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
1bec0 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  regBase..    */.
1bed0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f      regBase = co
1bee0 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
1bef0 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c  ms(pParse,pLevel
1bf00 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c  ,bRev,nExtraReg,
1bf10 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20  &zStartAff);.   
1bf20 20 61 73 73 65 72 74 28 20 7a 53 74 61 72 74 41   assert( zStartA
1bf30 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ff==0 || sqlite3
1bf40 53 74 72 6c 65 6e 33 30 28 7a 53 74 61 72 74 41  Strlen30(zStartA
1bf50 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 20 20  ff)>=nEq );.    
1bf60 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 20  if( zStartAff ) 
1bf70 63 45 6e 64 41 66 66 20 3d 20 7a 53 74 61 72 74  cEndAff = zStart
1bf80 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20 20 61 64  Aff[nEq];.    ad
1bf90 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
1bfa0 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a  addrNxt;..    /*
1bfb0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1bfc0 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72   a reverse order
1bfd0 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65   scan on an asce
1bfe0 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a  nding index, or.
1bff0 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64      ** a forward
1c000 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
1c010 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
1c020 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74  x, interchange t
1c030 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  he .    ** start
1c040 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28   and end terms (
1c050 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20  pRangeStart and 
1c060 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20  pRangeEnd)..    
1c070 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c  */.    if( (nEq<
1c080 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26  pIdx->nKeyCol &&
1c090 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
1c0a0 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
1c0b0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20  QLITE_SO_ASC)). 
1c0c0 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20      || (bRev && 
1c0d0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e  pIdx->nKeyCol==n
1c0e0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
1c0f0 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20   SWAP(WhereTerm 
1c100 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52  *, pRangeEnd, pR
1c110 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
1c120 20 20 53 57 41 50 28 75 38 2c 20 62 53 65 65 6b    SWAP(u8, bSeek
1c130 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74 6f 70 41  PastNull, bStopA
1c140 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  tNull);.    }.. 
1c150 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1c160 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
1c170 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
1c180 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
1c190 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c1a0 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
1c1b0 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f  (pRangeStart->eO
1c1c0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29  perator & WO_GE)
1c1d0 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1c1e0 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
1c1f0 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  & (pRangeEnd->eO
1c200 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
1c210 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1c220 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
1c230 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  & (pRangeEnd->eO
1c240 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29  perator & WO_GE)
1c250 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74  !=0 );.    start
1c260 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72  Eq = !pRangeStar
1c270 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74  t || pRangeStart
1c280 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1c290 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
1c2a0 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e   endEq =   !pRan
1c2b0 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45  geEnd || pRangeE
1c2c0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
1c2d0 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
1c2e0 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
1c2f0 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61  ints = pRangeSta
1c300 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20  rt || nEq>0;..  
1c310 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e    /* Seek the in
1c320 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68  dex cursor to th
1c330 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
1c340 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f  ange. */.    nCo
1c350 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
1c360 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74      if( pRangeSt
1c370 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
1c380 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
1c390 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
1c3a0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
1c3b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1c3c0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
1c3d0 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1c3e0 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61    if( (pRangeSta
1c3f0 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1c400 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20  RM_VNULL)==0.   
1c410 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
1c420 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67  prCanBeNull(pRig
1c430 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ht).      ){.   
1c440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c450 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1c460 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ull, regBase+nEq
1c470 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
1c480 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1c490 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
1c4a0 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
1c4b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1c4c0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1c4d0 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1c4e0 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d  StartAff[nEq])==
1c4f0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
1c500 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
1c510 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  ince the compari
1c520 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72  son is to be per
1c530 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63  formed with no c
1c540 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20  onversions.     
1c550 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20       ** applied 
1c560 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c  to the operands,
1c570 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74   set the affinit
1c580 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52  y to apply to pR
1c590 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20  ight to .       
1c5a0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46     ** SQLITE_AFF
1c5b0 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20  _NONE.  */.     
1c5c0 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
1c5d0 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
1c5e0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
1c5f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1c600 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
1c610 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
1c620 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
1c630 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  nEq]) ){.       
1c640 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
1c650 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
1c660 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
1c670 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e       }  .      n
1c680 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1c690 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
1c6a0 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
1c6b0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1c6c0 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  L );.    }else i
1c6d0 66 28 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c  f( bSeekPastNull
1c6e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c6f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c700 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
1c710 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e  se+nEq);.      n
1c720 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1c730 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b      startEq = 0;
1c740 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  .      start_con
1c750 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
1c760 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c    }.    codeAppl
1c770 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
1c780 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1c790 74 72 61 69 6e 74 20 2d 20 62 53 65 65 6b 50 61  traint - bSeekPa
1c7a0 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72 74 41 66  stNull, zStartAf
1c7b0 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74  f);.    op = aSt
1c7c0 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e  artOp[(start_con
1c7d0 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28  straints<<2) + (
1c7e0 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52  startEq<<1) + bR
1c7f0 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ev];.    assert(
1c800 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 73 71   op!=0 );.    sq
1c810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1c820 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
1c830 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
1c840 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
1c850 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1c860 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
1c870 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1c880 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20 20 74  ==OP_Rewind);  t
1c890 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1c8a0 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 56 64  Rewind );.    Vd
1c8b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1c8c0 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20 20 20  op==OP_Last);   
1c8d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1c8e0 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 56 64  P_Last );.    Vd
1c8f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1c900 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 20  op==OP_SeekGT); 
1c910 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1c920 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20  P_SeekGT );.    
1c930 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1c940 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 29  , op==OP_SeekGE)
1c950 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1c960 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20  =OP_SeekGE );.  
1c970 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1c980 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  (v, op==OP_SeekL
1c990 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  E);  testcase( o
1c9a0 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a  p==OP_SeekLE );.
1c9b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1c9c0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
1c9d0 6b 4c 54 29 3b 20 20 74 65 73 74 63 61 73 65 28  kLT);  testcase(
1c9e0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 29   op==OP_SeekLT )
1c9f0 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
1ca00 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
1ca10 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1ca20 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e  traint at the en
1ca30 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
1ca40 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a  range (if any)..
1ca50 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73      */.    nCons
1ca60 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
1ca70 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20    if( pRangeEnd 
1ca80 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1ca90 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e  Right = pRangeEn
1caa0 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  d->pExpr->pRight
1cab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1cac0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1cad0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e  Parse, regBase+n
1cae0 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  Eq, 1);.      sq
1caf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1cb00 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
1cb10 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1cb20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
1cb30 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1cb40 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  _VNULL)==0.     
1cb50 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
1cb60 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
1cb70 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
1cb80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cb90 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1cba0 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
1cbb0 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
1cbc0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1cbd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1cbe0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
1cbf0 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
1cc00 68 74 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51  ht, cEndAff)!=SQ
1cc10 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20  LITE_AFF_NONE.  
1cc20 20 20 20 20 20 26 26 20 21 73 71 6c 69 74 65 33       && !sqlite3
1cc30 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
1cc40 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
1cc50 2c 20 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20  , cEndAff).     
1cc60 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1cc70 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
1cc80 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
1cc90 71 2c 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b  q, 1, &cEndAff);
1cca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1ccb0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1ccc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
1ccd0 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
1cce0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1ccf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1cd00 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a   bStopAtNull ){.
1cd10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1cd20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1cd30 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
1cd40 45 71 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71  Eq);.      endEq
1cd50 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e   = 0;.      nCon
1cd60 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d  straint++;.    }
1cd70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1cd80 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66  ee(db, zStartAff
1cd90 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
1cda0 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
1cdb0 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
1cdc0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
1cdd0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
1cde0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
1cdf0 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
1ce00 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
1ce10 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
1ce20 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74  /.    if( nConst
1ce30 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f  raint ){.      o
1ce40 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a  p = aEndOp[bRev*
1ce50 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20  2 + endEq];.    
1ce60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ce70 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
1ce80 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
1ce90 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
1cea0 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73  aint);.      tes
1ceb0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
1cec0 78 47 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xGT );  VdbeCove
1ced0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1cee0 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20  _IdxGT );.      
1cef0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1cf00 5f 49 64 78 47 45 20 29 3b 20 20 56 64 62 65 43  _IdxGE );  VdbeC
1cf10 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1cf20 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
1cf30 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1cf40 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64  =OP_IdxLT );  Vd
1cf50 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1cf60 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
1cf70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cf80 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20  op==OP_IdxLE ); 
1cf90 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1cfa0 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  v, op==OP_IdxLE 
1cfb0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1cfc0 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20   Seek the table 
1cfd0 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69  cursor, if requi
1cfe0 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62  red */.    disab
1cff0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1d000 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
1d010 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1d020 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
1d030 0a 20 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62  .    if( omitTab
1d040 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  le ){.      /* p
1d050 49 64 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e  Idx is a coverin
1d060 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65  g index.  No nee
1d070 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  d to access the 
1d080 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  main table. */. 
1d090 20 20 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73     }else if( Has
1d0a0 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62  Rowid(pIdx->pTab
1d0b0 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  le) ){.      iRo
1d0c0 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73  widReg = ++pPars
1d0d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
1d0e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d0f0 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
1d100 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
1d110 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1d120 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1d130 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1d140 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1d150 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d160 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
1d170 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
1d180 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
1d190 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
1d1a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
1d1b0 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33  x *pPk = sqlite3
1d1c0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1d1d0 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20  pIdx->pTable);. 
1d1e0 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
1d1f0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1d200 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b  ange(pParse, pPk
1d210 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20  ->nKeyCol);.    
1d220 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b    for(j=0; j<pPk
1d230 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
1d240 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c  .        k = sql
1d250 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
1d260 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43  x(pIdx, pPk->aiC
1d270 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20  olumn[j]);.     
1d280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d290 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1d2a0 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69  n, iIdxCur, k, i
1d2b0 52 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20  RowidReg+j);.   
1d2c0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d2d0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1d2e0 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
1d2f0 69 43 75 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a  iCur, 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 20 69 52 6f 77 69             iRowi
1d320 64 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43  dReg, pPk->nKeyC
1d330 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
1d340 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  e(v);.    }..   
1d350 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
1d360 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
1d370 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1d380 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a   loop. Disable .
1d390 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61      ** WHERE cla
1d3a0 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72  use terms made r
1d3b0 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20  edundant by the 
1d3c0 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e  index range scan
1d3d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d3e0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1d3f0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29  & WHERE_ONEROW )
1d400 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1d410 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
1d420 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
1d430 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1d440 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a  ->op = OP_Prev;.
1d450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d460 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1d470 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _Next;.    }.   
1d480 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49   pLevel->p1 = iI
1d490 64 78 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65  dxCur;.    pLeve
1d4a0 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e  l->p3 = (pLoop->
1d4b0 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 55 4e  wsFlags&WHERE_UN
1d4c0 51 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f 20 31  Q_WANTED)!=0 ? 1
1d4d0 3a 30 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  :0;.    if( (pLo
1d4e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1d4f0 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d  ERE_CONSTRAINT)=
1d500 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
1d510 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
1d520 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
1d530 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65  CAN_STEP;.    }e
1d540 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1d550 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30  t( pLevel->p5==0
1d560 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
1d570 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
1d580 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
1d590 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f  ZATION.  if( pLo
1d5a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1d5b0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
1d5c0 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20      /* Case 5:  
1d5d0 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  Two or more sepa
1d5e0 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74  rately indexed t
1d5f0 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
1d600 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y OR.    **.    
1d610 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
1d620 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  **.    **   CREA
1d630 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c  TE TABLE t1(a,b,
1d640 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  c,d);.    **   C
1d650 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
1d660 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20  N t1(a);.    ** 
1d670 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
1d680 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20  2 ON t1(b);.    
1d690 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
1d6a0 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20  X i3 ON t1(c);. 
1d6b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
1d6c0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1d6d0 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37  WHERE a=5 OR b=7
1d6e0 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d   OR (c=11 AND d=
1d6f0 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  13).    **.    *
1d700 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
1d710 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
1d720 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  e indexed terms 
1d730 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e  connected by OR.
1d740 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20  .    ** The top 
1d750 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b  of the loop look
1d760 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  s like this:.   
1d770 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1d780 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
1d7b0 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
1d7c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66  *.    ** Then, f
1d7d0 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20  or each indexed 
1d7e0 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  term, the follow
1d7f0 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ing. The argumen
1d800 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77  ts to.    ** Row
1d810 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68  SetTest are such
1d820 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
1d830 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
1d840 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20  ow is inserted. 
1d850 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52     ** into the R
1d860 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20  owSet. If it is 
1d870 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c  already present,
1d880 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74   control skips t
1d890 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20  he.    ** Gosub 
1d8a0 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73  opcode and jumps
1d8b0 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65   straight to the
1d8c0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
1d8d0 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20  by WhereEnd().. 
1d8e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1d8f0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1d900 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20  Begin(<term>).  
1d910 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f    **          Ro
1d920 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20  wSetTest        
1d930 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65            # Inse
1d940 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f  rt rowid into ro
1d950 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  wset.    **     
1d960 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20       Gosub      
1d970 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  2 A.    **      
1d980 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1d990 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  d().    **.    *
1d9a0 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * Following the 
1d9b0 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74  above, code to t
1d9c0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
1d9d0 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20  p. Label A, the 
1d9e0 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66  target.    ** of
1d9f0 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65   the Gosub above
1da00 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69  , jumps to the i
1da10 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74  nstruction right
1da20 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e   after the Goto.
1da30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1da40 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
1da50 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
1da60 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
1da70 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
1da80 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
1da90 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20  oto       B     
1daa0 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65             # The
1dab0 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65   loop is finishe
1dac0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1dad0 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20         A: <loop 
1dae0 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20  body>           
1daf0 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64        # Return d
1db00 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20  ata, whatever.. 
1db10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1db20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20        Return    
1db30 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
1db40 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f    # Jump back to
1db50 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a   the Gosub.    *
1db60 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42  *.    **       B
1db70 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f  : <after the loo
1db80 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f  p>.    **.    */
1db90 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
1dba0 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54   *pOrWc;    /* T
1dbb0 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f  he OR-clause bro
1dbc0 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62  ken out into sub
1dbd0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63  terms */.    Src
1dbe0 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20  List *pOrTab;   
1dbf0 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64      /* Shortened
1dc00 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f   table list or O
1dc10 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74  R-clause generat
1dc20 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  ion */.    Index
1dc30 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20   *pCov = 0;     
1dc40 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e          /* Poten
1dc50 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e  tial covering in
1dc60 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  dex (or NULL) */
1dc70 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72  .    int iCovCur
1dc80 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1dc90 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73  +;  /* Cursor us
1dca0 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61  ed for index sca
1dcb0 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a  ns (if any) */..
1dcc0 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72      int regRetur
1dcd0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
1dce0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  em;           /*
1dcf0 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77   Register used w
1dd00 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a  ith OP_Gosub */.
1dd10 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65      int regRowse
1dd20 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd40 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f   Register for Ro
1dd50 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  wSet object */. 
1dd60 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20     int regRowid 
1dd70 3d 20 30 3b 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 20 2f 2a 20               /* 
1dd90 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
1dda0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e   rowid */.    in
1ddb0 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71  t iLoopBody = sq
1ddc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1ddd0 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74  el(v);  /* Start
1dde0 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f   of loop body */
1ddf0 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69  .    int iRetIni
1de00 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de20 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67  * Address of reg
1de30 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20  Return init */. 
1de40 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54     int untestedT
1de50 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20  erms = 0;       
1de60 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65        /* Some te
1de70 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  rms not complete
1de80 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20  ly tested */.   
1de90 20 69 6e 74 20 69 69 3b 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 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1dec0 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  ter */.    Expr 
1ded0 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20  *pAndExpr = 0;  
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1def0 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e   An ".. AND (...
1df00 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  )" expression */
1df10 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
1df20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
1df30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1df40 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
1df50 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
1df60 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20  perator & WO_OR 
1df70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
1df80 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1df90 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
1dfa0 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
1dfb0 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
1dfc0 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65  o->wc;.    pLeve
1dfd0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72  l->op = OP_Retur
1dfe0 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  n;.    pLevel->p
1dff0 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a  1 = regReturn;..
1e000 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20      /* Set up a 
1e010 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70  new SrcList in p
1e020 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67  OrTab containing
1e030 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
1e040 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20   scanned.    ** 
1e050 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20  by this loop in 
1e060 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e  the a[0] slot an
1e070 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74  d all notReady t
1e080 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20  ables in a[1..] 
1e090 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
1e0a0 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53  is becomes the S
1e0b0 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65  rcList in the re
1e0c0 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20  cursive call to 
1e0d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1e0e0 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
1e0f0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
1e100 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  el>1 ){.      in
1e110 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20  t nNotReady;    
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e130 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  The number of no
1e140 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f  tReady tables */
1e150 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
1e160 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67  cList_item *orig
1e170 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  Src;     /* Orig
1e180 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62  inal list of tab
1e190 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f  les */.      nNo
1e1a0 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d  tReady = pWInfo-
1e1b0 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c  >nLevel - iLevel
1e1c0 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54   - 1;.      pOrT
1e1d0 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  ab = sqlite3Stac
1e1e0 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20  kAllocRaw(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 20 73 69 7a 65 6f 66            sizeof
1e210 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
1e220 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
1e230 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
1e240 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
1e250 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
1e260 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
1e270 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e  >nAlloc = (u8)(n
1e280 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20  NotReady + 1);. 
1e290 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72       pOrTab->nSr
1e2a0 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c  c = pOrTab->nAll
1e2b0 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  oc;.      memcpy
1e2c0 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62  (pOrTab->a, pTab
1e2d0 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54  Item, sizeof(*pT
1e2e0 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20  abItem));.      
1e2f0 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f  origSrc = pWInfo
1e300 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
1e310 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
1e320 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29  =nNotReady; k++)
1e330 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1e340 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20  (&pOrTab->a[k], 
1e350 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b  &origSrc[pLevel[
1e360 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f  k].iFrom], sizeo
1e370 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29  f(pOrTab->a[k]))
1e380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e390 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61  lse{.      pOrTa
1e3a0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  b = pWInfo->pTab
1e3b0 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  List;.    }..   
1e3c0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1e3d0 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74  he rowset regist
1e3e0 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55  er to contain NU
1e3f0 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20  LL. An SQL NULL 
1e400 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76  is .    ** equiv
1e410 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74  alent to an empt
1e420 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a  y rowset..    **
1e430 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69  .    ** Also ini
1e440 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72  tialize regRetur
1e450 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  n to contain the
1e460 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
1e470 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20  instruction .   
1e480 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   ** immediately 
1e490 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50  following the OP
1e4a0 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62  _Return at the b
1e4b0 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
1e4c0 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  p. This.    ** i
1e4d0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20  s required in a 
1e4e0 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54  few obscure LEFT
1e4f0 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72   JOIN cases wher
1e500 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a  e control jumps.
1e510 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20      ** over the 
1e520 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
1e530 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
1e540 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73   it. In this cas
1e550 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  e the .    ** co
1e560 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66  rrect response f
1e570 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f  or the end-of-lo
1e580 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f  op code (the OP_
1e590 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20  Return) is to . 
1e5a0 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75     ** fall throu
1e5b0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
1e5c0 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74  nstruction, just
1e5d0 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64   as an OP_Next d
1e5e0 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61  oes if.    ** ca
1e5f0 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69  lled on an unini
1e600 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e  tialized cursor.
1e610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e620 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
1e630 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
1e640 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
1e650 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74  .      regRowset
1e660 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1e670 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
1e680 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
1e690 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1e6a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e6b0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
1e6c0 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  wset);.    }.   
1e6d0 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69   iRetInit = sqli
1e6e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e6f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1e700 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20  regReturn);..   
1e710 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69   /* If the origi
1e720 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  nal WHERE clause
1e730 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72   is z of the for
1e740 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52  m:  (x1 OR x2 OR
1e750 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20   ...) AND y.    
1e760 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72  ** Then for ever
1e770 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75  y term xN, evalu
1e780 61 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78  ate as the subex
1e790 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44  pression: xN AND
1e7a0 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77   z.    ** That w
1e7b0 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74  ay, terms in y t
1e7c0 68 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64  hat are factored
1e7d0 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e   into the disjun
1e7e0 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ction will.    *
1e7f0 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62  * be picked up b
1e800 79 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  y the recursive 
1e810 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
1e820 57 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c  WhereBegin() bel
1e830 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ow..    **.    *
1e840 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68  * Actually, each
1e850 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
1e860 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22  s converted to "
1e870 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20  xN AND w" where 
1e880 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  w is.    ** the 
1e890 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65  "interesting" te
1e8a0 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73  rms of z - terms
1e8b0 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72   that did not or
1e8c0 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20  iginate in the. 
1e8d0 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e     ** ON or USIN
1e8e0 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  G clause of a LE
1e8f0 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72  FT JOIN, and ter
1e900 6d 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62  ms that are usab
1e910 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e  le as .    ** in
1e920 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
1e930 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69    ** This optimi
1e940 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79  zation also only
1e950 20 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20   applies if the 
1e960 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
1e970 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73  ) term.    ** is
1e980 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1e990 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  n the ON clause 
1e9a0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a  of a LEFT JOIN..
1e9b0 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65      ** See ticke
1e9c0 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  t http://www.sql
1e9d0 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
1e9e0 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20  /f2369304e4.    
1e9f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e  */.    if( pWC->
1ea00 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20  nTerm>1 ){.     
1ea10 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20   int iTerm;.    
1ea20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69    for(iTerm=0; i
1ea30 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  Term<pWC->nTerm;
1ea40 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   iTerm++){.     
1ea50 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
1ea60 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70   pWC->a[iTerm].p
1ea70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
1ea80 28 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( &pWC->a[iTerm]
1ea90 20 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74   == pTerm ) cont
1eaa0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1eab0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1eac0 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
1ead0 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65  Join) ) continue
1eae0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1eaf0 73 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  se( pWC->a[iTerm
1eb00 5d 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ].wtFlags & TERM
1eb10 5f 4f 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20  _ORINFO );.     
1eb20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43     testcase( pWC
1eb30 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
1eb40 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1eb50 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  L );.        if(
1eb60 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77   pWC->a[iTerm].w
1eb70 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f  tFlags & (TERM_O
1eb80 52 49 4e 46 4f 7c 54 45 52 4d 5f 56 49 52 54 55  RINFO|TERM_VIRTU
1eb90 41 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  AL) ) continue;.
1eba0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43          if( (pWC
1ebb0 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72  ->a[iTerm].eOper
1ebc0 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d  ator & WO_ALL)==
1ebd0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1ebe0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
1ebf0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1ec00 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
1ec10 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73      pAndExpr = s
1ec20 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
1ec30 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70  , pAndExpr, pExp
1ec40 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1ec50 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
1ec60 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  {.        pAndEx
1ec70 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
1ec80 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44  r(pParse, TK_AND
1ec90 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30  , 0, pAndExpr, 0
1eca0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1ecb0 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
1ecc0 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b  ii<pOrWc->nTerm;
1ecd0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68   ii++){.      Wh
1ece0 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
1ecf0 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d   = &pOrWc->a[ii]
1ed00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
1ed10 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
1ed20 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72  =iCur || (pOrTer
1ed30 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1ed40 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
1ed50 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a       WhereInfo *
1ed60 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20  pSubWInfo;      
1ed70 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20      /* Info for 
1ed80 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73  single OR-term s
1ed90 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  can */.        E
1eda0 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70  xpr *pOrExpr = p
1edb0 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20  OrTerm->pExpr;. 
1edc0 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
1edd0 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50  xpr && !ExprHasP
1ede0 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c  roperty(pOrExpr,
1edf0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
1ee00 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45  .          pAndE
1ee10 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72  xpr->pLeft = pOr
1ee20 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
1ee30 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78  pOrExpr = pAndEx
1ee40 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
1ee50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
1ee60 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
1ee70 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
1ee80 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
1ee90 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66          pSubWInf
1eea0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
1eeb0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f  Begin(pParse, pO
1eec0 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30  rTab, pOrExpr, 0
1eed0 2c 20 30 2c 0a 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 20 57 48 45               WHE
1eef0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
1ef00 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f  SE | WHERE_AND_O
1ef10 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NLY |.          
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
1ef30 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
1ef40 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  | WHERE_ONETABLE
1ef50 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b  _ONLY, iCovCur);
1ef60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ef70 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50   pSubWInfo || pP
1ef80 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1ef90 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1efa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
1efb0 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ubWInfo ){.     
1efc0 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
1efd0 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  pSubLoop;.      
1efe0 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
1eff0 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  an(.            
1f000 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62    pParse, pOrTab
1f010 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  , &pSubWInfo->a[
1f020 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76  0], iLevel, pLev
1f030 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20  el->iFrom, 0.   
1f040 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1f050 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
1f060 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
1f070 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
1f080 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  K)==0 ){.       
1f090 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20       int iSet = 
1f0a0 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65  ((ii==pOrWc->nTe
1f0b0 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20  rm-1)?-1:ii);.  
1f0c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b            int r;
1f0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d  .            r =
1f0e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f0f0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1f100 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
1f110 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 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 20 72 65 67 52 6f 77 69 64 2c 20        regRowid, 
1f150 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1f160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f170 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65  4Int(v, OP_RowSe
1f180 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74  tTest, regRowset
1f190 2c 0a 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 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
1f1c0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20  rrentAddr(v)+2, 
1f1d0 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20  r, iSet);.      
1f1e0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1f1f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
1f200 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
1f210 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f220 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
1f230 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79  eturn, iLoopBody
1f240 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
1f250 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e   The pSubWInfo->
1f260 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c  untestedTerms fl
1f270 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ag means that th
1f280 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20  is OR term.     
1f290 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65       ** containe
1f2a0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e  d one or more AN
1f2b0 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f  D term from a no
1f2c0 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54  tReady table.  T
1f2d0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
1f2e0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e  terms from the n
1f2f0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f  otReady table co
1f300 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65  uld not be teste
1f310 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20  d and will.     
1f320 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20       ** need to 
1f330 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e  be tested later.
1f340 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1f350 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
1f360 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
1f370 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54  erms ) untestedT
1f380 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20  erms = 1;..     
1f390 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f       /* If all o
1f3a0 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74  f the OR-connect
1f3b0 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74  ed terms are opt
1f3c0 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65  imized using the
1f3d0 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
1f3e0 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68  ** index, and th
1f3f0 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  e index is opene
1f400 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
1f410 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20   cursor number. 
1f420 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65           ** by e
1f430 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ach call to sqli
1f440 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1f450 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f  made by this loo
1f460 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20  p, it may.      
1f470 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62      ** be possib
1f480 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69  le to use that i
1f490 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69  ndex as a coveri
1f4a0 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ng index..      
1f4b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
1f4c0 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20   ** If the call 
1f4d0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1f4e0 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73  egin() above res
1f4f0 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20  ulted in a scan 
1f500 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
1f510 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  * uses an index,
1f520 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74   and this is eit
1f530 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52  her the first OR
1f540 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a  -connected term.
1f550 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1f560 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e  cessed or the in
1f570 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20  dex is the same 
1f580 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20  as that used by 
1f590 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20  all previous.   
1f5a0 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c         ** terms,
1f5b0 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65   set pCov to the
1f5c0 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72   candidate cover
1f5d0 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72  ing index. Other
1f5e0 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20  wise, set .     
1f5f0 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20       ** pCov to 
1f600 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65  NULL to indicate
1f610 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61   that no candida
1f620 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  te covering inde
1f630 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20  x will .        
1f640 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c    ** be availabl
1f650 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1f660 20 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f            pSubLo
1f670 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e  op = pSubWInfo->
1f680 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  a[0].pWLoop;.   
1f690 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
1f6a0 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  pSubLoop->wsFlag
1f6b0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
1f6c0 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NDEX)==0 );.    
1f6d0 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c        if( (pSubL
1f6e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1f6f0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
1f700 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
1f710 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f  ii==0 || pSubLoo
1f720 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1f730 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20  x==pCov).       
1f740 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1f750 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49    assert( pSubWI
1f760 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75  nfo->a[0].iIdxCu
1f770 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20  r==iCovCur );.  
1f780 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d            pCov =
1f790 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72   pSubLoop->u.btr
1f7a0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  ee.pIndex;.     
1f7b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f7c0 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30          pCov = 0
1f7d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
1f7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
1f7f0 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f  sh the loop thro
1f800 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
1f810 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
1f820 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
1f830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1f840 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66  hereEnd(pSubWInf
1f850 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
1f860 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f870 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
1f880 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66  x = pCov;.    if
1f890 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d  ( pCov ) pLevel-
1f8a0 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43  >iIdxCur = iCovC
1f8b0 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64  ur;.    if( pAnd
1f8c0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41  Expr ){.      pA
1f8d0 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
1f8e0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
1f8f0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1f900 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  AndExpr);.    }.
1f910 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1f920 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49  hangeP1(v, iRetI
1f930 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  nit, sqlite3Vdbe
1f940 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
1f950 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f960 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1f970 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
1f980 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69  drBrk);.    sqli
1f990 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1f9a0 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79  bel(v, iLoopBody
1f9b0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e  );..    if( pWIn
1f9c0 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73  fo->nLevel>1 ) s
1f9d0 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
1f9e0 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20  db, pOrTab);.   
1f9f0 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65   if( !untestedTe
1fa00 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72  rms ) disableTer
1fa10 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
1fa20 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1fa30 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1fa40 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
1fa50 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43  */..  {.    /* C
1fa60 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73  ase 6:  There is
1fa70 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78   no usable index
1fa80 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20  .  We must do a 
1fa90 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20  complete.    ** 
1faa0 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
1fab0 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
1fac0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
1fad0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
1fae0 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78  tep[] = { OP_Nex
1faf0 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20  t, OP_Prev };.  
1fb00 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1fb10 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f  8 aStart[] = { O
1fb20 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73  P_Rewind, OP_Las
1fb30 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t };.    assert(
1fb40 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76   bRev==0 || bRev
1fb50 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==1 );.    if( p
1fb60 54 61 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72  TabItem->isRecur
1fb70 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  sive ){.      /*
1fb80 20 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69   Tables marked i
1fb90 73 52 65 63 75 72 73 69 76 65 20 68 61 76 65 20  sRecursive have 
1fba0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
1fbb0 77 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64  w that is stored
1fbc0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70   in.      ** a p
1fbd0 73 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e  seudo-cursor.  N
1fbe0 6f 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64  o need to Rewind
1fbf0 20 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63 75   or Next such cu
1fc00 72 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  rsors. */.      
1fc10 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1fc20 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Noop;.    }else{
1fc30 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1fc40 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b  p = aStep[bRev];
1fc50 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
1fc60 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
1fc70 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b  pLevel->p2 = 1 +
1fc80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fc90 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65  p2(v, aStart[bRe
1fca0 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  v], iCur, addrBr
1fcb0 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  k);.      VdbeCo
1fcc0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
1fcd0 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ==0);.      Vdbe
1fce0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
1fcf0 65 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c  ev!=0);.      pL
1fd00 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
1fd10 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
1fd20 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20  LSCAN_STEP;.    
1fd30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  }.  }..  /* Inse
1fd40 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
1fd50 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
1fd60 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
1fd70 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
1fd80 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
1fd90 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
1fda0 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  f tables..  */. 
1fdb0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
1fdc0 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
1fdd0 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
1fde0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1fdf0 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  E;.    testcase(
1fe00 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1fe10 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1fe20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1fe30 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1fe40 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
1fe50 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
1fe60 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
1fe70 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
1fe80 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1fe90 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
1fea0 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c  ereqAll & pLevel
1feb0 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
1fec0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1fed0 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
1fee0 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
1fef0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
1ff00 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1ff10 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
1ff20 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
1ff30 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
1ff40 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
1ff50 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1ff60 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
1ff70 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
1ff80 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
1ff90 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
1ffa0 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
1ffb0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ffc0 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
1ffd0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
1ffe0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
1fff0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
20000 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
20010 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
20020 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54  PIFNULL);.    pT
20030 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
20040 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
20050 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
20060 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d  e to test for im
20070 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  plied constraint
20080 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73  s based on trans
20090 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20  itivity.  ** of 
200a0 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f  the "==" operato
200b0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  r..  **.  ** Exa
200c0 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45  mple: If the WHE
200d0 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
200e0 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61  ns "t1.a=t2.b" a
200f0 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20  nd "t2.b=123".  
20100 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f  ** and we are co
20110 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70  ding the t1 loop
20120 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70   and the t2 loop
20130 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64   has not yet cod
20140 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65  ed,.  ** then we
20150 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20   cannot use the 
20160 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73  "t1.a=t2.b" cons
20170 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63  traint, but we c
20180 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65  an code.  ** the
20190 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31   implied "t1.a=1
201a0 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  23" constraint..
201b0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
201c0 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
201d0 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
201e0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
201f0 78 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b  xpr *pE, *pEAlt;
20200 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
20210 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54  pAlt;.    if( pT
20220 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
20230 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
20240 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
20250 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
20260 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28  rm->eOperator!=(
20270 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20  WO_EQUIV|WO_EQ) 
20280 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20290 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
202a0 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f  ursor!=iCur ) co
202b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
202c0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
202d0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
202e0 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
202f0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
20300 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20310 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
20320 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
20330 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
20340 52 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e  Right & pLevel->
20350 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a  notReady)!=0 );.
20360 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54      pAlt = findT
20370 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
20380 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
20390 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  mn, notReady, WO
203a0 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
203b0 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29     if( pAlt==0 )
203c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
203d0 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73  f( pAlt->wtFlags
203e0 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20   & (TERM_CODED) 
203f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20400 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
20410 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
20420 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Q );.    testcas
20430 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
20440 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
20450 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
20460 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74  ent((v, "begin t
20470 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
20480 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41  aint"));.    pEA
20490 6c 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  lt = sqlite3Stac
204a0 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  kAllocRaw(db, si
204b0 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20  zeof(*pEAlt));. 
204c0 20 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a     if( pEAlt ){.
204d0 20 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a        *pEAlt = *
204e0 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pAlt->pExpr;.   
204f0 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20     pEAlt->pLeft 
20500 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  = pE->pLeft;.   
20510 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
20520 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
20530 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  Alt, addrCont, S
20540 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
20550 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20560 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45  StackFree(db, pE
20570 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Alt);.    }.  }.
20580 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
20590 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
205a0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
205b0 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
205c0 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
205d0 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
205e0 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
205f0 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
20600 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
20610 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
20620 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
20630 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
20640 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
20650 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
20660 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
20670 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20680 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
20690 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
206a0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
206b0 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
206c0 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
206d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
206e0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
206f0 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
20700 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
20710 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
20720 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
20730 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
20740 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
20750 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
20760 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
20770 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
20780 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69  CODED );.      i
20790 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
207a0 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
207b0 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
207c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
207d0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
207e0 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e  eqAll & pLevel->
207f0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
20800 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20810 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
20820 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
20830 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20840 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
20850 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
20860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20870 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
20880 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
20890 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
208a0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
208b0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
208c0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
208d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
208e0 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f  eturn pLevel->no
208f0 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64  tReady;.}..#if d
20900 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
20910 45 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65  E_ENABLED) && de
20920 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
20930 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
20940 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
20950 20 22 45 78 70 6c 61 6e 61 74 69 6f 6e 22 20 74   "Explanation" t
20960 65 78 74 20 66 6f 72 20 61 20 57 68 65 72 65 54  ext for a WhereT
20970 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  erm..*/.static v
20980 6f 69 64 20 77 68 65 72 65 45 78 70 6c 61 69 6e  oid whereExplain
20990 54 65 72 6d 28 56 64 62 65 20 2a 76 2c 20 57 68  Term(Vdbe *v, Wh
209a0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
209b0 0a 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d  .  char zType[4]
209c0 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65  ;.  memcpy(zType
209d0 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 69  , "...", 4);.  i
209e0 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
209f0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
20a00 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56   ) zType[0] = 'V
20a10 27 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  ';.  if( pTerm->
20a20 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
20a30 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d  QUIV  ) zType[1]
20a40 20 3d 20 27 45 27 3b 0a 20 20 69 66 28 20 45 78   = 'E';.  if( Ex
20a50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
20a60 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
20a70 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65  romJoin) ) zType
20a80 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 73 71 6c  [2] = 'L';.  sql
20a90 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
20aa0 66 28 76 2c 20 22 25 73 20 22 2c 20 7a 54 79 70  f(v, "%s ", zTyp
20ab0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
20ac0 6c 61 69 6e 45 78 70 72 28 76 2c 20 70 54 65 72  lainExpr(v, pTer
20ad0 6d 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 23 65 6e  m->pExpr);.}.#en
20ae0 64 69 66 20 2f 2a 20 57 48 45 52 45 54 52 41 43  dif /* WHERETRAC
20af0 45 5f 45 4e 41 42 4c 45 44 20 26 26 20 53 51 4c  E_ENABLED && SQL
20b00 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
20b10 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 23 69 66  EXPLAIN */...#if
20b20 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
20b30 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
20b40 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  nt a WhereLoop o
20b50 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67  bject for debugg
20b60 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a  ing purposes.*/.
20b70 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
20b80 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65  eLoopPrint(Where
20b90 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c  Loop *p, WhereCl
20ba0 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68  ause *pWC){.  Wh
20bb0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
20bc0 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
20bd0 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49   int nb = 1+(pWI
20be0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
20bf0 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75  Src+7)/8;.  stru
20c00 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20c10 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d  *pItem = pWInfo-
20c20 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70  >pTabList->a + p
20c30 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20  ->iTab;.  Table 
20c40 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
20c50 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  Tab;.  sqlite3De
20c60 62 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64  bugPrintf("%c%2d
20c70 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c  .%0*llx.%0*llx",
20c80 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20   p->cId,.       
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
20ca0 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61  >iTab, nb, p->ma
20cb0 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70  skSelf, nb, p->p
20cc0 72 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65  rereq);.  sqlite
20cd0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
20ce0 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  12s",.          
20cf0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
20d00 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d  ->zAlias ? pItem
20d10 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d  ->zAlias : pTab-
20d20 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28  >zName);.  if( (
20d30 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
20d40 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
20d50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 63 6f 6e 73  ==0 ){.     cons
20d60 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
20d70 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72      if( p->u.btr
20d80 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e  ee.pIndex && (zN
20d90 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  ame = p->u.btree
20da0 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21  .pIndex->zName)!
20db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
20dc0 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  strncmp(zName, "
20dd0 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
20de0 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20  _", 17)==0 ){.  
20df0 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71        int i = sq
20e00 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
20e10 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  ame) - 1;.      
20e20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69    while( zName[i
20e30 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20  ]!='_' ) i--;.  
20e40 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69        zName += i
20e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20e60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
20e70 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c  tf(".%-16s %2d",
20e80 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72   zName, p->u.btr
20e90 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c  ee.nEq);.    }el
20ea0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
20eb0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32  3DebugPrintf("%2
20ec0 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20  0s","");.    }. 
20ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
20ee0 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   *z;.    if( p->
20ef0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b  u.vtab.idxStr ){
20f00 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
20f10 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
20f20 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20  \"%s\",%x)",.   
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
20f40 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
20f50 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
20f60 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d   p->u.vtab.omitM
20f70 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ask);.    }else{
20f80 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
20f90 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
20fa0 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  %x)", p->u.vtab.
20fb0 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61  idxNum, p->u.vta
20fc0 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20  b.omitMask);.   
20fd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
20fe0 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39  bugPrintf(" %-19
20ff0 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  s", z);.    sqli
21000 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d  te3_free(z);.  }
21010 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
21020 72 69 6e 74 66 28 22 20 66 20 25 30 34 78 20 4e  rintf(" f %04x N
21030 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73   %d", p->wsFlags
21040 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20  , p->nLTerm);.  
21050 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21060 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
21070 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
21080 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
21090 75 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ut);.#ifdef SQLI
210a0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
210b0 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74  XPLAIN.  /* If t
210c0 68 65 20 30 78 31 30 30 20 62 69 74 20 6f 66 20  he 0x100 bit of 
210d0 77 68 65 72 65 74 72 61 63 69 6e 67 20 69 73 20  wheretracing is 
210e0 73 65 74 2c 20 74 68 65 6e 20 73 68 6f 77 20 61  set, then show a
210f0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72  ll of the constr
21100 61 69 6e 74 0a 20 20 2a 2a 20 65 78 70 72 65 73  aint.  ** expres
21110 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 68 65  sions in the Whe
21120 72 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d 5b 5d 20  reLoop.aLTerm[] 
21130 61 72 72 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  array..  */.  if
21140 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28  ( p->nLTerm && (
21150 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
21160 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b  e & 0x100)!=0 ){
21170 20 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45 20    /* WHERETRACE 
21180 30 78 31 30 30 20 2a 2f 0a 20 20 20 20 69 6e 74  0x100 */.    int
21190 20 69 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   i;.    Vdbe *v 
211a0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
211b0 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c  ->pVdbe;.    sql
211c0 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e  ite3ExplainBegin
211d0 28 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  (v);.    for(i=0
211e0 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
211f0 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
21200 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 70 2d  Term *pTerm = p-
21210 3e 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20  >aLTerm[i];.    
21220 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
21230 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21240 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
21250 72 69 6e 74 66 28 76 2c 20 22 20 20 28 25 64 29  rintf(v, "  (%d)
21260 20 23 25 2d 32 64 20 22 2c 20 69 2b 31 2c 20 28   #%-2d ", i+1, (
21270 69 6e 74 29 28 70 54 65 72 6d 2d 70 57 43 2d 3e  int)(pTerm-pWC->
21280 61 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  a));.      sqlit
21290 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29  e3ExplainPush(v)
212a0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 45 78 70  ;.      whereExp
212b0 6c 61 69 6e 54 65 72 6d 28 76 2c 20 70 54 65 72  lainTerm(v, pTer
212c0 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
212d0 33 45 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a  3ExplainPop(v);.
212e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
212f0 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d  lainNL(v);.    }
21300 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
21310 61 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20  ainFinish(v);.  
21320 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21330 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
21340 65 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f  e3VdbeExplanatio
21350 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  n(v));.  }.#endi
21360 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  f.}.#endif../*.*
21370 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d  * Convert bulk m
21380 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c  emory into a val
21390 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  id WhereLoop tha
213a0 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a  t can be passed.
213b0 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43  ** to whereLoopC
213c0 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e  lear harmlessly.
213d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
213e0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68  whereLoopInit(Wh
213f0 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70  ereLoop *p){.  p
21400 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c  ->aLTerm = p->aL
21410 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e  TermSpace;.  p->
21420 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d  nLTerm = 0;.  p-
21430 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  >nLSlot = ArrayS
21440 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61  ize(p->aLTermSpa
21450 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67  ce);.  p->wsFlag
21460 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s = 0;.}../*.** 
21470 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c  Clear the WhereL
21480 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65  oop.u union.  Le
21490 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c  ave WhereLoop.pL
214a0 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a  Term intact..*/.
214b0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
214c0 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
214d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
214e0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
214f0 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  ( p->wsFlags & (
21500 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
21510 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  LE|WHERE_AUTO_IN
21520 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20  DEX) ){.    if( 
21530 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
21540 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
21550 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61  )!=0 && p->u.vta
21560 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
21570 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21580 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  (p->u.vtab.idxSt
21590 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76  r);.      p->u.v
215a0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
215b0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
215c0 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  b.idxStr = 0;.  
215d0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
215e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
215f0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26  AUTO_INDEX)!=0 &
21600 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  & p->u.btree.pIn
21610 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dex!=0 ){.      
21620 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21630 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
21640 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  dex->zColAff);. 
21650 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
21660 6e 66 6f 55 6e 72 65 66 28 70 2d 3e 75 2e 62 74  nfoUnref(p->u.bt
21670 72 65 65 2e 70 49 6e 64 65 78 2d 3e 70 4b 65 79  ree.pIndex->pKey
21680 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
21690 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
216a0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
216b0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  );.      p->u.bt
216c0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
216d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
216e0 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e  ** Deallocate in
216f0 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73  ternal memory us
21700 65 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f  ed by a WhereLoo
21710 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  p object.*/.stat
21720 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
21730 70 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a  pClear(sqlite3 *
21740 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
21750 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  ){.  if( p->aLTe
21760 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
21770 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
21780 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  ee(db, p->aLTerm
21790 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  );.  whereLoopCl
217a0 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b  earUnion(db, p);
217b0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
217c0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  (p);.}../*.** In
217d0 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  crease the memor
217e0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72  y allocation for
217f0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d   pLoop->aLTerm[]
21800 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20   to be at least 
21810 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
21820 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
21830 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
21840 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20  ereLoop *p, int 
21850 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  n){.  WhereTerm 
21860 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70  **paNew;.  if( p
21870 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65  ->nLSlot>=n ) re
21880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21890 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a    n = (n+7)&~7;.
218a0 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65    paNew = sqlite
218b0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
218c0 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
218d0 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20  m[0])*n);.  if( 
218e0 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  paNew==0 ) retur
218f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
21900 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20    memcpy(paNew, 
21910 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f  p->aLTerm, sizeo
21920 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a  f(p->aLTerm[0])*
21930 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66  p->nLSlot);.  if
21940 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e  ( p->aLTerm!=p->
21950 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71  aLTermSpace ) sq
21960 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21970 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d  p->aLTerm);.  p-
21980 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b  >aLTerm = paNew;
21990 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e  .  p->nLSlot = n
219a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
219b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
219c0 72 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20  ransfer content 
219d0 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
219e0 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66  pLoop into the f
219f0 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  irst..*/.static 
21a00 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65  int whereLoopXfe
21a10 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  r(sqlite3 *db, W
21a20 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57  hereLoop *pTo, W
21a30 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29  hereLoop *pFrom)
21a40 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  {.  whereLoopCle
21a50 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29  arUnion(db, pTo)
21a60 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
21a70 70 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c  pResize(db, pTo,
21a80 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20   pFrom->nLTerm) 
21a90 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  ){.    memset(&p
21aa0 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  To->u, 0, sizeof
21ab0 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72  (pTo->u));.    r
21ac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
21ad0 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  EM;.  }.  memcpy
21ae0 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45  (pTo, pFrom, WHE
21af0 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29  RE_LOOP_XFER_SZ)
21b00 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e  ;.  memcpy(pTo->
21b10 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61  aLTerm, pFrom->a
21b20 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65  LTerm, pTo->nLTe
21b30 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61  rm*sizeof(pTo->a
21b40 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66  LTerm[0]));.  if
21b50 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73  ( pFrom->wsFlags
21b60 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
21b70 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72  TABLE ){.    pFr
21b80 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  om->u.vtab.needF
21b90 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
21ba0 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46   if( (pFrom->wsF
21bb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
21bc0 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
21bd0 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65     pFrom->u.btre
21be0 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
21bf0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
21c00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
21c10 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f  elete a WhereLoo
21c20 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  p object.*/.stat
21c30 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
21c40 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  pDelete(sqlite3 
21c50 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
21c60 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  p){.  whereLoopC
21c70 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73  lear(db, p);.  s
21c80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21c90 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   p);.}../*.** Fr
21ca0 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
21cb0 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
21cc0 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
21cd0 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
21ce0 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
21cf0 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57  Info){.  if( ALW
21d00 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  AYS(pWInfo) ){. 
21d10 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c     whereClauseCl
21d20 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  ear(&pWInfo->sWC
21d30 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57  );.    while( pW
21d40 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
21d50 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
21d60 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  *p = pWInfo->pLo
21d70 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  ops;.      pWInf
21d80 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70  o->pLoops = p->p
21d90 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  NextLoop;.      
21da0 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
21db0 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  db, p);.    }.  
21dc0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
21dd0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
21de0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21df0 20 54 52 55 45 20 69 66 20 62 6f 74 68 20 6f 66   TRUE if both of
21e00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
21e10 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
21e20 20 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20   (1)  X has the 
21e30 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f  same or lower co
21e40 73 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28  st that Y.**   (
21e50 32 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65  2)  X is a prope
21e60 72 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a  r subset of Y.**
21e70 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73  .** By "proper s
21e80 75 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74  ubset" we mean t
21e90 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72  hat X uses fewer
21ea0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
21eb0 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e  rms.** than Y an
21ec0 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45  d that every WHE
21ed0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75  RE clause term u
21ee0 73 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f  sed by X is also
21ef0 20 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a   used.** by Y..*
21f00 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70  *.** If X is a p
21f10 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
21f20 59 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65  Y then Y is a be
21f30 74 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20  tter choice and 
21f40 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65  ought.** to have
21f50 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20   a lower cost.  
21f60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
21f70 75 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74  urns TRUE when t
21f80 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c  hat cost .** rel
21f90 61 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76  ationship is inv
21fa0 65 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20  erted and needs 
21fb0 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 0a  to be adjusted..
21fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
21fd0 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
21fe0 6f 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f  operSubset(.  co
21ff0 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
22000 58 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  X,       /* Firs
22010 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63  t WhereLoop to c
22020 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  ompare */.  cons
22030 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20  t WhereLoop *pY 
22040 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
22050 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57  e against this W
22060 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  hereLoop */.){. 
22070 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
22080 20 70 58 2d 3e 6e 4c 54 65 72 6d 20 3e 3d 20 70   pX->nLTerm >= p
22090 59 2d 3e 6e 4c 54 65 72 6d 20 29 20 72 65 74 75  Y->nLTerm ) retu
220a0 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f  rn 0; /* X is no
220b0 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
220c0 2a 2f 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75  */.  if( pX->rRu
220d0 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b  n >= pY->rRun ){
220e0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75  .    if( pX->rRu
220f0 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72  n > pY->rRun ) r
22100 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
22110 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
22120 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58   Y */.    if( pX
22130 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75  ->nOut > pY->nOu
22140 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
22150 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
22160 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20   than Y */.  }. 
22170 20 66 6f 72 28 6a 3d 30 2c 20 69 3d 70 58 2d 3e   for(j=0, i=pX->
22180 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  nLTerm-1; i>=0; 
22190 69 2d 2d 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  i--){.    for(j=
221a0 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  pY->nLTerm-1; j>
221b0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
221c0 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a  if( pY->aLTerm[j
221d0 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  ]==pX->aLTerm[i]
221e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
221f0 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65      if( j<0 ) re
22200 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f  turn 0;  /* X no
22210 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
22220 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20  since term X[i] 
22230 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f  not used by Y */
22240 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
22250 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69    /* All conditi
22260 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f  ons meet */.}../
22270 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75  *.** Try to adju
22280 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57  st the cost of W
22290 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61  hereLoop pTempla
222a0 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f  te upwards or do
222b0 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68  wnwards so.** th
222c0 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  at:.**.**   (1) 
222d0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
222e0 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74  less than any ot
222f0 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74  her WhereLoops t
22300 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72  hat are a proper
22310 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74  .**       subset
22320 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a   of pTemplate.**
22330 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c  .**   (2) pTempl
22340 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  ate costs more t
22350 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
22360 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69  ereLoops for whi
22370 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20  ch pTemplate.** 
22380 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65        is a prope
22390 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  r subset..**.** 
223a0 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f  To say "WhereLoo
223b0 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  p X is a proper 
223c0 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61  subset of Y" mea
223d0 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66  ns that X uses f
223e0 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c  ewer.** WHERE cl
223f0 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
22400 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
22410 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
22420 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a  rm used by X is.
22430 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  ** also used by 
22440 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  Y..*/.static voi
22450 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
22460 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
22470 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
22480 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
22490 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
224a0 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
224b0 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
224c0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
224d0 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
224e0 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
224f0 43 41 4e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  CAN)!=0 ) return
22500 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
22510 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
22520 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
22530 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
22540 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
22550 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
22560 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
22570 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
22580 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
22590 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
225a0 43 41 4e 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  CAN)!=0 ) contin
225b0 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  ue;.    if( wher
225c0 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
225d0 65 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d  erSubset(p, pTem
225e0 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  plate) ){.      
225f0 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
22600 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72  ate cost downwar
22610 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
22620 63 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73  cheaper than its
22630 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65   .      ** subse
22640 74 20 70 20 2a 2f 0a 20 20 20 20 20 20 70 54 65  t p */.      pTe
22650 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70  mplate->rRun = p
22660 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54  ->rRun;.      pT
22670 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20  emplate->nOut = 
22680 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20  p->nOut - 1;.   
22690 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65   }else if( where
226a0 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
226b0 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74  rSubset(pTemplat
226c0 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f  e, p) ){.      /
226d0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
226e0 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73  te cost upward s
226f0 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73  o that it is cos
22700 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e  tlier than p sin
22710 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d  ce.      ** pTem
22720 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65  plate is a prope
22730 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f  r subset of p */
22740 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
22750 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
22760 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
22770 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
22780 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t + 1;.    }.  }
22790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
227a0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
227b0 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72  reLoops in *ppPr
227c0 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  ev looking for o
227d0 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a  ne that can be.*
227e0 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20  * supplanted by 
227f0 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a  pTemplate..**.**
22800 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
22810 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
22820 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  st contains an e
22830 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75  ntry that can su
22840 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c  pplant.** pTempl
22850 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ate, in other wo
22860 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65  rds if pTemplate
22870 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67   does not belong
22880 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   on the list..**
22890 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57  .** If pX is a W
228a0 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54  hereLoop that pT
228b0 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70  emplate can supp
228c0 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72  lant, then retur
228d0 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68  n the.** link th
228e0 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e  at points to pX.
228f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c  .**.** If pTempl
22900 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c  ate cannot suppl
22910 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ant any existing
22920 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
22930 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a  list but needs.*
22940 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  * to be added to
22950 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20   the list, then 
22960 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
22970 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20   to the tail of 
22980 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
22990 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  tic WhereLoop **
229a0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
229b0 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ser(.  WhereLoop
229c0 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e   **ppPrev,.  con
229d0 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  st WhereLoop *pT
229e0 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65  emplate.){.  Whe
229f0 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72  reLoop *p;.  for
22a00 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b  (p=(*ppPrev); p;
22a10 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
22a20 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
22a30 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
22a40 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
22a50 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
22a60 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
22a70 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20  SortIdx ){.     
22a80 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68   /* If either th
22a90 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49  e iTab or iSortI
22aa0 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77  dx values for tw
22ab0 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20  o WhereLoop are 
22ac0 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20  different.      
22ad0 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68  ** then those Wh
22ae0 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f  ereLoops need to
22af0 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73   be considered s
22b00 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74  eparately.  Neit
22b10 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  her is.      ** 
22b20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72  a candidate to r
22b30 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72  eplace the other
22b40 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
22b50 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nue;.    }.    /
22b60 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
22b70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
22b80 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75   the rSetup valu
22b90 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  e is either zero
22ba0 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63  .    ** or the c
22bb0 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ost of building 
22bc0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
22bd0 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74  ex (NlogN) and t
22be0 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20  he NlogN.    ** 
22bf0 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  is the same for 
22c00 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65  compatible Where
22c10 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73  Loops. */.    as
22c20 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
22c30 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d  =0 || pTemplate-
22c40 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20  >rSetup==0 .    
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
22c60 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70  p->rSetup==pTemp
22c70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
22c80 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f  .    /* whereLoo
22c90 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61  pAddBtree() alwa
22ca0 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64  ys generates and
22cb0 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74   inserts the aut
22cc0 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20  omatic index.   
22cd0 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20   ** case first. 
22ce0 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c   Hence compatibl
22cf0 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72  e candidate Wher
22d00 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76  eLoops never hav
22d10 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a  e a larger.    *
22d20 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74  * rSetup. Call t
22d30 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49  his SETUP-INVARI
22d40 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ANT */.    asser
22d50 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
22d60 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
22d70 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78  );..    /* If ex
22d80 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
22d90 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61   p is better tha
22da0 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65  n pTemplate, pTe
22db0 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20  mplate can be.  
22dc0 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20    ** discarded. 
22dd0 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20   WhereLoop p is 
22de0 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a  better if:.    *
22df0 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e  *   (1)  p has n
22e00 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
22e10 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ies than pTempla
22e20 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  te, and.    **  
22e30 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65   (2)  p has an e
22e40 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f  qual or lower co
22e50 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  st than pTemplat
22e60 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
22e70 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
22e80 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
22e90 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f  ==p->prereq    /
22ea0 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26  * (1)  */.     &
22eb0 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65  & p->rSetup<=pTe
22ec0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20  mplate->rSetup  
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
22ef0 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d  && p->rRun<=pTem
22f00 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20  plate->rRun     
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
22f30 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65   && p->nOut<=pTe
22f40 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20    /* (2c) */.   
22f70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22f80 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20   0;  /* Discard 
22f90 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
22fa0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54   }..    /* If pT
22fb0 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79  emplate is alway
22fc0 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c  s better than p,
22fd0 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f   then cause p to
22fe0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
22ff0 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d      ** with pTem
23000 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74  plate.  pTemplat
23010 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  e is better than
23020 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20   p if:.    **   
23030 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (1)  pTemplate h
23040 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
23050 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61  dences than p, a
23060 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20  nd.    **   (2) 
23070 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61   pTemplate has a
23080 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72  n equal or lower
23090 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20   cost than p..  
230a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
230b0 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
230c0 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
230d0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20  emplate->prereq 
230e0 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20    /* (1)  */.   
230f0 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54    && p->rRun>=pT
23100 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61            /* (2a
23130 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
23140 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut>=pTemplate-
23150 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23170 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
23180 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23190 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
231a0 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
231b0 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52  ; /* SETUP-INVAR
231c0 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20  IANT above */.  
231d0 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20      break;   /* 
231e0 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76  Cause p to be ov
231f0 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65  erwritten by pTe
23200 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a  mplate */.    }.
23210 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50    }.  return ppP
23220 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rev;.}../*.** In
23230 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20  sert or replace 
23240 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  a WhereLoop entr
23250 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70  y using the temp
23260 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a  late supplied..*
23270 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
23280 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
23290 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72   might be overwr
232a0 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77  itten if the new
232b0 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20   template.** is 
232c0 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66  better and has f
232d0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
232e0 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c  s.  Or the templ
232f0 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ate will be igno
23300 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e  red.** and no in
23310 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20  sert will occur 
23320 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  if an existing W
23330 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74  hereLoop is fast
23340 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65  er and has.** fe
23350 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
23360 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61   than the templa
23370 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  te.  Otherwise a
23380 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69   new WhereLoop i
23390 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64  s.** added based
233a0 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65   on the template
233b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c  ..**.** If pBuil
233c0 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e  der->pOrSet is n
233d0 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
233e0 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20  care about only 
233f0 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73  the.** prerequis
23400 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e  ites and rRun an
23410 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20  d nOut costs of 
23420 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73  the N best loops
23430 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72  .  That.** infor
23440 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72  mation is gather
23450 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64  ed in the pBuild
23460 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63  er->pOrSet objec
23470 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c  t.  This special
23480 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d  .** processing m
23490 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ode is used only
234a0 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
234b0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
234c0 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   When accumulati
234d0 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70  ng multiple loop
234e0 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72  s (when pBuilder
234f0 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c  ->pOrSet is NULL
23500 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
23510 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
23520 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
23530 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
23540 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
23550 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
23560 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
23570 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
23580 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
23590 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
235a0 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
235b0 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
235c0 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
235d0 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
235e0 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
235f0 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
23600 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
23610 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
23620 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
23630 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
23640 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
23650 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
23660 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
23670 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
23680 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73  urrent loop.*/.s
23690 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
236a0 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c  oopInsert(WhereL
236b0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
236c0 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20  lder, WhereLoop 
236d0 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57  *pTemplate){.  W
236e0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
236f0 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e  v, *p;.  WhereIn
23700 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
23710 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
23720 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23730 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
23740 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  b;..  /* If pBui
23750 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
23760 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
23770 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
23780 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
23790 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
237a0 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
237b0 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23  ->pOrSet!=0 ){.#
237c0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
237d0 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20  ABLED.    u16 n 
237e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  = pBuilder->pOrS
237f0 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78  et->n;.    int x
23800 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68   =.#endif.    wh
23810 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69  ereOrInsert(pBui
23820 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54  lder->pOrSet, pT
23830 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c  emplate->prereq,
23840 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
23850 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23870 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
23880 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52  >nOut);.#if WHER
23890 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
238a0 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28  * 0x8 */.    if(
238b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
238c0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
238d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
238e0 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64  intf(x?"   or-%d
238f0 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20  :  ":"   or-X:  
23900 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65  ", n);.      whe
23910 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
23920 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
23930 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  >pWC);.    }.#en
23940 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
23950 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
23960 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20   /* Look for an 
23970 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
23980 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69  op to replace wi
23990 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a  th pTemplate.  *
239a0 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a  /.  whereLoopAdj
239b0 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e  ustCost(pWInfo->
239c0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
239d0 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77  e);.  ppPrev = w
239e0 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
239f0 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  er(&pWInfo->pLoo
23a00 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  ps, pTemplate);.
23a10 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30  .  if( ppPrev==0
23a20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
23a30 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
23a40 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74  a WhereLoop on t
23a50 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
23a60 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
23a70 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f  an pTemplate, so
23a80 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65   just ignore pTe
23a90 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48  mplate */.#if WH
23aa0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
23ab0 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69   /* 0x8 */.    i
23ac0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
23ad0 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
23ae0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23af0 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70  Printf("ins-noop
23b00 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
23b10 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
23b20 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
23b30 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
23b40 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
23b50 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
23b60 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
23b70 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
23b80 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
23b90 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
23ba0 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
23bb0 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
23bc0 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
23bd0 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
23be0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
23bf0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
23c00 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
23c10 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
23c20 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
23c30 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
23c40 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
23c50 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
23c60 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
23c70 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
23c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
23c90 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64  bugPrintf("ins-d
23ca0 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 77  el:  ");.      w
23cb0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
23cc0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
23cd0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23ce0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
23cf0 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20  ns-new:  ");.   
23d00 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
23d10 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
23d20 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23  der->pWC);.  }.#
23d30 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30  endif.  if( p==0
23d40 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63   ){.    /* Alloc
23d50 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ate a new WhereL
23d60 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68  oop to add to th
23d70 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73  e end of the lis
23d80 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76  t */.    *ppPrev
23d90 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62   = p = sqlite3Db
23da0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
23db0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
23dc0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
23dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23de0 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
23df0 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20  oopInit(p);.    
23e00 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30  p->pNextLoop = 0
23e10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
23e20 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65  * We will be ove
23e30 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f  rwriting WhereLo
23e40 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66  op p[].  But bef
23e50 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74  ore we do, first
23e60 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75  .    ** go throu
23e70 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  gh the rest of t
23e80 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65  he list and dele
23e90 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74  te any other ent
23ea0 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20  ries besides.   
23eb0 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65   ** p[] that are
23ec0 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20   also supplated 
23ed0 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
23ee0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a      WhereLoop **
23ef0 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65  ppTail = &p->pNe
23f00 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72  xtLoop;.    Wher
23f10 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20  eLoop *pToDel;. 
23f20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69     while( *ppTai
23f30 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69  l ){.      ppTai
23f40 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  l = whereLoopFin
23f50 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20  dLesser(ppTail, 
23f60 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20  pTemplate);.    
23f70 20 20 69 66 28 20 4e 45 56 45 52 28 70 70 54 61    if( NEVER(ppTa
23f80 69 6c 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  il==0) ) break;.
23f90 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a        pToDel = *
23fa0 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66  ppTail;.      if
23fb0 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72  ( pToDel==0 ) br
23fc0 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61  eak;.      *ppTa
23fd0 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65  il = pToDel->pNe
23fe0 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52  xtLoop;.#if WHER
23ff0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
24000 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69  * 0x8 */.      i
24010 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
24020 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
24030 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24040 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65  ugPrintf("ins-de
24050 6c 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77  l: ");.        w
24060 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
24070 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e  oDel, pBuilder->
24080 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  pWC);.      }.#e
24090 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65  ndif.      where
240a0 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70  LoopDelete(db, p
240b0 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  ToDel);.    }.  
240c0 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65  }.  whereLoopXfe
240d0 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61  r(db, p, pTempla
240e0 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77  te);.  if( (p->w
240f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
24100 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
24110 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
24120 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65  ndex = p->u.btre
24130 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  e.pIndex;.    if
24140 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64  ( pIndex && pInd
24150 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20  ex->tnum==0 ){. 
24160 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
24170 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
24180 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
24190 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
241a0 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68  ** Adjust the Wh
241b0 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c  ereLoop.nOut val
241c0 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61  ue downward to a
241d0 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73  ccount for terms
241e0 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   of the.** WHERE
241f0 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66   clause that ref
24200 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20  erence the loop 
24210 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
24220 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20  t used by an.** 
24230 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  index..**.** In 
24240 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
24250 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
24260 66 69 72 73 74 20 65 78 74 72 61 20 57 48 45 52  first extra WHER
24270 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 72 65  E clause term re
24280 64 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  duces.** the num
24290 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
242a0 77 73 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ws by a factor o
242b0 66 20 31 30 20 61 6e 64 20 65 61 63 68 20 61 64  f 10 and each ad
242c0 64 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a  ditional term.**
242d0 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
242e0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
242f0 77 73 20 62 79 20 73 71 72 74 28 32 29 2e 0a 2a  ws by sqrt(2)..*
24300 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
24310 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
24320 75 73 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  ust(WhereClause 
24330 2a 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pWC, WhereLoop 
24340 2a 70 4c 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65  *pLoop){.  Where
24350 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58  Term *pTerm, *pX
24360 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41  ;.  Bitmask notA
24370 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70  llowed = ~(pLoop
24380 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e  ->prereq|pLoop->
24390 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74  maskSelf);.  int
243a0 20 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f   i, j;..  if( !O
243b0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
243c0 65 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e  ed(pWC->pWInfo->
243d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
243e0 54 45 5f 41 64 6a 75 73 74 4f 75 74 45 73 74 29  TE_AdjustOutEst)
243f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
24400 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d    }.  for(i=pWC-
24410 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57  >nTerm, pTerm=pW
24420 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  C->a; i>0; i--, 
24430 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
24440 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
24450 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
24460 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
24470 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
24480 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
24490 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20  >maskSelf)==0 ) 
244a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
244b0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
244c0 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64  All & notAllowed
244d0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
244e0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70  .    for(j=pLoop
244f0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
24500 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58  ; j--){.      pX
24510 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
24520 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
24530 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==0 ) continue;
24540 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
24550 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
24560 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72      if( pX->iPar
24570 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d  ent>=0 && (&pWC-
24580 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29  >a[pX->iParent])
24590 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
245a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
245b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f  <0 ){.      pLoo
245c0 70 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 54 65 72  p->nOut += (pTer
245d0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
245e0 3f 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ? pTerm->truthPr
245f0 6f 62 20 3a 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  ob : -1);.    }.
24600 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20    }.}../*.** We 
24610 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63  have so far matc
24620 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  hed pBuilder->pN
24630 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
24640 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
24650 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72  ex pIndex..** Tr
24660 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d  y to match one m
24670 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  ore..**.** If pP
24680 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74  robe->tnum==0, t
24690 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78  hat means pIndex
246a0 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78   is a fake index
246b0 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a   used for the.**
246c0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
246d0 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   KEY..*/.static 
246e0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
246f0 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68  BtreeIndex(.  Wh
24700 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
24710 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a  pBuilder,     /*
24720 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66   The WhereLoop f
24730 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75  actory */.  stru
24740 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24750 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46  *pSrc,      /* F
24760 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
24770 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a  being analyzed *
24780 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
24790 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
247a0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
247b0 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67  on pSrc */.  Log
247c0 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  Est nInMul      
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
247e0 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74  log(Number of it
247f0 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20  erations due to 
24800 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  IN) */.){.  Wher
24810 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
24820 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
24830 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c  ;  /* WHERE anal
24840 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  yse context */. 
24850 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
24860 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
24870 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
24880 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
24890 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
248a0 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
248b0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
248c0 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
248d0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
248e0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
248f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
24900 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
24910 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
24920 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
24930 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
24940 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
24950 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
24960 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
24970 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24990 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
249a0 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
249b0 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
249c0 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
249d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
249e0 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
249f0 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
24a00 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20  k saved_prereq; 
24a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
24a20 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
24a30 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20  New->prereq */. 
24a40 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72   u16 saved_nLTer
24a50 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
24a60 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
24a70 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65  ue of pNew->nLTe
24a80 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  rm */.  u16 save
24a90 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  d_nEq;          
24aa0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
24ab0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
24ac0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a  w->u.btree.nEq *
24ad0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53  /.  u16 saved_nS
24ae0 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kip;            
24af0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
24b00 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
24b10 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a  .btree.nSkip */.
24b20 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c    u32 saved_wsFl
24b30 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
24b40 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
24b50 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46  lue of pNew->wsF
24b60 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  lags */.  LogEst
24b70 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20   saved_nOut;    
24b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
24b90 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
24ba0 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69  New->nOut */.  i
24bb0 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24bd0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
24be0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
24bf0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  le */.  int rc =
24c00 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
24c10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
24c20 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45  n code */.  LogE
24c30 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
24c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
24c50 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c  ogarithm of tabl
24c60 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72  e size */.  Wher
24c70 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c  eTerm *pTop = 0,
24c80 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54   *pBtm = 0; /* T
24c90 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61  op and bottom ra
24ca0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
24cb0 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  */..  pNew = pBu
24cc0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69  ilder->pNew;.  i
24cd0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
24ce0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
24cf0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73  ITE_NOMEM;..  as
24d00 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
24d10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
24d20 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
24d30 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
24d40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
24d50 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_TOP_LIMIT)==0 
24d60 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  );.  if( pNew->w
24d70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
24d80 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
24d90 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57  opMask = WO_LT|W
24da0 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_LE;.  }else if
24db0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
24dc0 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e  0 || (pSrc->join
24dd0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
24de0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  =0 ){.    opMask
24df0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
24e00 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
24e10 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_LE;.  }else{
24e20 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
24e30 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
24e40 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  ULL|WO_GT|WO_GE|
24e50 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
24e60 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  .  if( pProbe->b
24e70 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61  Unordered ) opMa
24e80 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f  sk &= ~(WO_GT|WO
24e90 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  _GE|WO_LT|WO_LE)
24ea0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
24eb0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
24ec0 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20  pProbe->nKeyCol 
24ed0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75  );.  if( pNew->u
24ee0 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72  .btree.nEq < pPr
24ef0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  obe->nKeyCol ){.
24f00 20 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62      iCol = pProb
24f10 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77  e->aiColumn[pNew
24f20 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a  ->u.btree.nEq];.
24f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f    }else{.    iCo
24f40 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54  l = -1;.  }.  pT
24f50 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49  erm = whereScanI
24f60 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c  nit(&scan, pBuil
24f70 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e  der->pWC, pSrc->
24f80 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20  iCursor, iCol,. 
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fa0 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70         opMask, p
24fb0 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f  Probe);.  saved_
24fc0 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
24fd0 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
24fe0 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 75  _nSkip = pNew->u
24ff0 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20  .btree.nSkip;.  
25000 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70  saved_nLTerm = p
25010 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73  New->nLTerm;.  s
25020 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70  aved_wsFlags = p
25030 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  New->wsFlags;.  
25040 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70  saved_prereq = p
25050 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73  New->prereq;.  s
25060 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77  aved_nOut = pNew
25070 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e  ->nOut;.  pNew->
25080 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c  rSetup = 0;.  rL
25090 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
250a0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
250b0 45 73 74 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 43  Est[0]);..  /* C
250c0 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20  onsider using a 
250d0 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65  skip-scan if the
250e0 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
250f0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
25100 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ts.  ** availabl
25110 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d  e for the left-m
25120 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ost terms of the
25130 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74   index, and if t
25140 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20  he average.  ** 
25150 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74  number of repeat
25160 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
25170 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c  st terms is at l
25180 65 61 73 74 20 31 38 2e 20 20 54 68 65 20 6d 61  east 18.  The ma
25190 67 69 63 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  gic.  ** number 
251a0 31 38 20 77 61 73 20 66 6f 75 6e 64 20 62 79 20  18 was found by 
251b0 65 78 70 65 72 69 6d 65 6e 74 61 74 69 6f 6e 20  experimentation 
251c0 74 6f 20 62 65 20 74 68 65 20 70 61 79 6f 66 66  to be the payoff
251d0 20 70 6f 69 6e 74 20 77 68 65 72 65 0a 20 20 2a   point where.  *
251e0 2a 20 73 6b 69 70 2d 73 63 61 6e 20 62 65 63 6f  * skip-scan beco
251f0 6d 65 20 66 61 73 74 65 72 20 74 68 61 6e 20 61  me faster than a
25200 20 66 75 6c 6c 2d 73 63 61 6e 2e 0a 20 20 2a 2f   full-scan..  */
25210 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73  .  assert( 42==s
25220 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29  qlite3LogEst(18)
25230 20 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d   );.  if( pTerm=
25240 3d 30 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  =0.   && saved_n
25250 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
25260 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
25270 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
25280 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
25290 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
252a0 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
252b0 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
252c0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
252d0 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
252e0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
252f0 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
25300 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
25310 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
25320 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
25330 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
25340 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ++;.    pNew->u.
25350 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20  btree.nSkip++;. 
25360 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
25370 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
25380 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
25390 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
253a0 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
253b0 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ter = pProbe->ai
253c0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
253d0 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
253e0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
253f0 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65  _nEq+1];.    pNe
25400 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72  w->nOut -= nIter
25410 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41  ;.    whereLoopA
25420 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
25430 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
25440 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e  obe, nIter + nIn
25450 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Mul);.    pNew->
25460 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
25470 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72  t;.  }.  for(; r
25480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25490 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20  pTerm!=0; pTerm 
254a0 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
254b0 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36  &scan)){.    u16
254c0 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f   eOp = pTerm->eO
254d0 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68  perator;   /* Sh
254e0 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72  orthand for pTer
254f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  m->eOperator */.
25500 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
25510 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20  Idx;.    LogEst 
25520 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20  nOutUnadjusted; 
25530 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62         /* nOut b
25540 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57  efore IN() and W
25550 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73  HERE adjustments
25560 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20   */.    int nIn 
25570 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
25580 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
25590 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
255a0 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
255b0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
255c0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
255d0 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   (eOp==WO_ISNULL
255e0 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   || (pTerm->wtFl
255f0 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21  ags&TERM_VNULL)!
25600 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f  =0).     && (iCo
25610 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61  l<0 || pSrc->pTa
25620 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
25630 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20  tNull).    ){.  
25640 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
25650 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
25660 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
25670 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
25680 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
25690 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
256a0 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
256b0 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
256c0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77  tinue;..    pNew
256d0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
256e0 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
256f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
25700 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
25710 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
25720 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
25730 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
25740 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
25750 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
25760 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
25770 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
25780 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
25790 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
257a0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
257b0 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
257c0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
257d0 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
257e0 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73  skSelf;..    ass
257f0 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  ert( nInMul==0. 
25800 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
25810 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25820 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30  _COLUMN_NULL)!=0
25830 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
25840 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
25850 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d  ERE_COLUMN_IN)!=
25860 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  0 .        || (p
25870 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
25880 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d  HERE_SKIPSCAN)!=
25890 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  0 .    );..    i
258a0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  f( eOp & WO_IN )
258b0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
258c0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
258d0 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
258e0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
258f0 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
25900 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
25910 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
25920 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
25930 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
25940 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
25950 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
25960 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
25970 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  s */.        nIn
25980 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
25990 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  46==sqlite3LogEs
259a0 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d  t(25) );.      }
259b0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
259c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
259d0 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
259e0 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
259f0 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
25a00 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
25a10 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
25a20 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
25a30 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
25a40 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
25a50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
25a60 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
25a70 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
25a80 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
25a90 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ab0 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20    ** changes "x 
25ac0 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d  IN (?)" into "x=
25ad0 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73  ?". */..    }els
25ae0 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
25af0 45 51 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  EQ) ){.      pNe
25b00 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
25b10 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
25b20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
25b30 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26  || (nInMul==0 &&
25b40 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
25b50 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
25b60 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Col-1) ){.      
25b70 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
25b80 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72   pProbe->onError
25b90 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  ==OE_None ){.   
25ba0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
25bb0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
25bc0 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20  Q_WANTED;.      
25bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25be0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
25bf0 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
25c00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25c10 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
25c20 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
25c30 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  L ){.      pNew-
25c40 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
25c50 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
25c60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
25c70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
25c80 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
25c90 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20  se( eOp & WO_GT 
25ca0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
25cb0 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29  e( eOp & WO_GE )
25cc0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
25cd0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
25ce0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
25cf0 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
25d00 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
25d10 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
25d20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25d30 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
25d40 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
25d50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25d60 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
25d70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25d80 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
25d90 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
25da0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
25db0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
25dc0 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
25dd0 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
25de0 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
25df0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
25e00 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
25e10 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
25e20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
25e30 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
25e40 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a  -2] : 0;.    }..
25e50 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
25e60 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  oint pNew->nOut 
25e70 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
25e80 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
25e90 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ected to.    ** 
25ea0 62 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68  be visited by th
25eb0 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66  e index scan bef
25ec0 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ore considering 
25ed0 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74  term pTerm, or t
25ee0 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
25ef0 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d   of nIn and nInM
25f00 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ul. In other wor
25f10 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ds, assuming tha
25f20 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78  t all .    ** "x
25f30 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20   IN(...)" terms 
25f40 61 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74  are replaced wit
25f50 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20  h "x = ?". This 
25f60 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20  block updates.  
25f70 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
25f80 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20  f pNew->nOut to 
25f90 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72  account for pTer
25fa0 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e  m (but not nIn/n
25fb0 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20  InMul).  */.    
25fc0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
25fd0 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
25fe0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
25ff0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26000 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
26010 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
26020 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33  nOut using stat3
26030 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c  /stat4 data. Or,
26040 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
26050 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20  stat3/stat4.    
26060 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67    ** data, using
26070 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69   some other esti
26080 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mate.  */.      
26090 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
260a0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
260b0 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
260c0 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pNew);.    }else
260d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  {.      int nEq 
260e0 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  = ++pNew->u.btre
260f0 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73  e.nEq;.      ass
26100 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49  ert( eOp & (WO_I
26110 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49  SNULL|WO_EQ|WO_I
26120 4e 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  N) );..      ass
26130 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
26140 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
26150 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
26160 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a  truthProb<=0 ){.
26170 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26180 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c  (eOp & WO_IN) ||
26190 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   nIn==0 );.     
261a0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
261b0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
261c0 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  b;.        pNew-
261d0 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
261e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
261f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4c 49 4b  ags |= WHERE_LIK
26200 45 4c 49 48 4f 4f 44 3b 0a 20 20 20 20 20 20 7d  ELIHOOD;.      }
26210 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
26220 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
26230 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20 20  _OR_STAT4.      
26240 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d    tRowcnt nOut =
26250 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
26260 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20  nInMul==0 .     
26270 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e      && pProbe->n
26280 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
26290 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
262a0 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq<=pProbe->n
262b0 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20  SampleCol.      
262c0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
262d0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
262e0 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 20  LITE_Stat3) .   
262f0 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20 26        && ((eOp &
26300 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45   WO_IN)==0 || !E
26310 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26320 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
26330 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20  xIsSelect)).    
26340 20 20 20 20 20 26 26 20 28 70 4e 65 77 2d 3e 77       && (pNew->w
26350 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4c  sFlags & WHERE_L
26360 49 4b 45 4c 49 48 4f 4f 44 29 3d 3d 30 0a 20 20  IKELIHOOD)==0.  
26370 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26380 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
26390 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
263a0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f           if( (eO
263b0 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
263c0 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20  NULL))!=0 ){.   
263d0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
263e0 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29  e( eOp & WO_EQ )
263f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
26400 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
26410 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
26420 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
26430 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
26440 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
26450 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
26460 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
26470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26480 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e      rc = whereIn
26490 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
264a0 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
264b0 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
264c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
264d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
264e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
264f0 20 6e 4f 75 74 3e 30 20 29 3b 0a 20 20 20 20 20   nOut>0 );.     
26500 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
26510 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72  ITE_NOTFOUND ) r
26520 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26530 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
26540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
26550 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ak;          /* 
26560 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  Jump out of the 
26570 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20  pTerm loop */.  
26580 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74          if( nOut
26590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
265a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
265b0 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29  ite3LogEst(nOut)
265c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
265d0 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76  ( pNew->nOut>sav
265e0 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e  ed_nOut ) pNew->
265f0 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
26600 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
26610 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
26620 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26640 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65  if( nOut==0 ).#e
26650 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
26660 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
26670 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e  Out += (pProbe->
26680 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d  aiRowLogEst[nEq]
26690 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   - pProbe->aiRow
266a0 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a  LogEst[nEq-1]);.
266b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f            if( eO
266c0 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
266d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
266e0 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
266f0 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f   is no likelihoo
26700 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d  d() value, assum
26710 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20  e that a .      
26720 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53        ** "col IS
26730 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f   NULL" expressio
26740 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20  n matches twice 
26750 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20  as many rows .  
26760 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20            ** as 
26770 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20  (col=?). */.    
26780 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
26790 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20  ut += 10;.      
267a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
267b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
267c0 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49     /* Set rCostI
267d0 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  dx to the cost o
267e0 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63  f visiting selec
267f0 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65  ted rows in inde
26800 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74  x. Add.    ** it
26810 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20   to pNew->rRun, 
26820 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74  which is current
26830 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  ly set to the co
26840 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  st of the index.
26850 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79      ** seek only
26860 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20  . Then, if this 
26870 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
26880 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65  g index, add the
26890 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20   cost of.    ** 
268a0 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77  visiting the row
268b0 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  s in the main ta
268c0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f  ble.  */.    rCo
268d0 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f  stIdx = pNew->nO
268e0 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72  ut + 1 + (15*pPr
268f0 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70  obe->szIdxRow)/p
26900 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62  Src->pTab->szTab
26910 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Row;.    pNew->r
26920 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
26930 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
26940 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20   rCostIdx);.    
26950 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
26960 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f  gs & (WHERE_IDX_
26970 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29  ONLY|WHERE_IPK))
26980 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ==0 ){.      pNe
26990 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
269a0 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d  3LogEstAdd(pNew-
269b0 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75  >rRun, pNew->nOu
269c0 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 0a  t + 16);.    }..
269d0 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74      nOutUnadjust
269e0 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ed = pNew->nOut;
269f0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
26a00 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
26a10 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
26a20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
26a30 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75  .    whereLoopOu
26a40 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c  tputAdjust(pBuil
26a50 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 29 3b  der->pWC, pNew);
26a60 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
26a70 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
26a80 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
26a90 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
26aa0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
26ab0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
26ac0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
26ad0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
26ae0 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
26af0 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
26b00 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
26b10 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
26b20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
26b30 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
26b40 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
26b50 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 4b  .nEq<(pProbe->nK
26b60 65 79 43 6f 6c 20 2b 20 28 70 50 72 6f 62 65 2d  eyCol + (pProbe-
26b70 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20  >zName!=0)).    
26b80 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
26b90 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
26ba0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
26bb0 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
26bc0 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  In);.    }.    p
26bd0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
26be0 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53  d_nOut;.#ifdef S
26bf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
26c00 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
26c10 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
26c20 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
26c30 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e  .#endif.  }.  pN
26c40 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76  ew->prereq = sav
26c50 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65  ed_prereq;.  pNe
26c60 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
26c70 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e   saved_nEq;.  pN
26c80 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
26c90 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b  p = saved_nSkip;
26ca0 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
26cb0 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
26cc0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  ;.  pNew->nOut =
26cd0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70   saved_nOut;.  p
26ce0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61  New->nLTerm = sa
26cf0 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65  ved_nLTerm;.  re
26d00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26d10 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66  * Return True if
26d20 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
26d30 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68  that pIndex migh
26d40 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a  t be useful in.*
26d50 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  * implementing t
26d60 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
26d70 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a  se in pBuilder..
26d80 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c  **.** Return Fal
26d90 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64  se if pBuilder d
26da0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
26db0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
26dc0 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72  se or.** if ther
26dd0 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
26de0 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65  pIndex to be use
26df0 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74  ful in implement
26e00 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45  ing that.** ORDE
26e10 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
26e20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78  static int index
26e30 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
26e40 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f  erBy(.  WhereLoo
26e50 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
26e60 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  er,.  Index *pIn
26e70 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73  dex,.  int iCurs
26e80 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  or.){.  ExprList
26e90 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c   *pOB;.  int ii,
26ea0 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
26eb0 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
26ec0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
26ed0 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
26ee0 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
26ef0 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
26f00 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
26f10 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
26f20 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
26f30 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
26f40 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
26f50 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
26f60 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
26f70 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
26f80 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
26f90 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
26fa0 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
26fb0 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
26fc0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  Index->nKeyCol; 
26fd0 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
26fe0 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
26ff0 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  n==pIndex->aiCol
27000 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e  umn[jj] ) return
27010 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
27020 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
27030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
27040 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
27050 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
27060 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
27070 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
27080 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
27090 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
270a0 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
270b0 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
270c0 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
270d0 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
270e0 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
270f0 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
27100 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
27110 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
27120 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
27130 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
27140 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
27150 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
27160 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
27170 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
27180 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
27190 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
271a0 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
271b0 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
271c0 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
271d0 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
271e0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
271f0 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
27200 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
27210 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
27220 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
27230 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
27240 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
27250 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
27260 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
27270 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
27280 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
27290 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
272a0 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
272b0 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
272c0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
272d0 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Term;.  for(i=0,
272e0 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
272f0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
27300 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
27310 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
27320 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d  mpliesExpr(pTerm
27330 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  ->pExpr, pWhere,
27340 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
27350 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
27360 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
27370 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
27380 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
27390 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
273a0 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
273b0 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66  able.** is idenf
273c0 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
273d0 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
273e0 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
273f0 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
27400 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
27410 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
27420 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
27430 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
27440 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
27450 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
27460 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
27470 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
27480 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
27490 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
274a0 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
274b0 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
274c0 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
274d0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
274e0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
274f0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
27500 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
27510 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
27520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
27530 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
27540 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
27550 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
27560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
27570 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
27580 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
27590 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  y key */.  LogEs
275a0 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
275b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69         /* The ai
275c0 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75  RowLogEst[] valu
275d0 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
275e0 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43  dex */.  i16 aiC
275f0 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20  olumnPk = -1;   
27600 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c       /* The aCol
27610 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  umn[] value for 
27620 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
27630 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
27640 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
27650 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
27660 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
27670 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
27680 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ;  /* The FROM c
27690 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d  lause btree term
276a0 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65   to add */.  Whe
276b0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
276c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
276d0 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  late WhereLoop o
276e0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
276f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
27700 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27710 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
27720 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20  SortIdx = 1;    
27730 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
27740 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
27750 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
27760 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f          /* A boo
27770 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  lean value */.  
27780 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20  LogEst rSize;   
27790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
277a0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
277b0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
277c0 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
277d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
277e0 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
277f0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
27800 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
27810 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
27820 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
27830 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45  The parsed WHERE
27840 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62   clause */.  Tab
27850 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
27860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
27870 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
27880 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70  */.  .  pNew = p
27890 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
278a0 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
278b0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54  er->pWInfo;.  pT
278c0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
278d0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72  >pTabList;.  pSr
278e0 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20  c = pTabList->a 
278f0 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
27900 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
27910 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
27920 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65  der->pWC;.  asse
27930 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
27940 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20  Src->pTab) );.. 
27950 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
27960 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
27970 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
27980 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
27990 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
279a0 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
279b0 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65  be = pSrc->pInde
279c0 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  x;.  }else if( !
279d0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
279e0 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70  {.    pProbe = p
279f0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d  Tab->pIndex;.  }
27a00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
27a10 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44  re is no INDEXED
27a20 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65   BY clause.  Cre
27a30 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78  ate a fake Index
27a40 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c   object in local
27a50 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
27a60 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e   sPk to represen
27a70 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  t the rowid prim
27a80 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20  ary key index.  
27a90 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  Make this.    **
27aa0 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20   fake index the 
27ab0 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e  first in a chain
27ac0 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   of Index object
27ad0 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68  s with all of th
27ae0 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  e real.    ** in
27af0 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  dices to follow 
27b00 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46  */.    Index *pF
27b10 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
27b20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
27b30 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  of real indices 
27b40 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
27b50 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
27b60 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
27b70 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79  ));.    sPk.nKey
27b80 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  Col = 1;.    sPk
27b90 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43  .aiColumn = &aiC
27ba0 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b  olumnPk;.    sPk
27bb0 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61  .aiRowLogEst = a
27bc0 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73  iRowEstPk;.    s
27bd0 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  Pk.onError = OE_
27be0 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b  Replace;.    sPk
27bf0 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  .pTable = pTab;.
27c00 20 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77      sPk.szIdxRow
27c10 20 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f   = pTab->szTabRo
27c20 77 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  w;.    aiRowEstP
27c30 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  k[0] = pTab->nRo
27c40 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52  wLogEst;.    aiR
27c50 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a  owEstPk[1] = 0;.
27c60 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
27c70 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
27c80 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
27c90 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
27ca0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
27cb0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
27cc0 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
27cd0 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
27ce0 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
27cf0 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
27d00 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
27d10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
27d20 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
27d30 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
27d40 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
27d50 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
27d60 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  ze = pTab->nRowL
27d70 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a  ogEst;.  rLogSiz
27d80 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
27d90 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
27da0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
27db0 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74  C_INDEX.  /* Aut
27dc0 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a  omatic indexes *
27dd0 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65  /.  if( !pBuilde
27de0 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20  r->pOrSet.   && 
27df0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
27e00 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
27e10 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
27e20 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49  0.   && pSrc->pI
27e30 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70  ndex==0.   && !p
27e40 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  Src->viaCoroutin
27e50 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e  e.   && !pSrc->n
27e60 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20  otIndexed.   && 
27e70 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20  HasRowid(pTab). 
27e80 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f    && !pSrc->isCo
27e90 72 72 65 6c 61 74 65 64 0a 20 20 20 26 26 20 21  rrelated.   && !
27ea0 70 53 72 63 2d 3e 69 73 52 65 63 75 72 73 69 76  pSrc->isRecursiv
27eb0 65 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65  e.  ){.    /* Ge
27ec0 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65  nerate auto-inde
27ed0 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a  x WhereLoops */.
27ee0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
27ef0 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54  Term;.    WhereT
27f00 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57  erm *pWCEnd = pW
27f10 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
27f20 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  m;.    for(pTerm
27f30 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c  =pWC->a; rc==SQL
27f40 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c  ITE_OK && pTerm<
27f50 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
27f60 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
27f70 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
27f80 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
27f90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
27fa0 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
27fb0 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
27fc0 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
27fd0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
27fe0 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
27ff0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
28000 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20  nSkip = 0;.     
28010 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
28020 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
28030 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
28040 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  m = 1;.        p
28050 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
28060 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
28070 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74  /* TUNING: One-t
28080 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d  ime cost for com
28090 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d  puting the autom
280a0 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20  atic index is.  
280b0 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69        ** approxi
280c0 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28  mately 7*N*log2(
280d0 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  N) where N is th
280e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
280f0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   in.        ** t
28100 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
28110 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20  ndexed. */.     
28120 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
28130 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
28140 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65 72 74  ze + 28;  assert
28150 28 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 28==sqlite3Log
28160 45 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20  Est(7) );.      
28170 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
28180 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
28190 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
281a0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
281b0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
281c0 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
281d0 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
281e0 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
281f0 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
28200 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e     ** of knownin
28210 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
28220 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
28230 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
28240 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
28250 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
28260 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
28270 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
28280 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
28290 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
282a0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
282b0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
282c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
282d0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
282e0 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
282f0 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
28300 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
28310 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
28320 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
28330 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
28340 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d  = mExtra | pTerm
28350 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
28360 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
28370 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
28380 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
28390 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
283a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
283b0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
283c0 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f  NDEX */..  /* Lo
283d0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
283e0 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ces.  */.  for(;
283f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28400 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  & pProbe; pProbe
28410 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20  =pProbe->pNext, 
28420 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20  iSortIdx++){.   
28430 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61   if( pProbe->pPa
28440 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
28450 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62     && !whereUsab
28460 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70  lePartialIndex(p
28470 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20  New->iTab, pWC, 
28480 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
28490 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
284a0 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61  continue;  /* Pa
284b0 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70  rtial index inap
284c0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
284d0 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  is query */.    
284e0 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  }.    pNew->u.bt
284f0 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
28500 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28510 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Skip = 0;.    pN
28520 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
28530 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
28540 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
28550 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
28560 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
28570 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65   mExtra;.    pNe
28580 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
28590 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
285a0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
285b0 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
285c0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
285d0 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
285e0 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
285f0 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
28600 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
28610 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
28620 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
28630 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
28640 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
28650 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
28660 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
28670 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
28680 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
28690 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
286a0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
286b0 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
286c0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
286d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
286e0 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
286f0 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
28700 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
28710 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
28720 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
28730 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
28740 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
28750 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e  le scan is (N*3.
28760 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  0). */.      pNe
28770 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
28780 2b 20 31 36 3b 0a 20 20 20 20 20 20 77 68 65 72  + 16;.      wher
28790 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
287a0 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20  t(pWC, pNew);.  
287b0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
287c0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
287d0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
287e0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
287f0 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ze;.      if( rc
28800 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
28810 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
28820 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  sk m;.      if( 
28830 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69  pProbe->isCoveri
28840 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ng ){.        pN
28850 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
28860 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
28870 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
28880 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20        m = 0;.   
28890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
288a0 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55    m = pSrc->colU
288b0 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
288c0 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20  Index(pProbe);. 
288d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
288e0 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20  lags = (m==0) ? 
288f0 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
28900 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a  WHERE_INDEXED) :
28910 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
28920 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
28930 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20  * Full scan via 
28940 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
28950 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21  f( b.       || !
28960 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20  HasRowid(pTab). 
28970 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
28980 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
28990 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
289a0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
289b0 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c  Probe->szIdxRow<
289c0 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a  pTab->szTabRow).
289d0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
289e0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
289f0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
28a00 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
28a10 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
28a20 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
28a30 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
28a40 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
28a50 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
28a60 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
28a70 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
28a80 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
28a90 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
28aa0 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
28ab0 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20  SortIdx : 0;..  
28ac0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
28ad0 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68  t of visiting th
28ae0 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20  e index rows is 
28af0 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a  N*K, where K is.
28b00 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
28b10 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20  en 1.1 and 3.0, 
28b20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
28b30 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20   relative sizes 
28b40 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
28b50 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  * index and tabl
28b60 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20  e rows. If this 
28b70 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
28b80 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20  g index scan,.  
28b90 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64        ** also ad
28ba0 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69  d the cost of vi
28bb0 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77  siting table row
28bc0 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20  s (N*3.0).  */. 
28bd0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
28be0 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20  n = rSize + 1 + 
28bf0 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64  (15*pProbe->szId
28c00 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61  xRow)/pTab->szTa
28c10 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66  bRow;.        if
28c20 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m!=0 ){.      
28c30 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
28c40 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
28c50 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53  d(pNew->rRun, rS
28c60 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20  ize+16);.       
28c70 20 7d 0a 0a 20 20 20 20 20 20 20 20 77 68 65 72   }..        wher
28c80 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
28c90 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20  t(pWC, pNew);.  
28ca0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
28cb0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
28cc0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
28cd0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
28ce0 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
28cf0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
28d00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
28d10 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
28d20 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
28d30 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
28d40 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65  Probe, 0);.#ifde
28d50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
28d60 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
28d70 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50     sqlite3Stat4P
28d80 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65  robeFree(pBuilde
28d90 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42  r->pRec);.    pB
28da0 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
28db0 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c  d = 0;.    pBuil
28dc0 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23  der->pRec = 0;.#
28dd0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
28de0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
28df0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
28e00 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20   then only that 
28e10 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20  one index is.   
28e20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   ** considered. 
28e30 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  */.    if( pSrc-
28e40 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  >pIndex ) break;
28e50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28e60 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
28e70 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
28e80 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  TABLE./*.** Add 
28e90 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
28ea0 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
28eb0 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
28ec0 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
28ed0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
28ee0 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
28ef0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
28f00 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
28f10 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
28f20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
28f30 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
28f40 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
28f50 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
28f60 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
28f70 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
28f80 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20 57 68 65   mExtra.){.  Whe
28f90 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
28fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
28fb0 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
28fc0 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
28fd0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
28fe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
28ff0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
29000 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
29010 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
29020 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
29030 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
29040 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
29050 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
29060 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
29070 73 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c  search */.  Tabl
29080 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
29090 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
290a0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
290b0 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
290c0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
290d0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
290e0 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
290f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
29100 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
29110 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
29120 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
29130 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72  i, j;.  int iTer
29140 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  m, mxTerm;.  int
29150 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20   nConstraint;.  
29160 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20  int seenIn = 0; 
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29180 54 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70  True if an IN op
29190 65 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a  erator is seen *
291a0 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20  /.  int seenVar 
291b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
291c0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f   /* True if a no
291d0 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74  n-constant const
291e0 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f  raint is seen */
291f0 0a 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20  .  int iPhase;  
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20  /* 0: const w/o 
29220 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a  IN, 1: const, 2:
29230 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a   no IN,  2: IN *
29240 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
29250 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
29260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57  SQLITE_OK;..  pW
29270 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
29280 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
29290 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
292a0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
292b0 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70  e->db;.  pWC = p
292c0 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
292d0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
292e0 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20  >pNew;.  pSrc = 
292f0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
29300 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
29310 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
29320 3e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  >pTab;.  assert(
29330 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
29340 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   );.  pIdxInfo =
29350 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
29360 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
29370 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e  pSrc, pBuilder->
29380 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  pOrderBy);.  if(
29390 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72   pIdxInfo==0 ) r
293a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
293b0 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72  EM;.  pNew->prer
293c0 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  eq = 0;.  pNew->
293d0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e  rSetup = 0;.  pN
293e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
293f0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
29400 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
29410 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
29420 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
29430 30 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  0;.  pUsage = pI
29440 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
29450 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e  intUsage;.  nCon
29460 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
29470 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
29480 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
29490 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
294a0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b   nConstraint) ){
294b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
294c0 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
294d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
294e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
294f0 20 20 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20    for(iPhase=0; 
29500 69 50 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73  iPhase<=3; iPhas
29510 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  e++){.    if( !s
29520 65 65 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65  eenIn && (iPhase
29530 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
29540 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20  iPhase++;.      
29550 69 66 28 20 69 50 68 61 73 65 3e 33 20 29 20 62  if( iPhase>3 ) b
29560 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
29570 69 66 28 20 21 73 65 65 6e 56 61 72 20 26 26 20  if( !seenVar && 
29580 69 50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b  iPhase>1 ) break
29590 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d  ;.    pIdxCons =
295a0 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
295b0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
295c0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
295d0 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  aConstraint;.   
295e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
295f0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
29600 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
29610 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  ++){.      j = p
29620 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
29630 66 73 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72  fset;.      pTer
29640 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
29650 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69 50        switch( iP
29660 68 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  hase ){.        
29670 63 61 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f  case 0:    /* Co
29680 6e 73 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20  nstants without 
29690 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
296a0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
296b0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20  s->usable = 0;. 
296c0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
296d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
296e0 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
296f0 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e            seenIn
29700 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
29710 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
29720 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
29730 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ht!=0 ){.       
29740 20 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31       seenVar = 1
29750 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
29760 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
29770 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
29780 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
29790 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
297a0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ble = 1;.       
297b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
297c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
297d0 73 65 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 1:    /* Cons
297e0 74 61 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70  tants with IN op
297f0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20  erators */.     
29800 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
29810 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nIn );.         
29820 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
29830 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  e = (pTerm->prer
29840 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20  eqRight==0);.   
29850 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
29860 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 20        case 2:   
29870 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69   /* Variables wi
29880 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20  thout IN */.    
29890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
298a0 65 6e 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20  enVar );.       
298b0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
298c0 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f  ble = (pTerm->eO
298d0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
298e0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==0;.          b
298f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
29900 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69  fault:   /* Vari
29910 61 62 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f  ables with IN */
29920 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
29930 74 28 20 73 65 65 6e 56 61 72 20 26 26 20 73 65  t( seenVar && se
29940 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  enIn );.        
29950 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
29960 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  le = 1;.        
29970 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
29980 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
29990 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
299a0 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70  eof(pUsage[0])*p
299b0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
299c0 61 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  aint);.    if( p
299d0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
299e0 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
299f0 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
29a00 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
29a10 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
29a20 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 0;.    pIdxIn
29a30 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
29a40 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
29a50 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
29a60 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
29a70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
29a80 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  d = 0;.    pIdxI
29a90 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
29aa0 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
29ab0 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
29ac0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
29ad0 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
29ae0 35 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62  5;.    rc = vtab
29af0 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
29b00 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  , pTab, pIdxInfo
29b10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
29b20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64  goto whereLoopAd
29b30 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20  dVtab_exit;.    
29b40 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
29b50 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
29b60 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
29b70 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
29b80 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d  raint;.    pNew-
29b90 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
29ba0 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
29bb0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
29bc0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
29bd0 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
29be0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
29bf0 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
29c00 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
29c10 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
29c20 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
29c30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
29c40 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
29c50 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
29c60 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
29c70 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
29c80 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
29c90 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
29ca0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
29cb0 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
29cc0 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
29cd0 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
29ce0 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
29cf0 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
29d00 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
29d10 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
29d20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
29d30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29d40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
29d50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
29d60 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
29d70 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
29d80 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
29d90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
29da0 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
29db0 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
29dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
29dd0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
29de0 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
29df0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
29e00 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
29e10 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
29e20 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
29e30 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
29e40 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
29e50 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
29e60 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
29e70 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
29e80 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
29e90 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
29ea0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
29eb0 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
29ec0 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
29ed0 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
29ee0 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
29ef0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29f00 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
29f10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
29f20 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
29f30 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
29f40 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
29f50 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
29f60 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
29f70 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
29f80 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
29f90 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
29fa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
29fb0 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
29fc0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
29fd0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
29fe0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
29ff0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
2a000 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2a010 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2a020 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
2a030 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
2a040 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
2a050 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
2a060 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
2a070 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
2a080 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
2a090 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
2a0a0 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2a0c0 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
2a0d0 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
2a0e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a0f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a100 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
2a110 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
2a120 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
2a130 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
2a140 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
2a150 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
2a160 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
2a170 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
2a180 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
2a190 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2a1a0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
2a1b0 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
2a1c0 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
2a1d0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
2a1e0 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
2a1f0 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
2a200 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
2a210 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
2a220 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
2a230 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
2a240 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2a250 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2a260 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a270 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2a280 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
2a290 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2a2a0 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
2a2b0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
2a2c0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
2a2d0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2a2e0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2a2f0 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
2a300 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
2a310 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2a320 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
2a330 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2a340 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
2a350 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2a360 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2a370 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2a380 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
2a390 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
2a3a0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
2a3b0 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70  Ordered = (i8)(p
2a3c0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2a3d0 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20  Consumed ?.     
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a400 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
2a410 72 42 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  rBy : 0);.      
2a420 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2a430 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  ;.      pNew->rR
2a440 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
2a450 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64  stFromDouble(pId
2a460 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
2a470 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65  Cost);.      pNe
2a480 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
2a490 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f  3LogEst(pIdxInfo
2a4a0 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
2a4b0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
2a4c0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2a4d0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , pNew);.      i
2a4e0 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  f( pNew->u.vtab.
2a4f0 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
2a500 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a510 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64  (pNew->u.vtab.id
2a520 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70  xStr);.        p
2a530 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2a540 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
2a550 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77  }.    }.  }  ..w
2a560 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2a570 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78  exit:.  if( pIdx
2a580 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
2a590 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
2a5a0 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
2a5b0 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
2a5c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
2a5d0 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  xInfo);.  return
2a5e0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
2a5f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2a600 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
2a610 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f  .** Add WhereLoo
2a620 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e  p entries to han
2a630 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54  dle OR terms.  T
2a640 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69  his works for ei
2a650 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f  ther.** btrees o
2a660 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
2a670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a680 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57  whereLoopAddOr(W
2a690 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2a6a0 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61  *pBuilder, Bitma
2a6b0 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68  sk mExtra){.  Wh
2a6c0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
2a6d0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2a6e0 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  fo;.  WhereClaus
2a6f0 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c  e *pWC;.  WhereL
2a700 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65  oop *pNew;.  Whe
2a710 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
2a720 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63  pWCEnd;.  int rc
2a730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a740 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72  int iCur;.  Wher
2a750 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a  eClause tempWC;.
2a760 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
2a770 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20  er sSubBuild;.  
2a780 57 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c  WhereOrSet sSum,
2a790 20 73 43 75 72 2c 20 73 50 72 65 76 3b 0a 20 20   sCur, sPrev;.  
2a7a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2a7b0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
2a7c0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
2a7d0 3e 70 57 43 3b 0a 20 20 69 66 28 20 70 57 49 6e  >pWC;.  if( pWIn
2a7e0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2a7f0 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
2a800 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2a810 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70  OK;.  pWCEnd = p
2a820 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
2a830 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  rm;.  pNew = pBu
2a840 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d  ilder->pNew;.  m
2a850 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20  emset(&sSum, 0, 
2a860 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20  sizeof(sSum));. 
2a870 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
2a880 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70  >pTabList->a + p
2a890 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 66 28  New->iTab;.  if(
2a8a0 20 21 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d   !HasRowid(pItem
2a8b0 2d 3e 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  ->pTab) ) return
2a8c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 43   SQLITE_OK;.  iC
2a8d0 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
2a8e0 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72  sor;..  for(pTer
2a8f0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
2a900 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51  pWCEnd && rc==SQ
2a910 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b  LITE_OK; pTerm++
2a920 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
2a930 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2a940 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26  O_OR)!=0.     &&
2a950 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
2a960 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
2a970 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  pNew->maskSelf)!
2a980 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
2a990 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
2a9a0 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
2a9b0 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
2a9c0 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
2a9d0 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
2a9e0 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
2a9f0 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
2aa00 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
2aa10 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
2aa20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
2aa30 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
2aa40 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69    .      sSubBui
2aa50 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a  ld = *pBuilder;.
2aa60 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2aa70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2aa80 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
2aa90 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20  rSet = &sCur;.. 
2aaa0 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
2aab0 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65  =pOrWC->a; pOrTe
2aac0 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72  rm<pOrWCEnd; pOr
2aad0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
2aae0 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
2aaf0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
2ab00 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
2ab10 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
2ab20 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
2ab30 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
2ab40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2ab50 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
2ab60 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20  or==iCur ){.    
2ab70 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49        tempWC.pWI
2ab80 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
2ab90 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  o;.          tem
2aba0 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43  pWC.pOuter = pWC
2abb0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2abc0 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  WC.op = TK_AND;.
2abd0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2abe0 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
2abf0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
2ac00 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
2ac10 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
2ac20 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20  C = &tempWC;.   
2ac30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ac40 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2ac50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ac60 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69    sCur.n = 0;.#i
2ac70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ac80 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2ac90 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
2aca0 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
2acb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
2acc0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2acd0 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69  Virtual(&sSubBui
2ace0 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  ld, mExtra);.   
2acf0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2ad00 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
2ad10 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2ad20 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53  LoopAddBtree(&sS
2ad30 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29  ubBuild, mExtra)
2ad40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ad50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2ad60 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
2ad70 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
2ad80 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
2ad90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
2ada0 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
2adb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2adc0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
2add0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
2ade0 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
2adf0 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
2ae00 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
2ae10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ae20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
2ae30 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
2ae40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
2ae50 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
2ae60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
2ae70 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
2ae80 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2ae90 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
2aea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
2aeb0 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
2aec0 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
2aed0 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
2aee0 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
2af10 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
2af20 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a  ].rRun, sCur.a[j
2af30 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20  ].rRun),.       
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af50 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
2af60 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
2af70 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
2af80 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
2af90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2afa0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2afb0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
2afc0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
2afd0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2afe0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2aff0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2b000 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
2b010 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
2b020 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
2b030 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2b040 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
2b050 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
2b060 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
2b070 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
2b080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b090 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
2b0a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2b0b0 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
2b0c0 52 75 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Run;.        pNe
2b0d0 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61  w->nOut = sSum.a
2b0e0 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  [i].nOut;.      
2b0f0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2b100 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65   sSum.a[i].prere
2b110 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  q;.        rc = 
2b120 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2b130 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2b140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b150 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b160 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
2b170 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2b180 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
2b190 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
2b1a0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
2b1b0 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2b1c0 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
2b1d0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2b1e0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2b1f0 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Info;.  Bitmask 
2b200 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69  mExtra = 0;.  Bi
2b210 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
2b220 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
2b230 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2b240 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
2b250 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
2b260 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2b270 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
2b280 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
2b290 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54  se->db;.  int nT
2b2a0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
2b2b0 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72  >nLevel;.  int r
2b2c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b2d0 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70   u8 priorJoinTyp
2b2e0 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f  e = 0;.  WhereLo
2b2f0 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  op *pNew;..  /* 
2b300 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61  Loop over the ta
2b310 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2b320 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
2b330 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  ight */.  pNew =
2b340 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2b350 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
2b360 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54  (pNew);.  for(iT
2b370 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
2b380 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54  List->a; iTab<nT
2b390 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20  abList; iTab++, 
2b3a0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e  pItem++){.    pN
2b3b0 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b  ew->iTab = iTab;
2b3c0 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  .    pNew->maskS
2b3d0 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
2b3e0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2b3f0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2b400 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65  ;.    if( ((pIte
2b410 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  m->jointype|prio
2b420 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54  rJoinType) & (JT
2b430 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
2b440 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78  !=0 ){.      mEx
2b450 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  tra = mPrior;.  
2b460 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69    }.    priorJoi
2b470 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a  nType = pItem->j
2b480 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28  ointype;.    if(
2b490 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
2b4a0 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2b4b0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2b4c0 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
2b4d0 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
2b4e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2b4f0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
2b500 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  tree(pBuilder, m
2b510 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
2b520 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b530 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2b540 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
2b550 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
2b560 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50  a);.    }.    mP
2b570 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61  rior |= pNew->ma
2b580 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20  skSelf;.    if( 
2b590 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
2b5a0 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
2b5b0 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43    }.  whereLoopC
2b5c0 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lear(db, pNew);.
2b5d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b5e0 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20  /*.** Examine a 
2b5f0 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68 20  WherePath (with 
2b600 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
2b610 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65 4c  the extra WhereL
2b620 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a  oop of the 5th.*
2b630 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f  * parameters) to
2b640 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70 75   see if it outpu
2b650 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  ts rows in the r
2b660 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20 42  equested ORDER B
2b670 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42  Y.** (or GROUP B
2b680 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75 69  Y) without requi
2b690 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20  ring a separate 
2b6a0 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20  sort operation. 
2b6b0 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a   Return N:.** .*
2b6c0 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72  *   N>0:   N ter
2b6d0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
2b6e0 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
2b6f0 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d  tisfied.**   N==
2b700 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20  0:  No terms of 
2b710 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2b720 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65  use are satisfie
2b730 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e  d.**   N<0:   Un
2b740 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61  known yet how ma
2b750 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45  ny terms of ORDE
2b760 52 20 42 59 20 6d 69 67 68 74 20 62 65 20 73 61  R BY might be sa
2b770 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a  tisfied.   .**.*
2b780 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63  * Note that proc
2b790 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45  essing for WHERE
2b7a0 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45  _GROUPBY and WHE
2b7b0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73  RE_DISTINCTBY is
2b7c0 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63   not as.** stric
2b7d0 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42  t.  With GROUP B
2b7e0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74  Y and DISTINCT t
2b7f0 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d  he only requirem
2b800 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65  ent is that.** e
2b810 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
2b820 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c  ppear immediatel
2b830 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e  y adjacent to on
2b840 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55  e another.  GROU
2b850 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54  P BY.** and DIST
2b860 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75  INCT do not requ
2b870 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65  ire rows to appe
2b880 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63  ar in any partic
2b890 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f  ular order as lo
2b8a0 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65 6c  ng.** as equivel
2b8b0 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f  ent rows are gro
2b8c0 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20  uped together.  
2b8d0 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42  Thus for GROUP B
2b8e0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a  Y and DISTINCT.*
2b8f0 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74  * the pOrderBy t
2b900 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63  erms can be matc
2b910 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72  hed in any order
2b920 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59  .  With ORDER BY
2b930 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72  , the .** pOrder
2b940 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65  By terms must be
2b950 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69   matched in stri
2b960 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74  ct left-to-right
2b970 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2b980 63 20 69 38 20 77 68 65 72 65 50 61 74 68 53 61  c i8 wherePathSa
2b990 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a  tisfiesOrderBy(.
2b9a0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2b9b0 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57  nfo,    /* The W
2b9c0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2b9d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2b9e0 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20  rBy,   /* ORDER 
2b9f0 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  BY or GROUP BY o
2ba00 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  r DISTINCT claus
2ba10 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
2ba20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
2ba30 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
2ba40 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20  rePath to check 
2ba50 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
2ba60 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69  ags,       /* Mi
2ba70 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  ght contain WHER
2ba80 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45  E_GROUPBY or WHE
2ba90 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f  RE_DISTINCTBY */
2baa0 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20  .  u16 nLoop,   
2bab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2bac0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
2bad0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
2bae0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2baf0 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64  pLast,     /* Ad
2bb00 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  d this WhereLoop
2bb10 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70   to the end of p
2bb20 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
2bb30 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76  .  Bitmask *pRev
2bb40 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Mask     /* OUT:
2bb50 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
2bb60 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
2bb70 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
2bb80 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
2bb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2bba0 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
2bbb0 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
2bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bbd0 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
2bbe0 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
2bbf0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2bc00 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
2bc10 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72  der */.  u8 isOr
2bc20 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f  derDistinct;   /
2bc30 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72  * All prior Wher
2bc40 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72  eLoops are order
2bc50 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75  -distinct */.  u
2bc60 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  8 distinctColumn
2bc70 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  s;   /* True if 
2bc80 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49  the loop has UNI
2bc90 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  QUE NOT NULL col
2bca0 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d  umns */.  u8 isM
2bcb0 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2bcc0 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68  /* iColumn match
2bcd0 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
2bce0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2bcf0 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f   */.  u16 nKeyCo
2bd00 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  l;          /* N
2bd10 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c  umber of key col
2bd20 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a  umns in pIndex *
2bd30 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b  /.  u16 nColumn;
2bd40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
2bd50 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64  al number of ord
2bd60 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ered columns in 
2bd70 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  the index */.  u
2bd80 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  16 nOrderBy;    
2bd90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
2bda0 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
2bdb0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2bdc0 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
2bdd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2bde0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20  of WhereLoop in 
2bdf0 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63  pPath being proc
2be00 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  essed */.  int i
2be10 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2be20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2be30 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
2be40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2be50 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
2be60 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c  r current WhereL
2be70 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  oop */.  int iCo
2be80 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
2be90 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  * A column numbe
2bea0 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69  r within table i
2beb0 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  Cur */.  WhereLo
2bec0 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f  op *pLoop = 0; /
2bed0 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c  * Current WhereL
2bee0 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73  oop being proces
2bef0 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54  sed. */.  WhereT
2bf00 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
2bf10 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
2bf20 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2bf30 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
2bf40 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20  pOBExpr;        
2bf50 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
2bf60 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
2bf70 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43  BY clause */.  C
2bf80 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
2bf90 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20       /* COLLATE 
2bfa0 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e  function from an
2bfb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2bfc0 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78   term */.  Index
2bfd0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
2bfe0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73   /* The index as
2bff0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c  sociated with pL
2c000 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
2c010 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
2c020 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
2c030 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2c040 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
2c050 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a  obSat = 0;    /*
2c060 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42   Mask of ORDER B
2c070 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
2c080 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69  d so far */.  Bi
2c090 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20  tmask obDone;   
2c0a0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2c0b0 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
2c0c0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  s */.  Bitmask o
2c0d0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2c0e0 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c  ;  /* Mask of al
2c0f0 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c  l well-ordered l
2c100 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  oops */.  Bitmas
2c110 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20  k ready;        
2c120 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2c130 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
2c140 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  /*.  ** We sa
2c150 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
2c160 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20  is "one-row" if 
2c170 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20  it generates no 
2c180 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20  more than one.  
2c190 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  ** row of output
2c1a0 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69  .  A WhereLoop i
2c1b0 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c  s one-row if all
2c1c0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2c1d0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
2c1e0 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20    (a) All index 
2c1f0 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69  columns match wi
2c200 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  th WHERE_COLUMN_
2c210 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68  EQ..  **  (b) Th
2c220 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75  e index is uniqu
2c230 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65  e.  ** Any Where
2c240 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45  Loop with an WHE
2c250 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e  RE_COLUMN_EQ con
2c260 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72  straint on the r
2c270 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e  owid is one-row.
2c280 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d  .  ** Every one-
2c290 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  row WhereLoop wi
2c2a0 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52  ll have the WHER
2c2b0 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74  E_ONEROW bit set
2c2c0 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a   in wsFlags..  *
2c2d0 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
2c2e0 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
2c2f0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20  order-distinct" 
2c300 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  if the set of co
2c310 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  lumns from.  ** 
2c320 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  that WhereLoop t
2c330 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f  hat are in the O
2c340 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
2c350 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  re different for
2c360 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20   every.  ** row 
2c370 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2c380 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  .  Every one-row
2c390 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75   WhereLoop is au
2c3a0 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
2c3b0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2c3c0 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74     A WhereLoop t
2c3d0 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d  hat has no colum
2c3e0 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ns in the ORDER 
2c3f0 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69  BY clause.  ** i
2c400 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74  s not order-dist
2c410 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65  inct. To be orde
2c420 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f  r-distinct is no
2c430 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65  t quite the same
2c440 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55   as being.  ** U
2c450 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e  NIQUE since a UN
2c460 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69  IQUE column or i
2c470 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75  ndex can have mu
2c480 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74  ltiple rows that
2c490 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20   .  ** are NULL 
2c4a0 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  and NULL values 
2c4b0 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  are equivalent f
2c4c0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
2c4d0 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  f order-distinct
2c4e0 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64  ..  ** To be ord
2c4f0 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65  er-distinct, the
2c500 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65   columns must be
2c510 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
2c520 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  NULL..  **.  ** 
2c530 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20  The rowid for a 
2c540 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  table is always 
2c550 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
2c560 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20  ULL so whenever 
2c570 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61  the.  ** rowid a
2c580 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52  ppears in the OR
2c590 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2c5a0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2c5b0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20   WhereLoop is.  
2c5c0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2c5d0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
2c5e0 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  .  */..  assert(
2c5f0 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
2c600 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74  .  /* Sortabilit
2c610 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62  y of virtual tab
2c620 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65  les is determine
2c630 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
2c640 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20  dex method.  ** 
2c650 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
2c660 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20  able itself */. 
2c670 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c   if( pLast->wsFl
2c680 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2c690 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
2c6a0 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e  testcase( nLoop>
2c6b0 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77 68  0 );  /* True wh
2c6c0 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61  en outer loops a
2c6d0 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d  re one-row and m
2c6e0 61 74 63 68 20 0a 20 20 20 20 20 20 20 20 20 20  atch .          
2c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c700 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 74  ** no ORDER BY t
2c710 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  erms */.    retu
2c720 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62  rn pLast->u.vtab
2c730 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a  .isOrdered;.  }.
2c740 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f    if( nLoop && O
2c750 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
2c760 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
2c770 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29  rderByIdxJoin) )
2c780 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f   return 0;..  nO
2c790 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
2c7a0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74  y->nExpr;.  test
2c7b0 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d  case( nOrderBy==
2c7c0 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  BMS-1 );.  if( n
2c7d0 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20  OrderBy>BMS-1 ) 
2c7e0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
2c7f0 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76  nnot optimize ov
2c800 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52  erly large ORDER
2c810 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65   BYs */.  isOrde
2c820 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
2c830 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49   obDone = MASKBI
2c840 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20  T(nOrderBy)-1;. 
2c850 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2c860 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20  sk = 0;.  ready 
2c870 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  = 0;.  for(iLoop
2c880 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69  =0; isOrderDisti
2c890 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44  nct && obSat<obD
2c8a0 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c  one && iLoop<=nL
2c8b0 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
2c8c0 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29     if( iLoop>0 )
2c8d0 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d   ready |= pLoop-
2c8e0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70  >maskSelf;.    p
2c8f0 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f  Loop = iLoop<nLo
2c900 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  op ? pPath->aLoo
2c910 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74  p[iLoop] : pLast
2c920 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
2c930 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c940 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2c950 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43  LE)==0 );.    iC
2c960 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
2c970 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
2c980 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a  iTab].iCursor;..
2c990 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
2c9a0 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72  any ORDER BY ter
2c9b0 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f  m X that is a co
2c9c0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
2c9d0 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
2c9e0 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72  current loop for
2c9f0 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20   which there is 
2ca00 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
2ca10 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  E.    ** clause 
2ca20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53  of the form X IS
2ca30 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61   NULL or X=? tha
2ca40 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  t reference only
2ca50 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f   outer.    ** lo
2ca60 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ops..    */.    
2ca70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
2ca80 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
2ca90 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
2caa0 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
2cab0 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70  ue;.      pOBExp
2cac0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
2cad0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
2cae0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2caf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
2cb00 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
2cb10 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
2cb20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2cb30 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
2cb40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2cb50 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
2cb60 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  m(&pWInfo->sWC, 
2cb70 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69  iCur, pOBExpr->i
2cb80 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
2cba0 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  ready, WO_EQ|WO_
2cbb0 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20  ISNULL, 0);.    
2cbc0 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
2cbd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2cbe0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
2cbf0 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30  erator&WO_EQ)!=0
2cc00 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
2cc10 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
2cc20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2cc30 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  1, *z2;.        
2cc40 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2cc50 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
2cc60 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
2cc70 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2cc80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2cc90 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
2cca0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2ccb0 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c        z1 = pColl
2ccc0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
2ccd0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2cce0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2ccf0 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72  fo->pParse, pTer
2cd00 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2cd10 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2cd20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2cd30 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
2cd40 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  2 = pColl->zName
2cd50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2cd60 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
2cd70 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e   z2)!=0 ) contin
2cd80 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
2cd90 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
2cda0 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  IT(i);.    }..  
2cdb0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
2cdc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2cdd0 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EROW)==0 ){.    
2cde0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2cdf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
2ce00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
2ce10 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
2ce20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nKeyCol = 0;.   
2ce30 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31       nColumn = 1
2ce40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2ce50 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  ( (pIndex = pLoo
2ce60 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2ce70 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d  x)==0 || pIndex-
2ce80 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20  >bUnordered ){. 
2ce90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
2cea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ceb0 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
2cec0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
2ced0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
2cee0 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   = pIndex->nColu
2cef0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mn;.        asse
2cf00 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65  rt( nColumn==nKe
2cf10 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f  yCol+1 || !HasRo
2cf20 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62  wid(pIndex->pTab
2cf30 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  le) );.        a
2cf40 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61  ssert( pIndex->a
2cf50 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d  iColumn[nColumn-
2cf60 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48 61 73  1]==(-1) || !Has
2cf70 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
2cf80 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
2cf90 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2cfa0 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
2cfb0 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20  r!=OE_None;.    
2cfc0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f    }..      /* Lo
2cfd0 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
2cfe0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
2cff0 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74  dex and deal wit
2d000 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20  h the ones.     
2d010 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
2d020 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
2d030 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20  == or IN..      
2d040 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72  */.      rev = r
2d050 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  evSet = 0;.     
2d060 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2d070 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
2d080 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20  j=0; j<nColumn; 
2d090 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38  j++){.        u8
2d0a0 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75   bOnce;   /* Tru
2d0b0 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44  e to run the ORD
2d0c0 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f  ER BY search loo
2d0d0 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  p */..        /*
2d0e0 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e   Skip over == an
2d0f0 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20  d IS NULL terms 
2d100 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  */.        if( j
2d110 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
2d120 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
2d130 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2d140 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20  Skip==0.        
2d150 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d   && ((i = pLoop-
2d160 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65  >aLTerm[j]->eOpe
2d170 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c  rator) & (WO_EQ|
2d180 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20  WO_ISNULL))!=0. 
2d190 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d1a0 20 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49      if( i & WO_I
2d1b0 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
2d1c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2d1d0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
2d1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
2d1f0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2d200 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
2d210 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2d220 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a  e;  .        }..
2d230 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74          /* Get t
2d240 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
2d250 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69   in the table (i
2d260 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74  Column) and sort
2d270 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
2d280 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74  * (revIdx) for t
2d290 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he j-th column o
2d2a0 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  f the index..   
2d2b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d2c0 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
2d2d0 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
2d2e0 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
2d2f0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[j];.         
2d300 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78   revIdx = pIndex
2d310 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
2d320 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2d330 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
2d340 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20  pTable->iPKey ) 
2d350 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2d360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d370 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
2d380 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72   -1;.          r
2d390 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  evIdx = 0;.     
2d3a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2d3b0 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65   An unconstraine
2d3c0 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69  d column that mi
2d3d0 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e  ght be NULL mean
2d3e0 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20  s that this.    
2d3f0 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70      ** WhereLoop
2d400 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64   is not well-ord
2d410 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ered.        */.
2d420 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
2d430 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20  derDistinct.    
2d440 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e       && iColumn>
2d450 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a  =0.         && j
2d460 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
2d470 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
2d480 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
2d490 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e  >aCol[iColumn].n
2d4a0 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20  otNull==0.      
2d4b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2d4c0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2d4d0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2d4e0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74         /* Find t
2d4f0 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
2d500 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
2d510 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f  s to the j-th co
2d520 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lumn.        ** 
2d530 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
2d540 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52   mark that ORDER
2d550 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20   BY term off .  
2d560 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d570 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20   bOnce = 1;.    
2d580 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b      isMatch = 0;
2d590 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2d5a0 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72  ; bOnce && i<nOr
2d5b0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2d5c0 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
2d5d0 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
2d5e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2d5f0 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
2d600 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2d610 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
2d620 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2d630 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d640 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d650 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
2d660 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d670 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2d680 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2d690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2d6a0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28   (wctrlFlags & (
2d6b0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48  WHERE_GROUPBY|WH
2d6c0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29  ERE_DISTINCTBY))
2d6d0 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b  ==0 ) bOnce = 0;
2d6e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d6f0 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2d700 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2d710 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d720 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
2d730 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
2d740 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d750 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
2d760 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  !=iColumn ) cont
2d770 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2d780 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
2d790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
2d7a0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2d7b0 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2d7c0 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2d7d0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2d7e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d7f0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2d800 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2d810 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d820 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2d830 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  Coll->zName, pIn
2d840 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21  dex->azColl[j])!
2d850 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2d860 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d870 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31       isMatch = 1
2d880 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2d890 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2d8a0 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
2d8b0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
2d8c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d8d0 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20  GROUPBY)==0 ){. 
2d8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
2d8f0 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
2d900 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
2d910 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
2d920 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
2d930 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
2d940 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
2d950 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
2d960 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
2d970 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29      if( revSet )
2d980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2d990 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
2d9a0 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
2d9b0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d  .sortOrder ) isM
2d9c0 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
2d9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d9e0 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
2d9f0 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
2da00 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
2da10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2da20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
2da30 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
2da40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2da50 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
2da60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2da70 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
2da80 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
2da90 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
2daa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
2dab0 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63  estcase( distinc
2dac0 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20  tColumns==0 );. 
2dad0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
2dae0 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a  nctColumns = 1;.
2daf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2db00 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
2db10 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
2db20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2db30 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20      /* No match 
2db40 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
2db50 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a     if( j==0 || j
2db60 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  <nKeyCol ){.    
2db70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2db80 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2db90 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
2dba0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2dbb0 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2dbc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
2dbd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2dbe0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c        } /* end L
2dbf0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
2dc00 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ex columns */.  
2dc10 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74      if( distinct
2dc20 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20  Columns ){.     
2dc30 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
2dc40 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20  rderDistinct==0 
2dc50 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
2dc60 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
2dc70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
2dc80 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d   end-if not one-
2dc90 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  row */..    /* M
2dca0 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65  ark off any othe
2dcb0 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  r ORDER BY terms
2dcc0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
2dcd0 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28  pLoop */.    if(
2dce0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2dcf0 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44   ){.      orderD
2dd00 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70  istinctMask |= p
2dd10 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
2dd20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2dd30 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
2dd40 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
2dd50 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
2dd60 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  k mTerm;.       
2dd70 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
2dd80 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
2dd90 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  ue;.        p = 
2dda0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2ddb0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54  Expr;.        mT
2ddc0 65 72 6d 20 3d 20 65 78 70 72 54 61 62 6c 65 55  erm = exprTableU
2ddd0 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
2dde0 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20  askSet,p);.     
2ddf0 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20     if( mTerm==0 
2de00 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
2de10 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63  sConstant(p) ) c
2de20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2de30 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64   if( (mTerm&~ord
2de40 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
2de50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2de60 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2de70 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
2de80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2de90 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
2dea0 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
2deb0 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
2dec0 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
2ded0 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
2dee0 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
2def0 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64   return (i8)nOrd
2df00 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f  erBy;.  if( !isO
2df10 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
2df20 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72      for(i=nOrder
2df30 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  By-1; i>0; i--){
2df40 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2df50 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20   = MASKBIT(i) - 
2df60 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  1;.      if( (ob
2df70 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75  Sat&m)==m ) retu
2df80 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn i;.    }.    
2df90 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2dfa0 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f  return -1;.}.../
2dfb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
2dfc0 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
2dfd0 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73  s set in the mas
2dfe0 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  k passed to sqli
2dff0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
2e000 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20  .** the planner 
2e010 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
2e020 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65   specified pOrde
2e030 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75  rBy list is actu
2e040 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20  ally a GROUP.** 
2e050 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20  BY clause - and 
2e060 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61  so any order tha
2e070 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73  t groups rows as
2e080 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66   required satisf
2e090 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  ies the.** reque
2e0a0 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  st..**.** Normal
2e0b0 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ly, in this case
2e0c0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
2e0d0 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c  ble for the call
2e0e0 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  er to determine.
2e0f0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
2e100 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72  t the rows are r
2e110 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69  eally being deli
2e120 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20  vered in sorted 
2e130 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73  order, or.** jus
2e140 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  t in some other 
2e150 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69  order that provi
2e160 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64  des the required
2e170 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76   grouping. Howev
2e180 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  er,.** if the WH
2e190 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
2e1a0 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73  flag is also pas
2e1b0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
2e1c0 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e  ereBegin(), then
2e1d0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
2e1e0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
2e1f0 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
2e200 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74  WhereInfo object
2e210 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  . It returns.** 
2e220 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73  true if the rows
2e230 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20   really will be 
2e240 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70  sorted in the sp
2e250 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f  ecified order, o
2e260 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72  r false.** other
2e270 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  wise..**.** For 
2e280 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
2e290 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
2e2a0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
2e2b0 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  (x, Y);.**.** th
2e2c0 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  en.**.**   SELEC
2e2d0 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
2e2e0 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42  P BY x,y ORDER B
2e2f0 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f  Y x,y;   -- IsSo
2e300 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53  rted()==1.**   S
2e310 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2e320 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44  GROUP BY y,x ORD
2e330 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20  ER BY y,x;   -- 
2e340 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f  IsSorted()==0.*/
2e350 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
2e360 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49  eIsSorted(WhereI
2e370 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
2e380 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2e390 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2e3a0 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
2e3b0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2e3c0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2e3d0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29  RE_SORTBYGROUP )
2e3e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
2e3f0 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69  o->sorted;.}..#i
2e400 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2e410 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
2e420 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
2e430 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
2e440 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
2e450 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
2e460 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
2e470 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
2e480 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
2e490 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
2e4a0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2e4b0 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
2e4c0 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
2e4d0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
2e4e0 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
2e4f0 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
2e500 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
2e510 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
2e520 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
2e530 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
2e540 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
2e550 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2e560 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
2e570 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
2e580 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
2e590 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
2e5a0 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
2e5b0 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
2e5c0 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
2e5d0 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
2e5e0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
2e5f0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
2e600 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
2e610 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
2e620 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2e630 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
2e640 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
2e650 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
2e660 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
2e670 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
2e680 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
2e690 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
2e6a0 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
2e6b0 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
2e6c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2e6d0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
2e6e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
2e6f0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2e700 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
2e710 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
2e720 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
2e730 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
2e740 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
2e750 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
2e760 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
2e770 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2e780 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
2e790 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
2e7a0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
2e7b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e7c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
2e7d0 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
2e7e0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
2e7f0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
2e800 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
2e810 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
2e820 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
2e830 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2e840 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2e850 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
2e860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2e870 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
2e880 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
2e890 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
2e8a0 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
2e8b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2e8c0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
2e8d0 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
2e8e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2e8f0 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
2e900 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  eplace */.  int 
2e910 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
2e920 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e930 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  of ORDER BY clau
2e940 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f  se terms */.  Lo
2e950 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20  gEst rCost;     
2e960 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
2e970 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 4c  of a path */.  L
2e980 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  ogEst nOut;     
2e990 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e9a0 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f  er of outputs */
2e9b0 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74  .  LogEst mxCost
2e9c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2e9d0 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
2e9e0 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
2e9f0 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 4f 75 74  /.  LogEst mxOut
2ea00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
2ea10 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20 76 61   Maximum nOut va
2ea20 6c 75 65 20 6f 6e 20 74 68 65 20 73 65 74 20 6f  lue on the set o
2ea30 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 6e 74  f paths */.  int
2ea40 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
2ea50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ea60 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
2ea70 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
2ea80 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
2ea90 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
2eaa0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
2eab0 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
2eac0 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
2ead0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
2eae0 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
2eaf0 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
2eb00 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
2eb10 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
2eb20 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
2eb30 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
2eb40 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
2eb50 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
2eb60 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
2eb70 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
2eb80 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
2eb90 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
2eba0 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
2ebb0 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
2ebc0 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
2ebd0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
2ebe0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2ebf0 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
2ec00 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
2ec10 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
2ec20 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
2ec30 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61   memory */.  cha
2ec40 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
2ec50 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
2ec60 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
2ec70 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
2ec80 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
2ec90 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
2eca0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2ecb0 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e  ;.  nLoop = pWIn
2ecc0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a  fo->nLevel;.  /*
2ecd0 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d   TUNING: For sim
2ece0 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c  ple queries, onl
2ecf0 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20  y the best path 
2ed00 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a  is tracked..  **
2ed10 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73   For 2-way joins
2ed20 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74  , the 5 best pat
2ed30 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e  hs are followed.
2ed40 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20  .  ** For joins 
2ed50 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62  of 3 or more tab
2ed60 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31  les, track the 1
2ed70 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a  0 best paths */.
2ed80 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c    mxChoice = (nL
2ed90 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e  oop==1) ? 1 : (n
2eda0 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30  Loop==2 ? 5 : 10
2edb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  );.  assert( nLo
2edc0 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
2edd0 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2ede0 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
2edf0 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73  , ("---- begin s
2ee00 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f  olver\n"));..  /
2ee10 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2ee20 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
2ee30 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46 72 6f  for aTo and aFro
2ee40 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a  m */.  ii = (siz
2ee50 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73  eof(WherePath)+s
2ee60 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
2ee70 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63  )*nLoop)*mxChoic
2ee80 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20 3d 20  e*2;.  pSpace = 
2ee90 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2eea0 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20 69 66  aw(db, ii);.  if
2eeb0 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  ( pSpace==0 ) re
2eec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2eed0 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72  M;.  aTo = (Wher
2eee0 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20  ePath*)pSpace;. 
2eef0 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43   aFrom = aTo+mxC
2ef00 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28  hoice;.  memset(
2ef10 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  aFrom, 0, sizeof
2ef20 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70  (aFrom[0]));.  p
2ef30 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a  X = (WhereLoop**
2ef40 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65  )(aFrom+mxChoice
2ef50 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68  );.  for(ii=mxCh
2ef60 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54  oice*2, pFrom=aT
2ef70 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70  o; ii>0; ii--, p
2ef80 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c  From++, pX += nL
2ef90 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  oop){.    pFrom-
2efa0 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d  >aLoop = pX;.  }
2efb0 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
2efc0 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
2efd0 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
2efe0 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
2eff0 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
2f000 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
2f010 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
2f020 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
2f030 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20 20 49   go above 25.  I
2f040 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
2f050 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
2f060 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
2f070 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
2f080 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
2f090 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 25.  ** rows, 
2f0a0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
2f0b0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
2f0c0 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
2f0d0 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
2f0e0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
2f0f0 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74 28 20  , 46);  assert( 
2f100 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  46==sqlite3LogEs
2f110 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f 6d  t(25) );.  nFrom
2f120 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65 63   = 1;..  /* Prec
2f130 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73 74 20  ompute the cost 
2f140 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 66  of sorting the f
2f150 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65 74 2c  inal result set,
2f160 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 0a 20   if the caller. 
2f170 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 57 68   ** to sqlite3Wh
2f180 65 72 65 42 65 67 69 6e 28 29 20 77 61 73 20 63  ereBegin() was c
2f190 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 73  oncerned about s
2f1a0 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 69 66 28 20  orting */.  if( 
2f1b0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2f1c0 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d  ==0 || nRowEst==
2f1d0 30 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30  0 ){.    aFrom[0
2f1e0 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b  ].isOrdered = 0;
2f1f0 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
2f200 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
2f210 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
2f220 65 64 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 4f 72  ed = -1;.    nOr
2f230 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  derBy = pWInfo->
2f240 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
2f250 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
2f260 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20  te successively 
2f270 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68  longer WherePath
2f280 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76  s using the prev
2f290 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a  ious generation.
2f2a0 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74    ** of WherePat
2f2b0 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20  hs as the basis 
2f2c0 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b  for the next.  K
2f2d0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
2f2e0 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62   mxChoice.  ** b
2f2f0 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63  est paths at eac
2f300 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  h generation */.
2f310 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
2f320 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
2f330 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20  p++){.    nTo = 
2f340 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  0;.    for(ii=0,
2f350 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69   pFrom=aFrom; ii
2f360 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46  <nFrom; ii++, pF
2f370 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  rom++){.      fo
2f380 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d  r(pWLoop=pWInfo-
2f390 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b  >pLoops; pWLoop;
2f3a0 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e   pWLoop=pWLoop->
2f3b0 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20  pNextLoop){.    
2f3c0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b      Bitmask mask
2f3d0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 42 69 74  New;.        Bit
2f3e0 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30  mask revMask = 0
2f3f0 3b 0a 20 20 20 20 20 20 20 20 69 38 20 69 73 4f  ;.        i8 isO
2f400 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
2f410 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
2f420 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
2f430 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d  prereq & ~pFrom-
2f440 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
2f450 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f460 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d    if( (pWLoop->m
2f470 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d  askSelf & pFrom-
2f480 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
2f490 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2f4a0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2f4b0 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20  nt, pWLoop is a 
2f4c0 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
2f4d0 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a  the next loop. .
2f4e0 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75          ** Compu
2f4f0 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20  te its cost */. 
2f500 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73         rCost = s
2f510 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2f520 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70  pWLoop->rSetup,p
2f530 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46  WLoop->rRun + pF
2f540 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20  rom->nRow);.    
2f550 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
2f560 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f  te3LogEstAdd(rCo
2f570 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74  st, pFrom->rCost
2f580 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20  );.        nOut 
2f590 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20  = pFrom->nRow + 
2f5a0 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20  pWLoop->nOut;.  
2f5b0 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20        maskNew = 
2f5c0 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20  pFrom->maskLoop 
2f5d0 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  | pWLoop->maskSe
2f5e0 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  lf;.        if( 
2f5f0 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20  isOrdered<0 ){. 
2f600 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2f610 65 64 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  ed = wherePathSa
2f620 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
2f630 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  WInfo,.         
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
2f650 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
2f660 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77  pFrom, pWInfo->w
2f670 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20  ctrlFlags,.     
2f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f690 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c    iLoop, pWLoop,
2f6a0 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20   &revMask);.    
2f6b0 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
2f6c0 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65  red>=0 && isOrde
2f6d0 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a  red<nOrderBy ){.
2f6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f6f0 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64  UNING: Estimated
2f700 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
2f710 20 69 73 20 4e 2a 6c 6f 67 28 4e 29 2e 0a 20 20   is N*log(N)..  
2f720 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
2f730 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61  the order-by cla
2f740 75 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20  use has X terms 
2f750 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73  but only the las
2f760 74 20 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20  t Y terms.      
2f770 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6f 75 74        ** are out
2f780 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20   of order, then 
2f790 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69  block-sorting wi
2f7a0 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 73 6f  ll reduce the so
2f7b0 72 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rting.          
2f7c0 20 20 2a 2a 20 63 6f 73 74 20 74 6f 20 4e 2a 6c    ** cost to N*l
2f7d0 6f 67 28 4e 29 2a 6c 6f 67 28 59 2f 58 29 2e 20  og(N)*log(Y/X). 
2f7e0 20 54 68 65 20 6c 6f 67 28 59 2f 58 29 20 74 65   The log(Y/X) te
2f7f0 72 6d 20 69 73 20 63 6f 6d 70 75 74 65 64 0a 20  rm is computed. 
2f800 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79             ** by
2f810 20 72 53 63 61 6c 65 2e 0a 20 20 20 20 20 20 20   rScale..       
2f820 20 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 53 68       ** TODO: Sh
2f830 6f 75 6c 64 20 74 68 65 20 73 6f 72 74 69 6e 67  ould the sorting
2f840 20 63 6f 73 74 20 67 65 74 20 61 20 73 6d 61 6c   cost get a smal
2f850 6c 20 6d 75 6c 74 69 70 6c 69 65 72 20 74 6f 20  l multiplier to 
2f860 68 65 6c 70 0a 20 20 20 20 20 20 20 20 20 20 20  help.           
2f870 20 2a 2a 20 64 69 73 63 6f 75 72 61 67 65 20 74   ** discourage t
2f880 68 65 20 75 73 65 20 6f 66 20 73 6f 72 74 69 6e  he use of sortin
2f890 67 20 61 6e 64 20 65 6e 63 6f 75 72 61 67 65 20  g and encourage 
2f8a0 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78  the use of index
2f8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2f8c0 73 63 61 6e 73 20 69 6e 73 74 65 61 64 3f 0a 20  scans instead?. 
2f8d0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2f8e0 20 20 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74            LogEst
2f8f0 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f   rScale, rSortCo
2f900 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
2f910 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
2f920 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65  >0 && 66==sqlite
2f930 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a  3LogEst(100) );.
2f940 20 20 20 20 20 20 20 20 20 20 20 20 72 53 63 61              rSca
2f950 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  le = sqlite3LogE
2f960 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f  st((nOrderBy-isO
2f970 72 64 65 72 65 64 29 2a 31 30 30 2f 6e 4f 72 64  rdered)*100/nOrd
2f980 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 20 20  erBy) - 66;.    
2f990 20 20 20 20 20 20 20 20 72 53 6f 72 74 43 6f 73          rSortCos
2f9a0 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73  t = nRowEst + es
2f9b0 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29 20 2b 20  tLog(nRowEst) + 
2f9c0 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20  rScale + 16;..  
2f9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
2f9e0 49 4e 47 3a 20 54 68 65 20 63 6f 73 74 20 6f 66  ING: The cost of
2f9f0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44 49   implementing DI
2fa00 53 54 49 4e 43 54 20 75 73 69 6e 67 20 61 20 42  STINCT using a B
2fa10 2d 54 52 45 45 20 69 73 0a 20 20 20 20 20 20 20  -TREE is.       
2fa20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 4e 2a 6c       ** also N*l
2fa30 6f 67 28 4e 29 20 62 75 74 20 69 74 20 68 61 73  og(N) but it has
2fa40 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74 61   a larger consta
2fa50 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f 6e  nt of proportion
2fa60 61 6c 69 74 79 2e 0a 20 20 20 20 20 20 20 20 20  ality..         
2fa70 20 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62     ** Multiply b
2fa80 79 20 33 2e 30 2e 20 2a 2f 0a 20 20 20 20 20 20  y 3.0. */.      
2fa90 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2faa0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2fab0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
2fac0 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CT ){.          
2fad0 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d      rSortCost +=
2fae0 20 31 36 3b 0a 20 20 20 20 20 20 20 20 20 20 20   16;.           
2faf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 57   }.            W
2fb00 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
2fb10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fb20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
2fb30 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e  =%-3d (%d/%d) in
2fb40 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64  creases cost %3d
2fb50 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20   to %-3d\n",.   
2fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 72 53 6f               rSo
2fb70 72 74 43 6f 73 74 2c 20 28 6e 4f 72 64 65 72 42  rtCost, (nOrderB
2fb80 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
2fb90 72 64 65 72 42 79 2c 20 72 43 6f 73 74 2c 0a 20  rderBy, rCost,. 
2fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2fbb0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2fbc0 72 43 6f 73 74 2c 72 53 6f 72 74 43 6f 73 74 29  rCost,rSortCost)
2fbd0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2fbe0 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
2fbf0 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74 2c 20  ogEstAdd(rCost, 
2fc00 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20 20  rSortCost);.    
2fc10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fc20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2fc30 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d   revMask = pFrom
2fc40 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
2fc50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
2fc60 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2fc70 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
2fc80 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78   added to the mx
2fc90 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66  Choice best so f
2fca0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  ar */.        fo
2fcb0 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
2fcc0 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
2fcd0 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
2fce0 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
2fcf0 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20  op==maskNew.    
2fd00 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d         && ((pTo-
2fd10 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
2fd20 65 72 65 64 29 26 38 30 29 3d 3d 30 0a 20 20 20  ered)&80)==0.   
2fd30 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54 6f          && ((pTo
2fd40 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26  ->rCost<=rCost &
2fd50 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75  & pTo->nRow<=nOu
2fd60 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  t) ||.          
2fd70 20 20 20 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73        (pTo->rCos
2fd80 74 3e 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d  t>=rCost && pTo-
2fd90 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20 20  >nRow>=nOut)).  
2fda0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2fdb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2fdc0 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20   jj==nTo-1 );.  
2fdd0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2fde0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fdf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2fe00 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20  f( jj>=nTo ){.  
2fe10 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
2fe20 3d 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f  =mxChoice && rCo
2fe30 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69  st>=mxCost ){.#i
2fe40 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
2fe50 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
2fe60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
2fe70 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2fe80 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
2fe90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2fea0 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69  DebugPrintf("Ski
2feb0 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
2fec0 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
2fed0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2fee0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
2fef0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
2ff00 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
2ff10 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
2ff20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
2ff30 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64  d>=0 ? isOrdered
2ff40 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
2ff50 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
2ff60 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  f.            co
2ff70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ff80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
2ff90 20 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20   Add a new Path 
2ffa0 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74  to the aTo[] set
2ffb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2ffc0 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29  ( nTo<mxChoice )
2ffd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2ffe0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   Increase the si
2fff0 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65  ze of the aTo se
30000 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  t by one */.    
30010 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f          jj = nTo
30020 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
30030 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
30040 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70   /* New path rep
30050 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20  laces the prior 
30060 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f  worst to keep co
30070 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69  unt below mxChoi
30080 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
30090 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20    jj = mxI;.    
300a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
300b0 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d    pTo = &aTo[jj]
300c0 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
300d0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
300e0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
300f0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
30100 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
30110 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30120 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77  DebugPrintf("New
30130 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64      %s cost=%-3d
30140 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
30150 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30160 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
30170 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
30180 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
30190 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
301a0 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
301b0 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
301c0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
301d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
301e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
301f0 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
30200 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26 20 70 54  ost<=rCost && pT
30210 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 20 29 7b  o->nRow<=nOut ){
30220 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
30230 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
30240 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
30250 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
30260 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
30270 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
30280 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
30290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302a0 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
302b0 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
302c0 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
302d0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
302e0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
302f0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
30300 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
30310 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
30320 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
30330 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
30340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
30350 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30360 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74  f("   vs %s cost
30370 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25  =%-3d,%d order=%
30380 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
30390 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
303a0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
303b0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
303c0 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
303d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303e0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
303f0 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
30400 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
30410 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
30420 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
30430 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e   testcase( pTo->
30440 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a  rCost==rCost );.
30450 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
30460 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
30470 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
30480 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
30490 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20  ==rCost+1 );.   
304a0 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20         /* A new 
304b0 61 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72 65  and better score
304c0 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c   for a previousl
304d0 79 20 63 72 65 61 74 65 64 20 65 71 75 69 76 61  y created equiva
304e0 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66  lent path */.#if
304f0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
30500 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
30510 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
30520 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
30530 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
30540 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
30550 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
30560 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20          "Update 
30570 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
30580 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
30590 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
305a0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
305b0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
305c0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
305e0 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
305f0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
30600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
30610 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30620 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74  f("  was %s cost
30630 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
30640 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
30650 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
30660 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
30670 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
30680 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
30690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
306a0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  o->isOrdered>=0 
306b0 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ? pTo->isOrdered
306c0 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20  +'0' : '?');.   
306d0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
306e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
306f0 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61    /* pWLoop is a
30700 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74   winner.  Add it
30710 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
30720 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
30730 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c        pTo->maskL
30740 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  oop = pFrom->mas
30750 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
30760 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
30770 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d    pTo->revLoop =
30780 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20   revMask;.      
30790 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f    pTo->nRow = nO
307a0 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  ut;.        pTo-
307b0 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a  >rCost = rCost;.
307c0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
307d0 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72  rdered = isOrder
307e0 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ed;.        memc
307f0 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70  py(pTo->aLoop, p
30800 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a  From->aLoop, siz
30810 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
30820 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
30830 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  pTo->aLoop[iLoop
30840 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  ] = pWLoop;.    
30850 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43      if( nTo>=mxC
30860 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20  hoice ){.       
30870 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20     mxI = 0;.    
30880 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
30890 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
308a0 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d 20 61         mxOut = a
308b0 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20  To[0].nRow;.    
308c0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20        for(jj=1, 
308d0 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c  pTo=&aTo[1]; jj<
308e0 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20  mxChoice; jj++, 
308f0 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
30900 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
30910 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 70 54  st>mxCost || (pT
30920 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74  o->rCost==mxCost
30930 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3e 6d 78   && pTo->nRow>mx
30940 4f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Out) ){.        
30950 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70        mxCost = p
30960 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20  To->rCost;.     
30970 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20 3d           mxOut =
30980 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20   pTo->nRow;.    
30990 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
309a0 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  jj;.            
309b0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
309c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
309d0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
309e0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
309f0 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20    /* >=2 */.    
30a00 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
30a10 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20  Trace>=2 ){.    
30a20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
30a30 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72  intf("---- after
30a40 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e   round %d ----\n
30a50 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  ", iLoop);.     
30a60 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61   for(ii=0, pTo=a
30a70 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b  To; ii<nTo; ii++
30a80 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
30a90 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
30aa0 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25  intf(" %s cost=%
30ab0 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72  -3d nrow=%-3d or
30ac0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
30ad0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
30ae0 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
30af0 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
30b00 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
30b10 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
30b20 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e  ered>=0 ? (pTo->
30b30 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a  isOrdered+'0') :
30b40 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
30b50 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
30b60 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>0 ){.         
30b70 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
30b80 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78  ntf(" rev=0x%llx
30b90 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f  \n", pTo->revLoo
30ba0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
30bb0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
30bc0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
30bd0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  "\n");.        }
30be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
30bf0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77  endif..    /* Sw
30c00 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20  ap the roles of 
30c10 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f  aFrom and aTo fo
30c20 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72  r the next gener
30c30 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72  ation */.    pFr
30c40 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54  om = aTo;.    aT
30c50 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61  o = aFrom;.    a
30c60 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20  From = pFrom;.  
30c70 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20    nFrom = nTo;. 
30c80 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d   }..  if( nFrom=
30c90 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
30ca0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
30cb0 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75  , "no query solu
30cc0 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  tion");.    sqli
30cd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
30ce0 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72  pace);.    retur
30cf0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
30d00 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64    }.  .  /* Find
30d10 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
30d20 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69   path.  pFrom wi
30d30 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
30d40 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68  ing to that path
30d50 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46   */.  pFrom = aF
30d60 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b  rom;.  for(ii=1;
30d70 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29   ii<nFrom; ii++)
30d80 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  {.    if( pFrom-
30d90 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d  >rCost>aFrom[ii]
30da0 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d  .rCost ) pFrom =
30db0 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d   &aFrom[ii];.  }
30dc0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
30dd0 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70  o->nLevel==nLoop
30de0 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   );.  /* Load th
30df0 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
30e00 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a  th into pWInfo *
30e10 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
30e20 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
30e30 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  oop++){.    Wher
30e40 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
30e50 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f   pWInfo->a + iLo
30e60 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  op;.    pLevel->
30e70 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20  pWLoop = pWLoop 
30e80 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69  = pFrom->aLoop[i
30e90 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65  Loop];.    pLeve
30ea0 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f  l->iFrom = pWLoo
30eb0 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65  p->iTab;.    pLe
30ec0 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
30ed0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
30ee0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
30ef0 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20  ].iCursor;.  }. 
30f00 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
30f10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
30f20 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
30f30 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
30f40 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
30f50 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
30f60 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f  ==0.   && pWInfo
30f70 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
30f80 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
30f90 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20  .   && nRowEst. 
30fa0 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
30fb0 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74  notUsed;.    int
30fc0 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
30fd0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
30fe0 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
30ff0 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f  pResultSet, pFro
31000 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
31010 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e      WHERE_DISTIN
31020 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  CTBY, nLoop-1, p
31030 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
31040 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b  p-1], &notUsed);
31050 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49  .    if( rc==pWI
31060 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d  nfo->pResultSet-
31070 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
31080 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
31090 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
310a0 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
310b0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
310c0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
310d0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
310e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
310f0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
31100 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d  .      if( pFrom
31110 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49  ->isOrdered==pWI
31120 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
31130 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
31140 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
31150 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
31160 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20  CT_ORDERED;.    
31170 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
31180 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42       pWInfo->nOB
31190 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  Sat = pFrom->isO
311a0 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 69 66  rdered;.      if
311b0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
311c0 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  <0 ) pWInfo->nOB
311d0 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Sat = 0;.      p
311e0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
311f0 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
31200 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
31210 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
31220 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
31230 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20  YGROUP).        
31240 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
31250 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  t==pWInfo->pOrde
31260 72 42 79 2d 3e 6e 45 78 70 72 0a 20 20 20 20 29  rBy->nExpr.    )
31270 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
31280 6e 6f 74 55 73 65 64 20 3d 20 30 3b 0a 20 20 20  notUsed = 0;.   
31290 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20     int nOrder = 
312a0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
312b0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
312c0 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  , pWInfo->pOrder
312d0 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  By, .          p
312e0 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31  From, 0, nLoop-1
312f0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
31300 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
31310 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  d.      );.     
31320 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
31330 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20  >sorted==0 );.  
31340 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74      pWInfo->sort
31350 65 64 20 3d 20 28 6e 4f 72 64 65 72 3d 3d 70 57  ed = (nOrder==pW
31360 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
31370 6e 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  nExpr);.    }.  
31380 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
31390 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
313a0 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
313b0 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
313c0 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
313d0 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
313e0 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
313f0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
31400 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
31410 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
31420 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
31430 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
31440 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
31450 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
31460 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
31470 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
31480 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
31490 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
314a0 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
314b0 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
314c0 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
314d0 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
314e0 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
314f0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
31500 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
31510 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
31520 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
31530 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
31540 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
31550 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
31560 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
31570 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
31580 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
31590 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
315a0 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
315b0 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
315c0 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
315d0 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
315e0 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
315f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31600 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
31610 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
31620 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
31630 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
31640 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
31650 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
31660 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
31670 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
31680 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
31690 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
316a0 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
316b0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
316c0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a  Index *pIdx;.  .
316d0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
316e0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  der->pWInfo;.  i
316f0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
31700 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
31710 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75  RCE_TABLE ) retu
31720 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
31730 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
31740 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
31750 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
31760 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
31770 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
31780 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
31790 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
317a0 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
317b0 3e 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e  >zIndex ) return
317c0 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74   0;.  iCur = pIt
317d0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
317e0 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
317f0 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75  C;.  pLoop = pBu
31800 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
31810 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
31820 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  0;.  pLoop->u.bt
31830 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ree.nSkip = 0;. 
31840 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
31850 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
31860 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20   0, WO_EQ, 0);. 
31870 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
31880 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
31890 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
318a0 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  EQ|WHERE_IPK|WHE
318b0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70  RE_ONEROW;.    p
318c0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  Loop->aLTerm[0] 
318d0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f  = pTerm;.    pLo
318e0 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  op->nLTerm = 1;.
318f0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
31900 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
31910 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
31920 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75  of a rowid looku
31930 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70  p is 10 */.    p
31940 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b  Loop->rRun = 33;
31950 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33    /* 33==sqlite3
31960 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20  LogEst(10) */.  
31970 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
31980 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
31990 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
319a0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
319b0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
319c0 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f  aLTermSpace==pLo
319d0 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20  op->aLTerm );.  
319e0 20 20 20 20 61 73 73 65 72 74 28 20 41 72 72 61      assert( Arra
319f0 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54  ySize(pLoop->aLT
31a00 65 72 6d 53 70 61 63 65 29 3d 3d 34 20 29 3b 0a  ermSpace)==4 );.
31a10 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
31a20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
31a30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78   .       || pIdx
31a40 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
31a50 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  =0 .       || pI
31a60 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61  dx->nKeyCol>Arra
31a70 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54  ySize(pLoop->aLT
31a80 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20  ermSpace) .     
31a90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
31aa0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
31ab0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
31ac0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
31ad0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
31ae0 20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69 43   iCur, pIdx->aiC
31af0 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f  olumn[j], 0, WO_
31b00 45 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  EQ, pIdx);.     
31b10 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
31b20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
31b30 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
31b40 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
31b50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d   }.      if( j!=
31b60 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  pIdx->nKeyCol ) 
31b70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
31b80 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
31b90 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
31ba0 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48  |WHERE_ONEROW|WH
31bb0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
31bc0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43     if( pIdx->isC
31bd0 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65  overing || (pIte
31be0 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  m->colUsed & ~co
31bf0 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64  lumnsInIndex(pId
31c00 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x))==0 ){.      
31c10 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
31c20 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
31c30 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LY;.      }.    
31c40 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
31c50 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
31c60 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
31c70 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
31c80 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
31c90 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20   pIdx;.      /* 
31ca0 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
31cb0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c  a unique index l
31cc0 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20  ookup is 15 */. 
31cd0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e       pLoop->rRun
31ce0 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73   = 39;  /* 39==s
31cf0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29  qlite3LogEst(15)
31d00 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
31d10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
31d20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
31d30 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ){.    pLoop->nO
31d40 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a  ut = (LogEst)1;.
31d50 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
31d60 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b  .pWLoop = pLoop;
31d70 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  .    pLoop->mask
31d80 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26  Self = getMask(&
31d90 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
31da0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49  , iCur);.    pWI
31db0 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75  nfo->a[0].iTabCu
31dc0 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57  r = iCur;.    pW
31dd0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
31de0 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  1;.    if( pWInf
31df0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57  o->pOrderBy ) pW
31e00 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20  Info->nOBSat =  
31e10 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
31e20 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
31e30 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
31e40 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
31e50 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
31e60 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
31e70 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
31e80 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
31e90 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
31ea0 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f  E_DEBUG.    pLoo
31eb0 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65  p->cId = '0';.#e
31ec0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
31ed0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
31ee0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
31ef0 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
31f00 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
31f10 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
31f20 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
31f30 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
31f40 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
31f50 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
31f60 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
31f70 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
31f80 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
31f90 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
31fa0 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
31fb0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
31fc0 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
31fd0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
31fe0 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
31ff0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
32000 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
32010 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
32020 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
32030 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
32040 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
32050 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
32060 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
32070 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
32080 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
32090 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
320a0 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
320b0 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
320c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
320d0 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
320e0 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
320f0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
32100 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
32110 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
32120 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
32130 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
32140 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
32150 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
32160 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
32170 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
32180 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
32190 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
321a0 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
321b0 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
321c0 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
321d0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
321e0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
321f0 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
32200 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
32210 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
32220 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
32230 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
32240 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
32250 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
32260 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
32270 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
32280 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
32290 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
322a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322b0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
322c0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
322d0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
322e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
322f0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
32300 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
32310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32320 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
32330 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
32340 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
32350 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
32360 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
32370 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
32380 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
32390 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
323a0 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
323b0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
323c0 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
323d0 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
323e0 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
323f0 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
32400 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
32410 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
32420 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
32430 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
32440 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
32450 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
32460 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
32470 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
32480 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
32490 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
324a0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
324b0 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
324c0 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
324d0 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
324e0 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
324f0 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
32500 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
32510 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
32520 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
32530 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
32540 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
32550 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
32560 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
32570 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
32580 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
32590 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
325a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
325b0 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
325c0 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
325d0 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
325e0 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
325f0 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
32600 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
32610 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
32620 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
32630 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
32640 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
32650 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
32660 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
32670 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
32680 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
32690 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
326a0 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
326b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
326c0 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
326d0 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
326e0 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
326f0 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
32700 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
32710 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
32720 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
32730 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
32740 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
32750 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
32760 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
32770 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
32780 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
32790 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
327a0 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
327b0 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
327c0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
327d0 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
327e0 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
327f0 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
32800 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
32810 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
32820 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
32830 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
32840 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
32850 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
32860 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
32870 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
32880 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
32890 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
328a0 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
328b0 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
328c0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
328d0 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
328e0 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
328f0 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
32900 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
32910 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
32920 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
32930 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
32940 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
32950 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
32960 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
32970 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
32980 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
32990 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
329a0 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
329b0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
329c0 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
329d0 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
329e0 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
329f0 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
32a00 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
32a10 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
32a20 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
32a30 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
32a40 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
32a50 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
32a60 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
32a70 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
32a80 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
32a90 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
32aa0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
32ab0 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
32ac0 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
32ad0 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
32ae0 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
32af0 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
32b00 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
32b10 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
32b20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
32b30 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
32b40 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
32b50 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
32b60 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
32b70 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
32b80 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47 52  lause (or the GR
32b90 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  OUP BY clause.**
32ba0 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   if the WHERE_GR
32bb0 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
32bc0 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29  t in wctrlFlags)
32bd0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
32be0 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65  tement.** if the
32bf0 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
32c00 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
32c10 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
32c20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
32c30 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
32c40 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
32c50 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
32c60 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20  hen pOrderBy is 
32c70 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
32c80 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74 65  iIdxCur paramete
32c90 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
32ca0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
32cb0 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52  ex.  If .** WHER
32cc0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
32cd0 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20  is set, iIdxCur 
32ce0 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
32cf0 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
32d00 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f  .** to use for O
32d10 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R clause process
32d20 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20  ing.  The WHERE 
32d30 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73  clause should us
32d40 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66  e this.** specif
32d50 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57  ic cursor.  If W
32d60 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
32d70 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65  IRED is set, the
32d80 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20  n iIdxCur is.** 
32d90 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  the first cursor
32da0 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
32db0 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
32dc0 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75  indices.  iIdxCu
32dd0 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75  r should.** be u
32de0 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
32df0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
32e00 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20  ursor depending 
32e10 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69  on which index i
32e20 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68  s.** used..*/.Wh
32e30 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
32e40 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
32e50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
32e60 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
32e70 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
32e80 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
32e90 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  ,    /* FROM cla
32ea0 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61  use: A list of a
32eb0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
32ec0 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
32ed0 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
32ee0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
32ef0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
32f00 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
32f10 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
32f20 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63   (or GROUP BY) c
32f30 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
32f40 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52  /.  ExprList *pR
32f50 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73  esultSet, /* Res
32f60 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 71  ult set of the q
32f70 75 65 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63  uery */.  u16 wc
32f80 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
32f90 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
32fa0 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
32fb0 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
32fc0 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  .h */.  int iIdx
32fd0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur           /*
32fe0 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   If WHERE_ONETAB
32ff0 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20  LE_ONLY is set, 
33000 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d  index cursor num
33010 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ber */.){.  int 
33020 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
33030 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
33040 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
33050 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
33060 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
33070 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
33080 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33090 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
330a0 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
330b0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
330c0 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
330d0 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
330e0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
330f0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
33100 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
33110 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
33120 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
33130 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
33140 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
33150 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
33160 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
33170 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
33180 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
33190 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20  er sWLB;     /* 
331a0 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75  The WhereLoop bu
331b0 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  ilder */.  Where
331c0 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
331d0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
331e0 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
331f0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
33200 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
33210 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
33220 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
33230 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
33240 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
33250 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
33260 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f  a single WhereLo
33270 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
33280 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
33290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
332a0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
332b0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
332c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
332d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
332e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
332f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33300 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
33310 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  */...  /* Variab
33320 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  le initializatio
33330 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  n */.  db = pPar
33340 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74  se->db;.  memset
33350 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f  (&sWLB, 0, sizeo
33360 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20  f(sWLB));..  /* 
33370 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20 42  An ORDER/GROUP B
33380 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65  Y clause of more
33390 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20 63   than 63 terms c
333a0 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
333b0 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ed */.  testcase
333c0 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
333d0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42  rderBy->nExpr==B
333e0 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f  MS-1 );.  if( pO
333f0 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
33400 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29  By->nExpr>=BMS )
33410 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
33420 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d   sWLB.pOrderBy =
33430 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
33440 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49 53   Disable the DIS
33450 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69  TINCT optimizati
33460 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73  on if SQLITE_Dis
33470 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20  tinctOpt is set 
33480 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  via.  ** sqlite3
33490 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54  _test_ctrl(SQLIT
334a0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
334b0 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f  IZATIONS,...) */
334c0 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
334d0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
334e0 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
334f0 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c  pt) ){.    wctrl
33500 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
33510 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20  WANT_DISTINCT;. 
33520 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d   }..  /* The num
33530 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
33540 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
33550 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
33560 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
33570 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
33580 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
33590 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
335a0 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
335b0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
335c0 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
335d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
335e0 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
335f0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
33600 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
33610 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
33620 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
33630 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
33640 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
33650 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
33660 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
33670 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
33680 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
33690 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
336a0 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
336b0 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
336c0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
336d0 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
336e0 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
336f0 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
33700 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
33710 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
33720 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
33730 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
33740 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
33750 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
33760 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
33770 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
33780 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
33790 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
337a0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
337b0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
337c0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
337d0 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
337e0 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
337f0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
33800 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
33810 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
33820 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
33830 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
33840 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
33850 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
33860 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
33870 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
33880 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
33890 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
338a0 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
338b0 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
338c0 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
338d0 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
338e0 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
338f0 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
33900 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
33910 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
33920 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
33930 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
33940 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
33950 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
33960 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
33970 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
33980 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
33990 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
339a0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
339b0 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
339c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
339d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
339e0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
339f0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
33a00 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
33a10 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
33a20 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
33a30 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e  ss[0] = pWInfo->
33a40 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
33a50 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  = -1;.  pWInfo->
33a60 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
33a70 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  t;.  pWInfo->pPa
33a80 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
33a90 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
33aa0 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
33ab0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
33ac0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57  = pOrderBy;.  pW
33ad0 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
33ae0 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
33af0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
33b00 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  = pWInfo->iConti
33b10 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
33b20 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
33b30 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
33b40 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
33b50 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  ;.  pWInfo->save
33b60 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
33b70 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
33b80 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
33b90 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
33ba0 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
33bb0 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
33bc0 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
33bd0 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
33be0 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
33bf0 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
33c00 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
33c10 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
33c20 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
33c30 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
33c40 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
33c50 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
33c60 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
33c70 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
33c80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
33c90 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
33ca0 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
33cb0 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
33cc0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
33cd0 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
33ce0 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
33cf0 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
33d00 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
33d10 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
33d20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
33d30 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
33d40 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65  pWInfo);.  where
33d50 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  Split(&pWInfo->s
33d60 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  WC, pWhere, TK_A
33d70 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53  ND);.    .  /* S
33d80 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57  pecial case: a W
33d90 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
33da0 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45   is constant.  E
33db0 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a  valuate the.  **
33dc0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
33dd0 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72  either jump over
33de0 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
33df0 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20   or fall thru.. 
33e00 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
33e10 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65  ii<sWLB.pWC->nTe
33e20 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  rm; ii++){.    i
33e30 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c  f( nTabList==0 |
33e40 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
33e50 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73  onstantNotJoin(s
33e60 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70  WLB.pWC->a[ii].p
33e70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
33e80 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
33e90 65 28 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70  e(pParse, sWLB.p
33ea0 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c  WC->a[ii].pExpr,
33eb0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
33ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33ed0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
33ee0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
33ef0 20 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b      sWLB.pWC->a[
33f00 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54  ii].wtFlags |= T
33f10 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
33f20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
33f30 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d  al case: No FROM
33f40 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69   clause.  */.  i
33f50 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29  f( nTabList==0 )
33f60 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  {.    if( pOrder
33f70 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  By ) pWInfo->nOB
33f80 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Sat = pOrderBy->
33f90 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77  nExpr;.    if( w
33fa0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
33fb0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
33fc0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
33fd0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
33fe0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
33ff0 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
34000 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
34010 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
34020 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
34030 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
34040 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
34050 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
34060 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
34070 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
34080 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
34090 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
340a0 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
340b0 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
340c0 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
340d0 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
340e0 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
340f0 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
34100 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
34110 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
34120 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
34130 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
34140 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
34150 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
34160 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
34170 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
34180 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
34190 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
341a0 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
341b0 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
341c0 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
341d0 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
341e0 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
341f0 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
34200 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
34210 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
34220 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
34230 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
34240 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
34250 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
34260 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
34270 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
34280 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
34290 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  5..  **.  ** Not
342a0 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20  e that bitmasks 
342b0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
342c0 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  all pTabList->nS
342d0 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a  rc tables in.  *
342e0 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20  * pTabList, not 
342f0 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  just the first n
34300 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20  TabList tables. 
34310 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72   nTabList is nor
34320 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c  mally.  ** equal
34330 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
34340 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
34350 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
34360 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  f the.  ** WHERE
34370 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
34380 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  lag is set..  */
34390 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
343a0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
343b0 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74  ii++){.    creat
343c0 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
343d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
343e0 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  iCursor);.  }.#i
343f0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b  fndef NDEBUG.  {
34400 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54  .    Bitmask toT
34410 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  heLeft = 0;.    
34420 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
34430 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
34440 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
34450 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k m = getMask(pM
34460 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
34470 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
34480 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34490 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74  (m-1)==toTheLeft
344a0 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c   );.      toTheL
344b0 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a  eft |= m;.    }.
344c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
344d0 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
344e0 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
344f0 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65  ns.  Note that e
34500 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
34510 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20  ht.  ** add new 
34520 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e  virtual terms on
34530 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
34540 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
34550 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   We do not.  ** 
34560 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
34570 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65  these virtual te
34580 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
34590 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
345a0 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b  nd.  ** and work
345b0 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74   forward so that
345c0 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75   the added virtu
345d0 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76  al terms are nev
345e0 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  er processed..  
345f0 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  */.  exprAnalyze
34600 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 70  All(pTabList, &p
34610 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69  WInfo->sWC);.  i
34620 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
34630 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
34640 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
34650 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72  .  }..  if( wctr
34660 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
34670 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
34680 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e      if( isDistin
34690 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72  ctRedundant(pPar
346a0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70  se, pTabList, &p
346b0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73  WInfo->sWC, pRes
346c0 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20  ultSet) ){.     
346d0 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
346e0 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e   marking is poin
346f0 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69  tless.  Ignore i
34700 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  t. */.      pWIn
34710 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
34720 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
34730 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
34740 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
34750 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
34760 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65   to ORDER BY the
34770 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d   result set to m
34780 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f  ake distinct pro
34790 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a  cessing easier *
347a0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
347b0 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
347c0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a  ERE_DISTINCTBY;.
347d0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
347e0 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74  rderBy = pResult
347f0 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Set;.    }.  }..
34800 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
34810 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
34820 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54  ects */.  WHERET
34830 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
34840 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
34850 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a  t ***\n"));.  /*
34860 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72   Display all ter
34870 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
34880 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 20 64 65  clause */.#if de
34890 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
348a0 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66  _ENABLED) && def
348b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
348c0 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
348d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
348e0 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30  ereTrace & 0x100
348f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
34900 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
34910 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
34920 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65  sqlite3ExplainBe
34930 67 69 6e 28 76 29 3b 0a 20 20 20 20 66 6f 72 28  gin(v);.    for(
34940 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70 57 43 2d  i=0; i<sWLB.pWC-
34950 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
34960 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
34970 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 23 25 2d  inPrintf(v, "#%-
34980 32 64 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20  2d ", i);.      
34990 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
349a0 73 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68 65  sh(v);.      whe
349b0 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76 2c  reExplainTerm(v,
349c0 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d   &sWLB.pWC->a[i]
349d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
349e0 45 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20  ExplainPop(v);. 
349f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
34a00 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a  ainNL(v);.    }.
34a10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
34a20 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20  inFinish(v);.   
34a30 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
34a40 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
34a50 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e  3VdbeExplanation
34a60 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (v));.  }.#endif
34a70 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21  .  if( nTabList!
34a80 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74  =1 || whereShort
34a90 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b  Cut(&sWLB)==0 ){
34aa0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
34ab0 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29  oopAddAll(&sWLB)
34ac0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
34ad0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
34ae0 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44  ror;.  .    /* D
34af0 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
34b00 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
34b10 63 74 73 20 69 66 20 77 68 65 72 65 74 72 61 63  cts if wheretrac
34b20 65 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  e is enabled */.
34b30 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
34b40 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30  E_ENABLED /* !=0
34b50 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
34b60 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
34b70 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
34b80 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *p;.      int i
34b90 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
34ba0 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22  har zLabel[] = "
34bb0 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
34bc0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
34bd0 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20  wyxz".          
34be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
34c00 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
34c10 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20  STUVWYXZ";.     
34c20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70   for(p=pWInfo->p
34c30 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70  Loops, i=0; p; p
34c40 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69  =p->pNextLoop, i
34c50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
34c60 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73  cId = zLabel[i%s
34c70 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a  izeof(zLabel)];.
34c80 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
34c90 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70  pPrint(p, sWLB.p
34ca0 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WC);.      }.   
34cb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20   }.#endif.  .   
34cc0 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
34cd0 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20  (pWInfo, 0);.   
34ce0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
34cf0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
34d00 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
34d10 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
34d20 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
34d30 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
34d40 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
34d50 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20  >nRowOut+1);.   
34d60 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
34d70 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
34d80 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
34d90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
34da0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
34db0 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61  y==0 && (db->fla
34dc0 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
34dd0 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a  rseOrder)!=0 ){.
34de0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
34df0 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29  Mask = (Bitmask)
34e00 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  (-1);.  }.  if( 
34e10 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
34e20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63  NEVER(db->malloc
34e30 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67  Failed) ){.    g
34e40 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
34e50 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  ror;.  }.#ifdef 
34e60 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
34e70 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a 20 20 69  ED /* !=0 */.  i
34e80 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
34e90 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  race ){.    int 
34ea0 69 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ii;.    sqlite3D
34eb0 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
34ec0 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25   Solution nRow=%
34ed0 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  d", pWInfo->nRow
34ee0 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Out);.    if( pW
34ef0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29  Info->nOBSat>0 )
34f00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
34f10 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44  ebugPrintf(" ORD
34f20 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c  ERBY=%d,0x%llx",
34f30 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c   pWInfo->nOBSat,
34f40 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
34f50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  );.    }.    swi
34f60 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69  tch( pWInfo->eDi
34f70 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
34f80 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
34f90 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
34fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
34fb0 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
34fc0 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20  INCT=unique");. 
34fd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
34fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
34ff0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
35000 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
35010 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
35020 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
35030 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  T=ordered");.   
35040 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35050 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
35060 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
35070 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
35080 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
35090 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
350a0 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20  T=unordered");. 
350b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
350c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
350d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
350e0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f  tf("\n");.    fo
350f0 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66  r(ii=0; ii<pWInf
35100 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29  o->nLevel; ii++)
35110 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
35120 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61  pPrint(pWInfo->a
35130 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c  [ii].pWLoop, sWL
35140 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20  B.pWC);.    }.  
35150 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74  }.#endif.  /* At
35160 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61  tempt to omit ta
35170 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  bles from the jo
35180 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65  in that do not e
35190 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74  ffect the result
351a0 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
351b0 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26  ->nLevel>=2.   &
351c0 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a  & pResultSet!=0.
351d0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
351e0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
351f0 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69  LITE_OmitNoopJoi
35200 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  n).  ){.    Bitm
35210 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 65 78  ask tabUsed = ex
35220 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
35230 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75  (pMaskSet, pResu
35240 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ltSet);.    if( 
35250 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 20  sWLB.pOrderBy ) 
35260 74 61 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c  tabUsed |= exprL
35270 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
35280 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72  askSet, sWLB.pOr
35290 64 65 72 42 79 29 3b 0a 20 20 20 20 77 68 69 6c  derBy);.    whil
352a0 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  e( pWInfo->nLeve
352b0 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68  l>=2 ){.      Wh
352c0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
352d0 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f  *pEnd;.      pLo
352e0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70  op = pWInfo->a[p
352f0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d  WInfo->nLevel-1]
35300 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69  .pWLoop;.      i
35310 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62  f( (pWInfo->pTab
35320 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
35330 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  Tab].jointype & 
35340 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72  JT_LEFT)==0 ) br
35350 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28  eak;.      if( (
35360 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
35370 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
35380 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )==0.       && (
35390 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
353a0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
353b0 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
353c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
353d0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62  }.      if( (tab
353e0 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  Used & pLoop->ma
353f0 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65  skSelf)!=0 ) bre
35400 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  ak;.      pEnd =
35410 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73   sWLB.pWC->a + s
35420 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  WLB.pWC->nTerm;.
35430 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
35440 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65  sWLB.pWC->a; pTe
35450 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  rm<pEnd; pTerm++
35460 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
35470 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
35480 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
35490 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  lf)!=0.         
354a0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
354b0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
354c0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
354d0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
354e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
354f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35500 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e     if( pTerm<pEn
35510 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
35520 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
35530 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f  ff, ("-> drop lo
35540 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e  op %c not used\n
35550 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b  ", pLoop->cId));
35560 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
35570 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e  Level--;.      n
35580 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d  TabList--;.    }
35590 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
355a0 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f  E(0xffff,("*** O
355b0 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
355c0 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57  d ***\n"));.  pW
355d0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51  Info->pParse->nQ
355e0 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e  ueryLoop += pWIn
355f0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20  fo->nRowOut;..  
35600 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
35610 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
35620 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
35630 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
35640 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
35650 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
35660 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
35670 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
35680 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68  opriate..  ** Th
35690 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
356a0 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  ithm only works 
356b0 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
356c0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 73 0a 20  use constrains. 
356d0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
356e0 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69  t to update a si
356f0 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20  ngle row..  */. 
35700 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
35710 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
35720 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
35730 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   || pWInfo->nLev
35740 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28  el==1 );.  if( (
35750 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
35760 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
35770 45 44 29 21 3d 30 20 0a 20 20 20 26 26 20 28 70  ED)!=0 .   && (p
35780 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
35790 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
357a0 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20 29  ERE_ONEROW)!=0 )
357b0 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b  {.    pWInfo->ok
357c0 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20  OnePass = 1;.   
357d0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
357e0 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
357f0 62 29 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  b) ){.      pWIn
35800 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d  fo->a[0].pWLoop-
35810 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
35820 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
35830 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65   }.  }..  /* Ope
35840 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
35850 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
35860 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
35870 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
35880 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
35890 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ables..  */.  no
358a0 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
358b0 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
358c0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
358d0 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  >a; ii<nTabList;
358e0 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29   ii++, pLevel++)
358f0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
35900 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
35910 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
35920 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
35930 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61  /* Index of data
35940 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
35950 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20  table/index */. 
35960 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
35970 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
35980 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ;..    pTabItem 
35990 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
359a0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
359b0 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
359c0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
359d0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
359e0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
359f0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
35a00 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
35a10 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  >pWLoop;.    if(
35a20 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
35a30 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
35a40 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
35a50 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
35a60 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
35a70 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
35a80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
35a90 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
35aa0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
35ab0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
35ac0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
35ad0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
35ae0 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
35af0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
35b00 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
35b10 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
35b20 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
35b30 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
35b40 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
35b50 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
35b60 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
35b70 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
35b80 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
35b90 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
35ba0 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
35bb0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
35bc0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
35bd0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
35be0 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
35bf0 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
35c00 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
35c10 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20  N_CLOSE)==0 ){. 
35c20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50       int op = OP
35c30 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
35c40 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f   if( pWInfo->okO
35c50 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20  nePass ){.      
35c60 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72    op = OP_OpenWr
35c70 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49  ite;.        pWI
35c80 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
35c90 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d  s[0] = pTabItem-
35ca0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
35cb0 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  };.      sqlite3
35cc0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
35cd0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
35ce0 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
35cf0 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  op);.      asser
35d00 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t( pTabItem->iCu
35d10 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54  rsor==pLevel->iT
35d20 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74  abCur );.      t
35d30 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f  estcase( !pWInfo
35d40 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
35d50 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
35d60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
35d70 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  se( !pWInfo->okO
35d80 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
35d90 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
35da0 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
35db0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
35dc0 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48  b->nCol<BMS && H
35dd0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
35de0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
35df0 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63   b = pTabItem->c
35e00 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20  olUsed;.        
35e10 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
35e20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e     for(; b; b=b>
35e30 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  >1, n++){}.     
35e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
35e50 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65  angeP4(v, sqlite
35e60 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
35e70 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  (v)-1, .        
35e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e90 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54      SQLITE_INT_T
35ea0 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54  O_PTR(n), P4_INT
35eb0 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  32);.        ass
35ec0 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
35ed0 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol );.      }.  
35ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
35ef0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
35f00 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
35f10 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
35f20 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
35f30 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
35f40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
35f50 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
35f60 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f  Index *pIx = pLo
35f70 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
35f80 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ex;.      int iI
35f90 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69  ndexCur;.      i
35fa0 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
35fb0 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 49  ead;.      /* iI
35fc0 64 78 43 75 72 20 69 73 20 61 6c 77 61 79 73 20  dxCur is always 
35fd0 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69  set if to a posi
35fe0 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e  tive value if ON
35ff0 45 50 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c  EPASS is possibl
36000 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
36010 74 28 20 69 49 64 78 43 75 72 21 3d 30 20 7c 7c  t( iIdxCur!=0 ||
36020 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
36030 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
36040 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
36050 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
36060 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
36070 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  ){.        Index
36080 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d   *pJ = pTabItem-
36090 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
360a0 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
360b0 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
360c0 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72      assert( wctr
360d0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
360e0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29  NEPASS_DESIRED )
360f0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
36100 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70   ALWAYS(pJ) && p
36110 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20  J!=pIx ){.      
36120 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b      iIndexCur++;
36130 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20  .          pJ = 
36140 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  pJ->pNext;.     
36150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20     }.        op 
36160 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
36170 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
36180 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
36190 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
361a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 49 64     }else if( iId
361b0 78 43 75 72 20 26 26 20 28 77 63 74 72 6c 46 6c  xCur && (wctrlFl
361c0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
361d0 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  ABLE_ONLY)!=0 ){
361e0 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
361f0 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  ur = iIdxCur;.  
36200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36210 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70     iIndexCur = p
36220 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
36230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65       }.      pLe
36240 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69  vel->iIdxCur = i
36250 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
36260 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63  assert( pIx->pSc
36270 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
36280 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ema );.      ass
36290 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d  ert( iIndexCur>=
362a0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
362b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
362c0 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70  op, iIndexCur, p
362d0 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  Ix->tnum, iDb);.
362e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
362f0 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
36300 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
36310 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
36320 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  , "%s", pIx->zNa
36330 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  me));.    }.    
36340 69 66 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c  if( iDb>=0 ) sql
36350 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
36360 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
36370 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
36380 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49  &= ~getMask(&pWI
36390 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
363a0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
363b0 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  );.  }.  pWInfo-
363c0 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  >iTop = sqlite3V
363d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
363e0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
363f0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
36400 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
36410 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
36420 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
36430 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
36440 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
36450 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
36460 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
36470 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
36480 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
36490 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
364a0 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
364b0 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
364c0 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  sk)0;.  for(ii=0
364d0 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
364e0 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i++){.    pLevel
364f0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
36500 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ];.#ifndef SQLIT
36510 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
36520 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
36530 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
36540 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
36550 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
36560 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
36570 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
36580 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
36590 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
365a0 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
365b0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
365c0 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
365d0 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
365e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
365f0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
36600 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
36610 65 6e 64 69 66 0a 20 20 20 20 65 78 70 6c 61 69  endif.    explai
36620 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
36630 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
36640 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
36650 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
36660 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  );.    pLevel->a
36670 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  ddrBody = sqlite
36680 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
36690 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  (v);.    notRead
366a0 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
366b0 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c  tart(pWInfo, ii,
366c0 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
366d0 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
366e0 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  e = pLevel->addr
366f0 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Cont;.  }..  /* 
36700 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d  Done. */.  VdbeM
36710 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
36720 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f   "Begin WHERE-co
36730 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  re"));.  return 
36740 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
36750 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
36760 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
36770 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
36780 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
36790 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
367a0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
367b0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
367c0 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
367d0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
367e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
367f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
36800 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
36810 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
36820 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
36830 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
36840 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
36850 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
36860 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
36870 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
36880 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
36890 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
368a0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
368b0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
368c0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
368d0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
368e0 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
368f0 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
36900 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
36910 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
36920 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
36930 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
36940 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
36950 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
36960 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ode..  */.  Vdbe
36970 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
36980 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72  , "End WHERE-cor
36990 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  e"));.  sqlite3E
369a0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
369b0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
369c0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
369d0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
369e0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70   int addr;.    p
369f0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
36a00 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70  >a[i];.    pLoop
36a10 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
36a20 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  p;.    sqlite3Vd
36a30 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
36a40 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
36a50 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
36a60 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
36a70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
36a80 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70  3VdbeAddOp3(v, p
36a90 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
36aa0 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
36ab0 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a  2, pLevel->p3);.
36ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36ad0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65  eChangeP5(v, pLe
36ae0 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20  vel->p5);.      
36af0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
36b00 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
36b10 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
36b20 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20  >op==OP_Next);. 
36b30 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
36b40 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
36b50 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20  p==OP_Prev);.   
36b60 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
36b70 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
36b80 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20  =OP_VNext);.    
36b90 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
36ba0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
36bb0 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
36bc0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
36bd0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
36be0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
36bf0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
36c00 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
36c10 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
36c20 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
36c30 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
36c40 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
36c50 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
36c60 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
36c70 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
36c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
36c90 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
36ca0 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
36cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36cc0 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e  eAddOp2(v, pIn->
36cd0 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d  eEndLoopOp, pIn-
36ce0 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
36cf0 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
36d00 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
36d10 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
36d20 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e  erageIf(v, pIn->
36d30 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50  eEndLoopOp==OP_P
36d40 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20  revIfOpen);.    
36d50 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
36d60 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  If(v, pIn->eEndL
36d70 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66  oopOp==OP_NextIf
36d80 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  Open);.        s
36d90 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
36da0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
36db0 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
36dc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
36dd0 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
36de0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
36df0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
36e00 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
36e10 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
36e20 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
36e30 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
36e40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
36e50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
36e60 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
36e70 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
36e80 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
36e90 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63  v, "next skip-sc
36ea0 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70  an on %s", pLoop
36eb0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
36ec0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
36ed0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
36ee0 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Here(v, pLevel->
36ef0 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20  addrSkip);.     
36f00 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
36f10 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Here(v, pLevel->
36f20 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20  addrSkip-2);.   
36f30 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
36f40 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
36f50 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
36f60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
36f70 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76  , OP_IfPos, pLev
36f80 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20  el->iLeftJoin); 
36f90 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
36fa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
36fb0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
36fc0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
36fd0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
36fe0 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  | (pLoop->wsFlag
36ff0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
37000 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)!=0 );.      i
37010 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
37020 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
37030 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
37040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37050 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
37060 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ow, pTabList->a[
37070 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
37080 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
37090 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
370a0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
370b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
370c0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
370d0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
370e0 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
370f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
37100 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74  evel->op==OP_Ret
37110 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  urn ){.        s
37120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
37130 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c  (v, OP_Gosub, pL
37140 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
37150 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
37160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37180 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
37190 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
371a0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  First);.      }.
371b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
371c0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
371d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
371e0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
371f0 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c  (v, "End WHERE-l
37200 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20  oop%d: %s", i,. 
37210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37220 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62      pWInfo->pTab
37230 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
37240 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61  iFrom].pTab->zNa
37250 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  me));.  }..  /* 
37260 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
37270 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
37280 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
37290 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
372a0 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
372b0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
372c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
372d0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
372e0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
372f0 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c  o->nLevel<=pTabL
37300 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66  ist->nSrc );.  f
37310 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
37320 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e  WInfo->a; i<pWIn
37330 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c  fo->nLevel; i++,
37340 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
37350 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20  int k, last;.   
37360 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
37370 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
37380 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  0;.    struct Sr
37390 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
373a0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
373b0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
373c0 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
373d0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
373e0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
373f0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
37400 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
37410 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a  >pWLoop;..    /*
37420 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e   For a co-routin
37430 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50  e, change all OP
37440 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63  _Column referenc
37450 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  es to the table 
37460 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
37470 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50  -routine into OP
37480 5f 53 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74  _SCopy of result
37490 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20   contained in a 
374a0 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a  register..    **
374b0 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65   OP_Rowid become
374c0 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a  s OP_Null..    *
374d0 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74  /.    if( pTabIt
374e0 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
374f0 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
37500 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 6c  ailed ){.      l
37510 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
37520 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
37530 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65  .      k = pLeve
37540 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20  l->addrBody;.   
37550 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
37560 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b  VdbeGetOp(v, k);
37570 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c  .      for(; k<l
37580 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
37590 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
375a0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
375b0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
375c0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
375d0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
375e0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
375f0 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
37600 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20   OP_Copy;.      
37610 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f      pOp->p1 = pO
37620 70 2d 3e 70 32 20 2b 20 70 54 61 62 49 74 65 6d  p->p2 + pTabItem
37630 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20  ->regResult;.   
37640 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
37650 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
37660 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
37670 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
37680 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
37690 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  OP_Rowid ){.    
376a0 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
376b0 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20  e = OP_Null;.   
376c0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
376d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   0;.          pO
376e0 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20  p->p3 = 0;.     
376f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
37700 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
37710 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65   }..    /* Close
37720 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
37730 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
37740 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
37750 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 20 20 2a  hereBegin..    *
37760 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74  * Except, do not
37770 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 74   close cursors t
37780 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 75 73  hat will be reus
37790 65 64 20 62 79 20 74 68 65 20 4f 52 20 6f 70 74  ed by the OR opt
377a0 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
377b0 20 28 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45   (WHERE_OMIT_OPE
377c0 4e 5f 43 4c 4f 53 45 29 2e 20 20 41 6e 64 20 64  N_CLOSE).  And d
377d0 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65 20  o not close the 
377e0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 63 75 72  OP_OpenWrite cur
377f0 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72 65 61  sors.    ** crea
37800 74 65 64 20 66 6f 72 20 74 68 65 20 4f 4e 45 50  ted for the ONEP
37810 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ASS optimization
37820 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
37830 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
37840 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
37850 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62  ==0.     && pTab
37860 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20  ->pSelect==0.   
37870 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
37880 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
37890 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
378a0 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
378b0 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70    int ws = pLoop
378c0 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20  ->wsFlags;.     
378d0 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
378e0 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26  OnePass && (ws &
378f0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
37900 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
37910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
37920 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
37930 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
37940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37950 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  if( (ws & WHERE_
37960 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
37970 20 20 20 26 26 20 28 77 73 20 26 20 28 57 48 45     && (ws & (WHE
37980 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54  RE_IPK|WHERE_AUT
37990 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20  O_INDEX))==0 .  
379a0 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e       && pLevel->
379b0 69 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d  iIdxCur!=pWInfo-
379c0 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
379d0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
379e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
379f0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
37a00 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
37a10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37a20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
37a30 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
37a40 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63  dex, make VDBE c
37a50 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
37a60 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
37a70 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
37a80 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
37a90 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77  from the table w
37aa0 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20  here possible.  
37ab0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20  In some cases.  
37ac0 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69    ** this optimi
37ad0 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20  zation prevents 
37ae0 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65  the table from e
37af0 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20  ver being read, 
37b00 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a  which can.    **
37b10 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69   yield a signifi
37b20 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  cant performance
37b30 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a   boost..    ** .
37b40 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
37b50 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
37b60 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
37b70 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
37b80 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
37b90 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
37ba0 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
37bb0 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
37bc0 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
37bd0 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
37be0 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
37bf0 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
37c00 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
37c10 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
37c20 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
37c30 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
37c40 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
37c50 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
37c60 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
37c70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
37c80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
37c90 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
37ca0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
37cb0 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
37cc0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
37cd0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ndex;.    }else 
37ce0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
37cf0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
37d00 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64  _OR ){.      pId
37d10 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43  x = pLevel->u.pC
37d20 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  ovidx;.    }.   
37d30 20 69 66 28 20 70 49 64 78 20 26 26 20 21 64 62   if( pIdx && !db
37d40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
37d50 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  {.      last = s
37d60 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
37d70 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
37d80 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
37d90 42 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20  Body;.      pOp 
37da0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
37db0 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20  Op(v, k);.      
37dc0 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  for(; k<last; k+
37dd0 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
37de0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
37df0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
37e00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
37e10 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
37e20 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
37e30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
37e40 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  x = pOp->p2;.   
37e50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
37e60 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61  Idx->pTable==pTa
37e70 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  b );.          i
37e80 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
37e90 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
37ea0 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
37eb0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
37ec0 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
37ed0 20 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b           x = pPk
37ee0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20  ->aiColumn[x];. 
37ef0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
37f00 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
37f10 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
37f20 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  dx, x);.        
37f30 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
37f40 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
37f50 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20  2 = x;.         
37f60 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
37f70 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
37f80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37f90 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
37fa0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
37fb0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
37fc0 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20   || x>=0 );.    
37fd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
37fe0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f  p->opcode==OP_Ro
37ff0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
38000 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
38010 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
38020 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
38030 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b  e = OP_IdxRowid;
38040 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
38050 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
38060 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
38070 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  .  */.  pParse->
38080 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
38090 6e 66 6f 2d 3