/ Hex Artifact Content
Login

Artifact 93e9bec739a8921e8701d7fb299e3c49f1b63325:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
2c90: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
2ca0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
2cb0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
2cc0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
2cd0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
2ce0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
2cf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d00: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
2d10: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
2d20: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
2d30: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
2d40: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
2d50: 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65 6e  t/right preceden
2d60: 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e  ce rules come in
2d70: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74  to play when det
2d80: 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ermining the.** 
2d90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2da0: 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45  ce, then COLLATE
2db0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 61   operators are a
2dc0: 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72  djusted to ensur
2dd0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  e.** that the co
2de0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2df0: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2e00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e10: 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "Y collate NO
2e20: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
2e30: 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63 61  es "X op Y" beca
2e40: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
2e50: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
2e60: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
2e70: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
2e80: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
2e90: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2ea0: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
2eb0: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
2ec0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
2ed0: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
2ee0: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
2ef0: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
2f00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
2f10: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
2f20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2f30: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
2f40: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
2f50: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2f60: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
2f70: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
2f80: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
2f90: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2fa0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
2fb0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2fc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
2fd0: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
2fe0: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
2ff0: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
3000: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
3010: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3020: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
3030: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
3040: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
3050: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
3060: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3070: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
3080: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
3090: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
30a0: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
30b0: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
30c0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
30d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
30e0: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
3100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3110: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
3120: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
3130: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
3140: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
3150: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
3160: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
3170: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
3180: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
3190: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
31a0: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
31b0: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
31c0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
31d0: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
31e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
31f0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
3200: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3210: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
3220: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3230: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3240: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3250: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3260: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3270: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
3280: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3290: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
32a0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
32b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32c0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
32d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
32e0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
32f0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3300: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3310: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3320: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3340: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3350: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3360: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3370: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
3380: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
3390: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
33a0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
33b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
33c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
33d0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
33e0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
33f0: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3400: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3410: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3420: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3430: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3440: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3450: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3460: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
3470: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
3480: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
3490: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34a0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34b0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34c0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
34d0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34e0: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
34f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3500: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3510: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3520: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3530: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3540: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3550: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3560: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
3570: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3580: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
3590: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35a0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35b0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35c0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
35d0: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
35e0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
35f0: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3600: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3610: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3620: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3630: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3640: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3650: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3660: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
3670: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
3680: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
3690: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36a0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36b0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
36d0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
36e0: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
36f0: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3700: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3710: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3720: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3740: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3750: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3760: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
3770: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
3780: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
3790: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37a0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37c0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
37d0: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
37e0: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
37f0: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3800: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3810: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3820: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3830: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3840: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3850: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3860: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
3870: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
3880: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
3890: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38a0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38b0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38c0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
38d0: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
38e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
38f0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3900: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3910: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3920: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3930: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3940: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3950: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3960: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3970: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
3990: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39a0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39b0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
39d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
39e0: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
39f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a10: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a20: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a40: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a50: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a60: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3a70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3a80: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3a90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ab0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3ac0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b40: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b50: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b60: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3b70: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3b80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3b90: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3ba0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3bd0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3be0: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3bf0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c00: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c10: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c30: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c50: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c60: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c70: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3c90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3ca0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3cb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3cc0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3cd0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3ce0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3cf0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d00: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d10: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d20: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d30: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d40: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3d70: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3d90: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3da0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3db0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3df0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e10: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e20: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e30: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e40: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e60: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3e70: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3e80: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3e90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3ed0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3ee0: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3ef0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f10: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f20: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f30: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f40: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f50: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f60: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3f70: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3f80: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fc0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
3fd0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
3fe0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
3ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4010: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4020: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4030: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4040: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4050: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4060: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
4070: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
4080: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
4090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40c0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
40d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
40e0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
40f0: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4100: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4110: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4120: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4130: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4140: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4150: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4160: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
4170: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4180: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
4190: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41a0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41b0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41c0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
41d0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
41e0: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
41f0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4200: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4210: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4220: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4230: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4240: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4250: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4260: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
4270: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
4280: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
4290: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42a0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42b0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42c0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
42d0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
42e0: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
42f0: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4300: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4310: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4320: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4330: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4340: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4350: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4360: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4370: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
4380: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
4390: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43a0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43b0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43c0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
43d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
43e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
43f0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4400: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4410: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4430: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4440: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4460: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
4470: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
4490: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44a0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44b0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
44d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
44e0: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
44f0: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4500: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4510: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4520: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4530: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4540: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4550: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4560: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
4570: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
4580: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
4590: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45a0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45c0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
45d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
45e0: 45 52 28 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75  ER(j>pIdx->nColu
45f0: 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mn) ) return 0;.
4600: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4610: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64  >zCollName = pId
4620: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  x->azColl[j];.  
4630: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e  }else{.    pScan
4640: 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20  ->idxaff = 0;.  
4650: 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61    pScan->zCollNa
4660: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  me = 0;.  }.  pS
4670: 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70  can->opMask = op
4680: 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b  Mask;.  pScan->k
4690: 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61   = 0;.  pScan->a
46a0: 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b  Equiv[0] = iCur;
46b0: 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76  .  pScan->aEquiv
46c0: 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  [1] = iColumn;. 
46d0: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d   pScan->nEquiv =
46e0: 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71   2;.  pScan->iEq
46f0: 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72  uiv = 2;.  retur
4700: 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  n whereScanNext(
4710: 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pScan);.}../*.**
4720: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
4730: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
4740: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
4750: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
4760: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
4770: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
4780: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
4790: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
47a0: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
47b0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
47c0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
47d0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
47e0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
47f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
4800: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
4810: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
4820: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  t found..**.** T
4830: 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64  he term returned
4840: 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70   might by Y=<exp
4850: 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61  r> if there is a
4860: 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e  nother constrain
4870: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  t in.** the WHER
4880: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70  E clause that sp
4890: 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59  ecifies that X=Y
48a0: 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73  .  Any such cons
48b0: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a  traints will be.
48c0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
48d0: 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69   the WO_EQUIV bi
48e0: 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e  t in the pTerm->
48f0: 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e  eOperator field.
4900: 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b    The.** aEquiv[
4910: 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20  ] array holds X 
4920: 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69  and all its equi
4930: 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61  valents, with ea
4940: 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a  ch SQL variable.
4950: 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f  ** taking up two
4960: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
4970: 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73  [].  The first s
4980: 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63  lot is for the c
4990: 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20  ursor number.** 
49a0: 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69  and the second i
49b0: 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  s for the column
49c0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20   number.  There 
49d0: 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20  are 22 slots in 
49e0: 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74  aEquiv[].** so t
49f0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
4a00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
4a10: 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20   up to 10 other 
4a20: 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65  equivalent value
4a30: 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65  s..** Hence a se
4a40: 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20  arch for X will 
4a50: 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66  return <expr> if
4a60: 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20   X=A1 and A1=A2 
4a70: 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64  and A2=A3.** and
4a80: 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20   ... and A9=A10 
4a90: 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a  and A10=<expr>..
4aa0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
4ab0: 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  re multiple term
4ac0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
4ad0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
4ae0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
4af0: 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f  ".** then try fo
4b00: 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e  r the one with n
4b10: 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  o dependencies o
4b20: 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74  n <expr> - in ot
4b30: 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a  her words where.
4b40: 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  ** <expr> is a c
4b50: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
4b60: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
4b70: 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e    Only return en
4b80: 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tries of.** the 
4b90: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
4ba0: 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c  where Y is a col
4bb0: 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  umn in another t
4bc0: 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73  able if no terms
4bd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
4be0: 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65  "X <op> <const-e
4bf0: 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49  xpr>" exist.   I
4c00: 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20  f no terms with 
4c10: 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a  a constant RHS.*
4c20: 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20  * exist, try to 
4c30: 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68  return a term th
4c40: 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
4c50: 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61  WO_EQUIV..*/.sta
4c60: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
4c70: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
4c80: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
4c90: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
4ca0: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
4cb0: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
4cc0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
4cd0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
4ce0: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
4cf0: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
4d00: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
4d10: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
4d20: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
4d30: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
4d40: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
4d50: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
4d60: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
4d70: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4d80: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
4d90: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
4da0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
4db0: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
4dc0: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
4dd0: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
4de0: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
4df0: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
4e00: 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  rm *pResult = 0;
4e10: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b  .  WhereTerm *p;
4e20: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
4e30: 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53  n;..  p = whereS
4e40: 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
4e50: 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d  WC, iCur, iColum
4e60: 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20  n, op, pIdx);.  
4e70: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
4e80: 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69  if( (p->prereqRi
4e90: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
4ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
4eb0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  p->prereqRight==
4ec0: 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74  0 && (p->eOperat
4ed0: 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a  or&WO_EQ)!=0 ){.
4ee0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
4ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4f00: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
4f10: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
4f20: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
4f30: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
4f40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
4f50: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Result;.}../* Fo
4f60: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
4f70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
4f80: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
4f90: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
4fa0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
4fb0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
4fc0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
4fd0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
4fe0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
4ff0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
5000: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
5010: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
5020: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
5030: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5040: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
5050: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5060: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
5070: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5080: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
5090: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
50a0: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
50b0: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
50c0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
50d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
50e0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
50f0: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
5100: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5110: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5120: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
5130: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
5140: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
5150: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
5160: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
5170: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
5180: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
5190: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
51a0: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
51b0: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
51c0: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
51d0: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
51e0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
51f0: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
5200: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
5210: 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74  ildcard.  .*/.st
5220: 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f  atic int isLikeO
5230: 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a  rGlob(.  Parse *
5240: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
5250: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5260: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5270: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
5280: 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74  pr,      /* Test
5290: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
52a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 50   */.  Expr **ppP
52b0: 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74  refix,  /* Point
52c0: 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20  er to TK_STRING 
52d0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
52e0: 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20 2a  pattern prefix *
52f0: 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70  /.  int *pisComp
5300: 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66  lete, /* True if
5310: 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61   the only wildca
5320: 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c  rd is % in the l
5330: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f  ast character */
5340: 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20  .  int *pnoCase 
5350: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5360: 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71 75  uppercase is equ
5370: 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72  ivalent to lower
5380: 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  case */.){.  con
5390: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20  st char *z = 0; 
53a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
53b0: 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45  g on RHS of LIKE
53c0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45   operator */.  E
53d0: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
53e0: 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67  eft;      /* Rig
53f0: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65  ht and left size
5400: 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f   of LIKE operato
5410: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
5420: 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
5430: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65    /* List of ope
5440: 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b  rands to the LIK
5450: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
5460: 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20  int c;          
5470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
5480: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  e character in z
5490: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  [] */.  int cnt;
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
54c0: 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65  non-wildcard pre
54d0: 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a  fix characters *
54e0: 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20  /.  char wc[3]; 
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5500: 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72 61  * Wildcard chara
5510: 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  cters */.  sqlit
5520: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5530: 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
5540: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
5550: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
5560: 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pVal = 0;.  int
5570: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
5580: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
5590: 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a  e of pRight */..
55a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
55b0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c  LikeFunction(db,
55c0: 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c   pExpr, pnoCase,
55d0: 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   wc) ){.    retu
55e0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rn 0;.  }.#ifdef
55f0: 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20   SQLITE_EBCDIC. 
5600: 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20   if( *pnoCase ) 
5610: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
5620: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
5630: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65  ->x.pList;.  pLe
5640: 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  ft = pList->a[1]
5650: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c  .pExpr;.  if( pL
5660: 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  eft->op!=TK_COLU
5670: 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  MN .   || sqlite
5680: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
5690: 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46  eft)!=SQLITE_AFF
56a0: 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73 56  _TEXT .   || IsV
56b0: 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54  irtual(pLeft->pT
56c0: 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ab).  ){.    /* 
56d0: 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34  IMP: R-02065-494
56e0: 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  65 The left-hand
56f0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b   side of the LIK
5700: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
5710: 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  or must.    ** b
5720: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  e the name of an
5730: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
5740: 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69  with TEXT affini
5750: 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ty. */.    retur
5760: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 0;.  }.  asser
5770: 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  t( pLeft->iColum
5780: 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65  n!=(-1) ); /* Be
5790: 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20  cause IPK never 
57a0: 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a  has AFF_TEXT */.
57b0: 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69  .  pRight = sqli
57c0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
57d0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  te(pList->a[0].p
57e0: 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70 52  Expr);.  op = pR
57f0: 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  ight->op;.  if( 
5800: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
5810: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65  ){.    Vdbe *pRe
5820: 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65  prepare = pParse
5830: 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20  ->pReprepare;.  
5840: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69    int iCol = pRi
5850: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ght->iColumn;.  
5860: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
5870: 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
5880: 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43  e(pReprepare, iC
5890: 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ol, SQLITE_AFF_N
58a0: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ONE);.    if( pV
58b0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
58c0: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
58d0: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
58e0: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a       z = (char *
58f0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5900: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  ext(pVal);.    }
5910: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5920: 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
5930: 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b  e->pVdbe, iCol);
5940: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69  .    assert( pRi
5950: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ght->op==TK_VARI
5960: 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e  ABLE || pRight->
5970: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
5980: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
5990: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
59a0: 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e      z = pRight->
59b0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  u.zToken;.  }.  
59c0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74  if( z ){.    cnt
59d0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
59e0: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
59f0: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
5a00: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
5a10: 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  2] ){.      cnt+
5a20: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
5a30: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d   cnt!=0 && 255!=
5a40: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a  (u8)z[cnt-1] ){.
5a50: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65        Expr *pPre
5a60: 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43  fix;.      *pisC
5a70: 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b  omplete = c==wc[
5a80: 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d  0] && z[cnt+1]==
5a90: 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78  0;.      pPrefix
5aa0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
5ab0: 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29  b, TK_STRING, z)
5ac0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
5ad0: 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75  fix ) pPrefix->u
5ae0: 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30  .zToken[cnt] = 0
5af0: 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69  ;.      *ppPrefi
5b00: 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20  x = pPrefix;.   
5b10: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41     if( op==TK_VA
5b20: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  RIABLE ){.      
5b30: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5b40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20  se->pVdbe;.     
5b50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5b60: 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67  tVarmask(v, pRig
5b70: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ht->iColumn);.  
5b80: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
5b90: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
5ba0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
5bb0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
5bc0: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
5bd0: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
5be0: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
5bf0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
5c00: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
5c10: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
5c20: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
5c30: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
5c40: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
5c50: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
5c60: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
5c70: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
5c80: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
5c90: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
5ca0: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
5cb0: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
5cc0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
5cd0: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
5ce0: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
5cf0: 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65  o workaround the
5d00: 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f  m, add a dummy O
5d10: 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e  P_Variable here.
5d20: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  .          */ . 
5d30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
5d40: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5d50: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5d60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5d70: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
5d80: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29  rse, pRight, r1)
5d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
5da0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
5db0: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
5dc0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
5dd0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
5de0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5df0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5e00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5e10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5e20: 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d      z = 0;.    }
5e30: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
5e40: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
5e50: 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b    return (z!=0);
5e60: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
5e70: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
5e80: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a  TIMIZATION */...
5e90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5ea0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
5eb0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
5ec0: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
5ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
5ee0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
5ef0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
5f00: 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a  MATCH expr.**.**
5f10: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72   If it is then r
5f20: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
5f30: 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  not, return FALS
5f40: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
5f50: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
5f60: 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  (.  Expr *pExpr 
5f70: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
5f80: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
5f90: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
5fa0: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78  List;..  if( pEx
5fb0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
5fc0: 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ION ){.    retur
5fd0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
5fe0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
5ff0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
6000: 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20  atch")!=0 ){.   
6010: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6020: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
6030: 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
6040: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
6050: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6060: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
6070: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
6080: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
6090: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
60a0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
60b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
60c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
60d0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
60e0: 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73  the pBase expres
60f0: 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20  sion originated 
6100: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
6110: 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20  NG clause of.** 
6120: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61  a join, then tra
6130: 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70  nsfer the approp
6140: 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f  riate markings o
6150: 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a  ver to derived..
6160: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
6170: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
6180: 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76  ngs(Expr *pDeriv
6190: 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29  ed, Expr *pBase)
61a0: 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65 64  {.  if( pDerived
61b0: 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65 64   ){.    pDerived
61c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65  ->flags |= pBase
61d0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f  ->flags & EP_Fro
61e0: 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72 69  mJoin;.    pDeri
61f0: 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ved->iRightJoinT
6200: 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52  able = pBase->iR
6210: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20  ightJoinTable;. 
6220: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
6230: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
6240: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
6250: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6260: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6270: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
6280: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
6290: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
62a0: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
62b0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
62c0: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
62d0: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
62e0: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
62f0: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
6300: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
6340: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
6350: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
6360: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
6370: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
6380: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
6390: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
63a0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
63b0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
63c0: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
63d0: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
63e0: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
63f0: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
6400: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
6410: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
6420: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
6430: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
6440: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
6450: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
6460: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
6470: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
6480: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
6490: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
64a0: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
64b0: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
64c0: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
64d0: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
64e0: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
64f0: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
6500: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
6510: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
6520: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
6530: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
6540: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
6550: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
6560: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
6570: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
6580: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
6590: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
65a0: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
65b0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
65c0: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
65d0: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
65e0: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
65f0: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
6600: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
6610: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
6620: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
6630: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
6640: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
6650: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
6660: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
6670: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
6680: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
6690: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
66a0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
66b0: 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a  column of C and.
66c0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ** a single tabl
66d0: 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e  e T (as shown in
66e0: 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65   example B above
66f0: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  ) then create a 
6700: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
6710: 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65  erm that is an e
6720: 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70  quivalent IN exp
6730: 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  ression.  In oth
6740: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
6750: 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61   term.** being a
6760: 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a  nalyzed is:.**.*
6770: 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31  *      x = expr1
6780: 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20    OR  expr2 = x 
6790: 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a   OR  x = expr3.*
67a0: 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65  *.** then create
67b0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
67c0: 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  erm like this:.*
67d0: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
67e0: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
67f0: 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a  3).**.** CASE 2:
6800: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
6810: 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78  bterms are index
6820: 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65  able by a single
6830: 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73   table T, then s
6840: 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  et.**.**     Whe
6850: 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72  reTerm.eOperator
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
6870: 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68   WO_OR.**     Wh
6880: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
6890: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d  o->indexable  |=
68a0: 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    the cursor num
68b0: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a  ber for table T.
68c0: 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  **.** A subterm 
68d0: 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69  is "indexable" i
68e0: 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20 66  f it is of the f
68f0: 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e  orm.** "T.C <op>
6900: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 43   <expr>" where C
6910: 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   is any column o
6920: 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a  f table T and .*
6930: 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  * <op> is one of
6940: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c   "=", "<", "<=",
6950: 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20   ">", ">=", "IS 
6960: 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a  NULL", or "IN"..
6970: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
6980: 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69  also indexable i
6990: 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f  f it is an AND o
69a0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  f two or more.**
69b0: 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74 20   subsubterms at 
69c0: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69  least one of whi
69d0: 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e  ch is indexable.
69e0: 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20    Indexable AND 
69f0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76  .** subterms hav
6a00: 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f  e their eOperato
6a10: 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20  r set to WO_AND 
6a20: 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a  and they have.**
6a30: 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20   u.pAndInfo set 
6a40: 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  to a dynamically
6a50: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
6a60: 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a  AndTerm object..
6a70: 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68  **.** From anoth
6a80: 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77  er point of view
6a90: 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65  , "indexable" me
6aa0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
6ab0: 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f  term could.** po
6ac0: 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65  tentially be use
6ad0: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
6ae0: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
6af0: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a  e index exists..
6b00: 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  ** This analysis
6b10: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64   does not consid
6b20: 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  er whether or no
6b30: 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69 73  t the index exis
6b40: 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64  ts; that.** is d
6b50: 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72 65  ecided elsewhere
6b60: 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  .  This analysis
6b70: 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77   only looks at w
6b80: 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a  hether subterms.
6b90: 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
6ba0: 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73  or indexing exis
6bb0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61  t..**.** All exa
6bc0: 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20  mples A through 
6bd0: 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79 20  E above satisfy 
6be0: 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20  case 2.  But if 
6bf0: 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73  a term.** also s
6c00: 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31  tatisfies case 1
6c10: 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20   (such as B) we 
6c20: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70  know that the op
6c30: 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20  timizer will.** 
6c40: 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61  always prefer ca
6c50: 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74  se 1, so in that
6c60: 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64   case we pretend
6c70: 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20   that case 2 is 
6c80: 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64  not.** satisfied
6c90: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74  ..**.** It might
6ca0: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
6cb0: 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65  t multiple table
6cc0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e  s are indexable.
6cd0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a    For example,.*
6ce0: 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69  * (E) above is i
6cf0: 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c  ndexable on tabl
6d00: 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a  es P, Q, and R..
6d10: 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74  **.** Terms that
6d20: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20   satisfy case 2 
6d30: 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
6d40: 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69  or lookup by usi
6d50: 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69  ng.** separate i
6d60: 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72  ndices to find r
6d70: 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73  owids for each s
6d80: 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f  ubterm and compo
6d90: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f  sing.** the unio
6da0: 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20  n of all rowids 
6db0: 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f  using a RowSet o
6dc0: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20  bject.  This is 
6dd0: 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62  similar.** to "b
6de0: 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69  itmap indices" i
6df0: 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  n other database
6e00: 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20   engines..**.** 
6e10: 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a  OTHERWISE:.**.**
6e20: 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65   If neither case
6e30: 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70   1 nor case 2 ap
6e40: 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20  ply, then leave 
6e50: 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65  the eOperator se
6e60: 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54  t to.** zero.  T
6e70: 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
6e80: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63  useful for searc
6e90: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
6ea0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  d exprAnalyzeOrT
6eb0: 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  erm(.  SrcList *
6ec0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
6ed0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
6ee0: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
6ef0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
6f00: 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65     /* the comple
6f10: 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
6f20: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6f40: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  * Index of the O
6f50: 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  R-term to be ana
6f60: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
6f70: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
6f80: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20  = pWC->pWInfo;  
6f90: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
6fa0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
6fb0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
6fc0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
6fd0: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
6fe0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
6ff0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
7000: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7010: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
7020: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7030: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
7040: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7050: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
7060: 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20  erm];    /* The 
7070: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
7080: 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  zed */.  Expr *p
7090: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
70a0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
70b0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
70c0: 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a  on of the term *
70d0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7100: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
7110: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
7120: 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42  OrWc;       /* B
7130: 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20  reakup of pTerm 
7140: 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
7150: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f  .  WhereTerm *pO
7160: 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20  rTerm;       /* 
7170: 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69  A Sub-term withi
7180: 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20  n the pOrWc */. 
7190: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f   WhereOrInfo *pO
71a0: 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64  rInfo;     /* Ad
71b0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
71c0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
71d0: 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20  with pTerm */.  
71e0: 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e  Bitmask chngToIN
71f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
7200: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7210: 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f  atisfy case 1 */
7220: 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78  .  Bitmask index
7230: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
7240: 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  Tables that are 
7250: 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73  indexable, satis
7260: 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a  fying case 2 */.
7270: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b  .  /*.  ** Break
7280: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
7290: 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65  nto its separate
72a0: 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20   subterms.  The 
72b0: 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a  subterms are.  *
72c0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68  * stored in a Wh
72d0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
72e0: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77  ure containing w
72f0: 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f  ithin the WhereO
7300: 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63  rInfo.  ** objec
7310: 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68  t that is attach
7320: 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ed to the origin
7330: 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72  al OR clause ter
7340: 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  m..  */.  assert
7350: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
7360: 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49  s & (TERM_DYNAMI
7370: 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45  C|TERM_ORINFO|TE
7380: 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20  RM_ANDINFO))==0 
7390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
73a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
73b0: 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  .  pTerm->u.pOrI
73c0: 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20  nfo = pOrInfo = 
73d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
73e0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
73f0: 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28  pOrInfo));.  if(
7400: 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65   pOrInfo==0 ) re
7410: 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  turn;.  pTerm->w
7420: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
7430: 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d  RINFO;.  pOrWc =
7440: 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20   &pOrInfo->wc;. 
7450: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
7460: 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b  (pOrWc, pWInfo);
7470: 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f  .  whereSplit(pO
7480: 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  rWc, pExpr, TK_O
7490: 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a  R);.  exprAnalyz
74a0: 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63  eAll(pSrc, pOrWc
74b0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
74c0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
74d0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  rn;.  assert( pO
74e0: 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b  rWc->nTerm>=2 );
74f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70  ..  /*.  ** Comp
7500: 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74  ute the set of t
7510: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
7520: 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31   satisfy cases 1
7530: 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e   or 2..  */.  in
7540: 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d  dexable = ~(Bitm
7550: 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49  ask)0;.  chngToI
7560: 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  N = ~(Bitmask)0;
7570: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
7580: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
7590: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
75a0: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
75b0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
75c0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
75d0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
75e0: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
75f0: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
7600: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
7610: 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65    assert( (pOrTe
7620: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
7630: 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d  ERM_ANDINFO|TERM
7640: 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  _ORINFO))==0 );.
7650: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
7660: 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e   0;.      pAndIn
7670: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
7680: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
7690: 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a  of(*pAndInfo));.
76a0: 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e        if( pAndIn
76b0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  fo ){.        Wh
76c0: 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57  ereClause *pAndW
76d0: 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  C;.        Where
76e0: 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a  Term *pAndTerm;.
76f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
7700: 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
7710: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
7720: 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
7730: 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  o = pAndInfo;.  
7740: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
7750: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41  tFlags |= TERM_A
7760: 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20  NDINFO;.        
7770: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
7780: 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20  or = WO_AND;.   
7790: 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70       pAndWC = &p
77a0: 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
77b0: 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65       whereClause
77c0: 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43  Init(pAndWC, pWC
77d0: 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  ->pWInfo);.     
77e0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41     whereSplit(pA
77f0: 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  ndWC, pOrTerm->p
7800: 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  Expr, TK_AND);. 
7810: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
7820: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64  zeAll(pSrc, pAnd
7830: 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  WC);.        pAn
7840: 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57  dWC->pOuter = pW
7850: 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  C;.        testc
7860: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
7870: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
7880: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
7890: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
78a0: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
78b0: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
78c0: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
78d0: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
78e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
78f0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
7900: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
7910: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
7920: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
7930: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
7940: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
7950: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
7960: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54  >sMaskSet, pAndT
7970: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
7980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7990: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
79a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
79b0: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
79c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
79d0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
79e0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
79f0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ED ){.      /* S
7a00: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f  kip this term fo
7a10: 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73  r now.  We revis
7a20: 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72  it it when we pr
7a30: 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20  ocess the.      
7a40: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
7a50: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65   TERM_VIRTUAL te
7a60: 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  rm */.    }else{
7a70: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62  .      Bitmask b
7a80: 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d  ;.      b = getM
7a90: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
7aa0: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
7ab0: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
7ac0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
7ad0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
7ae0: 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20  IRTUAL ){.      
7af0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
7b00: 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  her = &pOrWc->a[
7b10: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
7b20: 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20  ];.        b |= 
7b30: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
7b40: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65  >sMaskSet, pOthe
7b50: 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  r->leftCursor);.
7b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
7b70: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
7b80: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
7b90: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7ba0: 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)==0 ){.     
7bb0: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
7bc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7bd0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
7be0: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
7bf0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
7c00: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
7c10: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
7c20: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
7c30: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
7c40: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
7c50: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
7c60: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
7c70: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
7c80: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
7c90: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
7ca0: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
7cb0: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
7cc0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7cd0: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
7ce0: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
7cf0: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
7d00: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
7d10: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
7d20: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
7d30: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
7d40: 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sfied..  **.  **
7d50: 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68   chngToIN will h
7d60: 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c  old either 0, 1,
7d70: 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65   or 2 bits.  The
7d80: 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e   0-bit case mean
7d90: 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72  s.  ** that ther
7da0: 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c  e is no possibil
7db0: 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ity of transform
7dc0: 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73  ing the OR claus
7dd0: 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49  e into an.  ** I
7de0: 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75  N operator becau
7df0: 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  se one or more t
7e00: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63  erms in the OR c
7e10: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20  lause contain.  
7e20: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ** something oth
7e30: 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20  er than == on a 
7e40: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69  column in the si
7e50: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
7e60: 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65   1-bit.  ** case
7e70: 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72   means that ever
7e80: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
7e90: 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68   clause is of th
7ea0: 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62  e form.  ** "tab
7eb0: 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20  le.column=expr" 
7ec0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
7ed0: 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20  table.  The one 
7ee0: 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a  bit that is set.
7ef0: 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73    ** will corres
7f00: 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d  pond to the comm
7f10: 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74  on table.  We st
7f20: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63  ill need to chec
7f30: 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  k to make.  ** s
7f40: 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ure the same col
7f50: 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61  umn is used on a
7f60: 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32  ll terms.  The 2
7f70: 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65  -bit case is whe
7f80: 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74  n.  ** the all t
7f90: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
7fa0: 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c  form "table1.col
7fb0: 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d  umn=table2.colum
7fc0: 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67  n".  It.  ** mig
7fd0: 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ht be possible t
7fe0: 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65  o form an IN ope
7ff0: 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65  rator with eithe
8000: 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a  r table1.column.
8010: 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63    ** or table2.c
8020: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53  olumn as the LHS
8030: 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f   if either is co
8040: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
8050: 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f  rm of.  ** the O
8060: 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  R clause..  **. 
8070: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65   ** Note that te
8080: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
8090: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74  "table.column1=t
80a0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74  able.column2" (t
80b0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
80c0: 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73  le on both sizes
80d0: 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e   of the ==) cann
80e0: 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e  ot be optimized.
80f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  .  */.  if( chng
8100: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ToIN ){.    int 
8110: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8120: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
8130: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
8140: 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a  to IN is valid *
8150: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
8160: 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  n = -1;         
8170: 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  /* Column index 
8180: 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65  on lhs of IN ope
8190: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  rator */.    int
81a0: 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20   iCursor = -1;  
81b0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
81c0: 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f  cursor common to
81d0: 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20   all terms */.  
81e0: 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20    int j = 0;    
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8200: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8210: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
8220: 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  r a table and co
8230: 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72  lumn that appear
8240: 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72  s on one side or
8250: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
8260: 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72  r of the == oper
8270: 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75  ator in every su
8280: 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62  bterm.  That tab
8290: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20  le and column.  
82a0: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63    ** will be rec
82b0: 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72  orded in iCursor
82c0: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54   and iColumn.  T
82d0: 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  here might not b
82e0: 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  e any.    ** suc
82f0: 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  h table and colu
8300: 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e  mn.  Set okToChn
8310: 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72  gToIN if an appr
8320: 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20  opriate table.  
8330: 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    ** and column 
8340: 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61  is found but lea
8350: 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  ve okToChngToIN 
8360: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
8370: 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nd..    */.    f
8380: 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21  or(j=0; j<2 && !
8390: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b  okToChngToIN; j+
83a0: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72  +){.      pOrTer
83b0: 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20  m = pOrWc->a;.  
83c0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
83d0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
83e0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
83f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8400: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
8410: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
8420: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8430: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
8440: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
8450: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
8460: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
8470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
8480: 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62   This is the 2-b
8490: 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61  it case and we a
84a0: 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  re on the second
84b0: 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20   iteration and. 
84c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
84d0: 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d  ent term is from
84e0: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
84f0: 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74  tion.  So skip t
8500: 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  his term. */.   
8510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
8520: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
8530: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8540: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8550: 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74   (chngToIN & get
8560: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
8570: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
8580: 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30  >leftCursor))==0
8590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
85a0: 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20   This term must 
85b0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74  be of the form t
85c0: 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20  1.a==t2.b where 
85d0: 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20  t2 is in the.   
85e0: 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f         ** chngTo
85f0: 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73  IN set but t1 is
8600: 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d   not.  This term
8610: 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20   will be either 
8620: 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20  preceeded.      
8630: 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65      ** or follwe
8640: 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64  d by an inverted
8650: 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e   copy (t2.b==t1.
8660: 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74  a).  Skip this t
8670: 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a  erm .          *
8680: 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e  * and use its in
8690: 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  version. */.    
86a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
86b0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
86c0: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29   & TERM_COPIED )
86d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
86e0: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
86f0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
8700: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
8710: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
8720: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
8730: 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f  ERM_COPIED|TERM_
8740: 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20  VIRTUAL) );.    
8750: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8760: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8770: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54    iColumn = pOrT
8780: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
8790: 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73  n;.        iCurs
87a0: 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  or = pOrTerm->le
87b0: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
87c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
87d0: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29  .      if( i<0 )
87e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
87f0: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b  candidate table+
8800: 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64  column was found
8810: 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
8820: 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a   occur.        *
8830: 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  * on the second 
8840: 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  iteration */.   
8850: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
8860: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
8870: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
8880: 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20  o(chngToIN) );. 
8890: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
88a0: 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b  hngToIN==getMask
88b0: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
88c0: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
88d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
88e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
88f0: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
8900: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
8910: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
8920: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
8930: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
8940: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
8950: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
8960: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
8970: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
8980: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
8990: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
89a0: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
89b0: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
89c0: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
89d0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
89e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
89f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8a00: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
8a10: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
8a20: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73  eftCursor!=iCurs
8a30: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
8a40: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8a50: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
8a60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
8a70: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  f( pOrTerm->u.le
8a80: 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  ftColumn!=iColum
8a90: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  n ){.          o
8aa0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8ab0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8ac0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66            int af
8ad0: 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b  fLeft, affRight;
8ae0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
8af0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
8b00: 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63  side is also a c
8b10: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
8b20: 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20  affinities.     
8b30: 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20       ** of both 
8b40: 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  right and left s
8b50: 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63  ides must be suc
8b60: 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20  h that no type. 
8b70: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76           ** conv
8b80: 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75  ersions are requ
8b90: 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68  ired on the righ
8ba0: 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34  t.  (Ticket #224
8bb0: 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  9).          */.
8bc0: 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67            affRig
8bd0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
8be0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
8bf0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
8c00: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c  ;.          affL
8c10: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
8c20: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
8c30: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
8c40: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
8c50: 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61  affRight!=0 && a
8c60: 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74  ffRight!=affLeft
8c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8c80: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8c90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8ca0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
8cb0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8cc0: 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  |= TERM_OR_OK;. 
8cd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8ce0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8cf0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
8d00: 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68  is point, okToCh
8d10: 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69  ngToIN is true i
8d20: 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d  f original pTerm
8d30: 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a   satisfies.    *
8d40: 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68  * case 1.  In th
8d50: 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75  at case, constru
8d60: 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  ct a new virtual
8d70: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20   term that is . 
8d80: 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76     ** pTerm conv
8d90: 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e  erted into an IN
8da0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
8db0: 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68  /.    if( okToCh
8dc0: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20  ngToIN ){.      
8dd0: 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20  Expr *pDup;     
8de0: 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e         /* A tran
8df0: 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20  sient duplicate 
8e00: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
8e10: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
8e20: 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ist = 0;   /* Th
8e30: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
8e40: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
8e50: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
8e60: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  0;       /* The 
8e70: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
8e80: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
8e90: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
8ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
8eb0: 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74  mplete IN operat
8ec0: 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  or */..      for
8ed0: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
8ee0: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
8ef0: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
8f00: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
8f10: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
8f20: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8f30: 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e  _OR_OK)==0 ) con
8f40: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
8f50: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
8f60: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
8f70: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Q );.        ass
8f80: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  ert( pOrTerm->le
8f90: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8fa0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  r );.        ass
8fb0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  ert( pOrTerm->u.
8fc0: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
8fd0: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
8fe0: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
8ff0: 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d  rDup(db, pOrTerm
9000: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
9010: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69   0);.        pLi
9020: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
9030: 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66  ListAppend(pWInf
9040: 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74  o->pParse, pList
9050: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
9060: 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d   pLeft = pOrTerm
9070: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  ->pExpr->pLeft;.
9080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
9090: 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
90a0: 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73  ;.      pDup = s
90b0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
90c0: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
90d0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
90e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
90f0: 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30  K_IN, pDup, 0, 0
9100: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
9110: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  w ){.        int
9120: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
9130: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
9140: 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70  kings(pNew, pExp
9150: 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
9160: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9170: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
9180: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
9190: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73      pNew->x.pLis
91a0: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  t = pList;.     
91b0: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
91c0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
91d0: 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49  C, pNew, TERM_VI
91e0: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
91f0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  IC);.        tes
9200: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
9210: 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72   );.        expr
9220: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
9230: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
9240: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
9250: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
9260: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
9270: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
9280: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
9290: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
92a0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
92b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
92c0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
92d0: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  , pList);.      
92e0: 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65  }.      pTerm->e
92f0: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f  Operator = WO_NO
9300: 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74  OP;  /* case 1 t
9310: 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a  rumps case 2 */.
9320: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
9330: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
9340: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
9350: 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d  ON && !SQLITE_OM
9360: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
9380: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
9390: 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20  is an WhereTerm 
93a0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f  structure with o
93b0: 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70  nly the.** "pExp
93c0: 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20  r" field filled 
93d0: 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  in.  The job of 
93e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
93f0: 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a  to analyze the.*
9400: 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
9410: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c  and populate all
9420: 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64   the other field
9430: 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65  s of the WhereTe
9440: 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  rm.** structure.
9450: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
9460: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
9470: 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20  he form "<expr> 
9480: 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20  <op> X" it gets 
9490: 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74  commuted.** to t
94a0: 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d  he standard form
94b0: 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   of "X <op> <exp
94c0: 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  r>"..**.** If th
94d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
94e0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
94f0: 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74  op> Y" where bot
9500: 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a  h X and Y are.**
9510: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74   columns, then t
9520: 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72  he original expr
9530: 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e  ession is unchan
9540: 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69  ged and a new vi
9550: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66  rtual.** term of
9560: 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70   the form "Y <op
9570: 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f  > X" is added to
9580: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9590: 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65  e and.** analyze
95a0: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54  d separately.  T
95b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
95c0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
95d0: 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61  TERM_COPIED.** a
95e0: 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20  nd the new term 
95f0: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
9600: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63  ERM_DYNAMIC (bec
9610: 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a  ause it's pExpr.
9620: 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  ** needs to be f
9630: 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68  reed with the Wh
9640: 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54  ereClause) and T
9650: 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63  ERM_VIRTUAL (bec
9660: 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20  ause it.** is a 
9670: 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66  commuted copy of
9680: 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20   a prior term.) 
9690: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
96a0: 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a  rm has nChild=1.
96b0: 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20  ** and the copy 
96c0: 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65  has idxParent se
96d0: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
96e0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  f the original t
96f0: 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  erm..*/.static v
9700: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
9710: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
9720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
9730: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
9740: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
9750: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
9760: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
9770: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
9780: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
9790: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
97a0: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
97b0: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
97c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
97d0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f  = pWC->pWInfo; /
97e0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  * WHERE clause p
97f0: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
9800: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
9810: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
9820: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
9830: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
9840: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  ed */.  WhereMas
9850: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
9860: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
9870: 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d  of table index m
9880: 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a  asks */.  Expr *
9890: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
98b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
98c0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
98d0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c   Bitmask prereqL
98e0: 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
98f0: 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74    /* Prerequesit
9900: 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d  es of the pExpr-
9910: 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d  >pLeft */.  Bitm
9920: 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ask prereqAll;  
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9940: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
9950: 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d   pExpr */.  Bitm
9960: 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d  ask extraRight =
9970: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
9980: 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69  Extra dependenci
9990: 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20  es on LEFT JOIN 
99a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31  */.  Expr *pStr1
99b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
99c0: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
99d0: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
99e0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  or */.  int isCo
99f0: 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20  mplete = 0;     
9a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
9a10: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64  of LIKE/GLOB end
9a20: 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64 20  s with wildcard 
9a30: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20  */.  int noCase 
9a40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9a50: 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c        /* LIKE/GL
9a60: 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65 73  OB distinguishes
9a70: 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
9a80: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9aa0: 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f  op-level operato
9ab0: 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f  r.  pExpr->op */
9ac0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9ad0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
9ae0: 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63  e;  /* Parsing c
9af0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
9b00: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9b10: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  ->db;        /* 
9b20: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
9b30: 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62  ion */..  if( db
9b40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9b50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
9b60: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
9b70: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
9b80: 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e  pMaskSet = &pWIn
9b90: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20  fo->sMaskSet;.  
9ba0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
9bb0: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
9bc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53  pExpr->op!=TK_AS
9bd0: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
9be0: 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70  K_COLLATE );.  p
9bf0: 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72  rereqLeft = expr
9c00: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9c10: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Set, pExpr->pLef
9c20: 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  t);.  op = pExpr
9c30: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
9c40: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73  TK_IN ){.    ass
9c50: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
9c60: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ht==0 );.    if(
9c70: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
9c80: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
9c90: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70  lect) ){.      p
9ca0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9cb0: 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61  t = exprSelectTa
9cc0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
9cd0: 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
9ce0: 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ect);.    }else{
9cf0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
9d00: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9d10: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
9d20: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9d30: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
9d40: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
9d50: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
9d60: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
9d70: 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ght = 0;.  }else
9d80: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
9d90: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54  reqRight = exprT
9da0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9db0: 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  et, pExpr->pRigh
9dc0: 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71  t);.  }.  prereq
9dd0: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
9de0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
9df0: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70  Expr);.  if( Exp
9e00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
9e10: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
9e20: 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
9e30: 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  x = getMask(pMas
9e40: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69  kSet, pExpr->iRi
9e50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20  ghtJoinTable);. 
9e60: 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20     prereqAll |= 
9e70: 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68  x;.    extraRigh
9e80: 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20  t = x-1;  /* ON 
9e90: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79  clause terms may
9ea0: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
9eb0: 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20  h an index.     
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62    ** on left tab
9ee0: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
9ef0: 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  N.  Ticket #3015
9f00: 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d   */.  }.  pTerm-
9f10: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
9f20: 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d  reqAll;.  pTerm-
9f30: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31  >leftCursor = -1
9f40: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
9f50: 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  nt = -1;.  pTerm
9f60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b  ->eOperator = 0;
9f70: 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70  .  if( allowedOp
9f80: 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72  (op) ){.    Expr
9f90: 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65   *pLeft = sqlite
9fa0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
9fb0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
9fc0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
9fd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
9fe0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
9ff0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31  >pRight);.    u1
a000: 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72  6 opMask = (pTer
a010: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
a020: 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20   prereqLeft)==0 
a030: 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51  ? WO_ALL : WO_EQ
a040: 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  UIV;.    if( pLe
a050: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
a060: 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  N ){.      pTerm
a070: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
a080: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
a090: 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66      pTerm->u.lef
a0a0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
a0b0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
a0c0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
a0d0: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
a0e0: 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20  op) & opMask;.  
a0f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67    }.    if( pRig
a100: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70  ht && pRight->op
a110: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
a120: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
a130: 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
a140: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31   *pDup;.      u1
a150: 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20  6 eExtraOp = 0; 
a160: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
a170: 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65  bits for pNew->e
a180: 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Operator */.    
a190: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
a1a0: 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20  tCursor>=0 ){.  
a1b0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
a1c0: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
a1d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a1e0: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
a1f0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
a200: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
a210: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a220: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
a230: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
a240: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
a250: 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  }.        idxNew
a260: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
a270: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
a280: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
a290: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
a2a0: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
a2b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
a2c0: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
a2d0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
a2e0: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
a2f0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
a300: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
a310: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
a320: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
a330: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
a340: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
a350: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
a360: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
a370: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20  pr->op==TK_EQ.  
a380: 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48         && !ExprH
a390: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
a3a0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
a3b0: 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
a3c0: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
a3d0: 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69  b, SQLITE_Transi
a3e0: 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b  tive).        ){
a3f0: 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
a400: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57  ->eOperator |= W
a410: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
a420: 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f     eExtraOp = WO
a430: 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20  _EQUIV;.        
a440: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
a450: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
a460: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
a470: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
a480: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
a490: 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75  mute(pParse, pDu
a4a0: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
a4b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
a4c0: 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70  pCollate(pDup->p
a4d0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65  Left);.      pNe
a4e0: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
a4f0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
a500: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66       pNew->u.lef
a510: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
a520: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
a530: 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65  testcase( (prere
a540: 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67  qLeft | extraRig
a550: 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66  ht) != prereqLef
a560: 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
a570: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
a580: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
a590: 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e  aRight;.      pN
a5a0: 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  ew->prereqAll = 
a5b0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20  prereqAll;.     
a5c0: 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72   pNew->eOperator
a5d0: 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b   = (operatorMask
a5e0: 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78  (pDup->op) + eEx
a5f0: 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b  traOp) & opMask;
a600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
a610: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a620: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
a630: 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74  TION.  /* If a t
a640: 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45  erm is the BETWE
a650: 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65  EN operator, cre
a660: 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74  ate two new virt
a670: 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74  ual terms.  ** t
a680: 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72  hat define the r
a690: 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45  ange that the BE
a6a0: 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73  TWEEN implements
a6b0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
a6c0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61    **.  **      a
a6d0: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
a6e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f  .  **.  ** is co
a6f0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20  nverted into:.  
a700: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20  **.  **      (a 
a710: 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29  BETWEEN b AND c)
a720: 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20   AND (a>=b) AND 
a730: 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a  (a<=c).  **.  **
a740: 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72   The two new ter
a750: 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74  ms are added ont
a760: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
a770: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
a780: 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65  ect..  ** The ne
a790: 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e  w terms are "dyn
a7a0: 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63 68  amic" and are ch
a7b0: 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72  ildren of the or
a7c0: 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20  iginal BETWEEN. 
a7d0: 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20   ** term.  That 
a7e0: 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
a7f0: 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69  e BETWEEN term i
a800: 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69  s coded, the chi
a810: 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73  ldren are.  ** s
a820: 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20  kipped.  Or, if 
a830: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
a840: 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61 6e   satisfied by an
a850: 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67   index, the orig
a860: 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45  inal.  ** BETWEE
a870: 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65  N term is skippe
a880: 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
a890: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
a8a0: 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d  _BETWEEN && pWC-
a8b0: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
a8c0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
a8d0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
a8e0: 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ist;.    int i;.
a8f0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
a900: 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f   u8 ops[] = {TK_
a910: 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20  GE, TK_LE};.    
a920: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
a930: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a940: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20  pList->nExpr==2 
a950: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
a960: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
a970: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
a980: 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65  .      int idxNe
a990: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  w;.      pNewExp
a9a0: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
a9b0: 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c  (pParse, ops[i],
a9c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
a9e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a9f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
aa00: 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
aa30: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
aa40: 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20  pExpr, 0), 0);. 
aa50: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
aa60: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
aa70: 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
aa80: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
aa90: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
aaa0: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
aab0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
aac0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
aad0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
aae0: 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  0 );.      exprA
aaf0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
ab00: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
ab10: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
ab20: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
ab30: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
ab40: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
ab50: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65  m;.    }.    pTe
ab60: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
ab70: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
ab80: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
ab90: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
aba0: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
abb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
abc0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
abd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
abe0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
abf0: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65   /* Analyze a te
ac00: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f  rm that is compo
ac10: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sed of two or mo
ac20: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
ac30: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e  ected by.  ** an
ac40: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   OR operator..  
ac50: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
ac60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
ac70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
ac80: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  C->op==TK_AND );
ac90: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
aca0: 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43  OrTerm(pSrc, pWC
acb0: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
acc0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
acd0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65  idxTerm];.  }.#e
ace0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
acf0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
ad00: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
ad10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
ad20: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
ad30: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
ad40: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
ad50: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
ad60: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
ad70: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
ad80: 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20   **.  ** A like 
ad90: 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66  pattern of the f
ada0: 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63  orm "x LIKE 'abc
adb0: 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69  %'" is changed i
adc0: 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nto constraints.
add0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
ade0: 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20     x>='abc' AND 
adf0: 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49  x<'abd' AND x LI
ae00: 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20  KE 'abc%'.  **. 
ae10: 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61   ** The last cha
ae20: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72  racter of the pr
ae30: 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e  efix "abc" is in
ae40: 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72  cremented to for
ae50: 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69  m the.  ** termi
ae60: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
ae70: 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69   "abd"..  */.  i
ae80: 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  f( pWC->op==TK_A
ae90: 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65  ND .   && isLike
aea0: 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70  OrGlob(pParse, p
aeb0: 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69  Expr, &pStr1, &i
aec0: 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61  sComplete, &noCa
aed0: 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70  se).  ){.    Exp
aee0: 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
aef0: 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* LHS of LIKE/G
af00: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
af10: 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b      Expr *pStr2;
af20: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
af30: 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66  f pStr1 - RHS of
af40: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
af50: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
af60: 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20  *pNewExpr1;.    
af70: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b  Expr *pNewExpr2;
af80: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31  .    int idxNew1
af90: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
afa0: 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f  2;.    Token sCo
afb0: 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e  llSeqName;  /* N
afc0: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67  ame of collating
afd0: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
afe0: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
aff0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
b000: 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20  Expr;.    pStr2 
b010: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b020: 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  (db, pStr1, 0);.
b030: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
b040: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b050: 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20     u8 c, *pC;   
b060: 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72      /* Last char
b070: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
b080: 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20   first wildcard 
b090: 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75  */.      pC = (u
b0a0: 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f  8*)&pStr2->u.zTo
b0b0: 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ken[sqlite3Strle
b0c0: 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f  n30(pStr2->u.zTo
b0d0: 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63  ken)-1];.      c
b0e0: 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66   = *pC;.      if
b0f0: 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20  ( noCase ){.    
b100: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
b110: 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74   is to increment
b120: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
b130: 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  ter before the f
b140: 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  irst.        ** 
b150: 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69  wildcard.  But i
b160: 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27  f we increment '
b170: 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75  @', that will pu
b180: 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20  sh it into the. 
b190: 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62         ** alphab
b1a0: 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72 65  etic range where
b1b0: 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e   case conversion
b1c0: 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74  s will mess up t
b1d0: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  he .        ** i
b1e0: 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61  nequality.  To a
b1f0: 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20  void this, make 
b200: 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e  sure to also run
b210: 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20   the full.      
b220: 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c    ** LIKE on all
b230: 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65   candidate expre
b240: 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69  ssions by cleari
b250: 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74  ng the isComplet
b260: 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a  e flag.        *
b270: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  /.        if( c=
b280: 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c  ='A'-1 ) isCompl
b290: 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ete = 0;.       
b2a0: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65   c = sqlite3Uppe
b2b0: 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20  rToLower[c];.   
b2c0: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d     }.      *pC =
b2d0: 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20   c + 1;.    }.  
b2e0: 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a    sCollSeqName.z
b2f0: 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43   = noCase ? "NOC
b300: 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b  ASE" : "BINARY";
b310: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
b320: 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65  e.n = 6;.    pNe
b330: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
b340: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
b350: 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  t, 0);.    pNewE
b360: 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr1 = sqlite3PE
b370: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47  xpr(pParse, TK_G
b380: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 73  E, .           s
b390: 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
b3a0: 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65  lateToken(pParse
b3b0: 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c  ,pNewExpr1,&sCol
b3c0: 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20  lSeqName),.     
b3d0: 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b        pStr1, 0);
b3e0: 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69  .    transferJoi
b3f0: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
b400: 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pr1, pExpr);.   
b410: 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65   idxNew1 = where
b420: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
b430: 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52  , pNewExpr1, TER
b440: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
b450: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
b460: 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d  tcase( idxNew1==
b470: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
b480: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
b490: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
b4a0: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
b4b0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
b4c0: 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
b4d0: 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50  Expr2 = sqlite3P
b4e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b4f0: 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  LT,.           s
b500: 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
b510: 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65  lateToken(pParse
b520: 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f 6c  ,pNewExpr2,&sCol
b530: 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20  lSeqName),.     
b540: 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b        pStr2, 0);
b550: 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69  .    transferJoi
b560: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
b570: 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pr2, pExpr);.   
b580: 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
b590: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
b5a0: 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
b5b0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
b5c0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
b5d0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d  tcase( idxNew2==
b5e0: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
b5f0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
b600: 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
b610: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
b620: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
b630: 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
b640: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
b650: 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
b660: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
b670: 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
b680: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
b690: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
b6a0: 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
b6b0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b6c0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
b6d0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
b6e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b6f0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
b700: 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41    /* Add a WO_MA
b710: 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65  TCH auxiliary te
b720: 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72  rm to the constr
b730: 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a  aint set if the.
b740: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70    ** current exp
b750: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
b760: 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20  e form:  column 
b770: 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a  MATCH expr..  **
b780: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
b790: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
b7a0: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
b7b0: 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74  ods of.  ** virt
b7c0: 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ual tables.  The
b7d0: 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70   native query op
b7e0: 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74  timizer does not
b7f0: 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
b800: 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74   do anything wit
b810: 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e  h MATCH function
b820: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  s..  */.  if( is
b830: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45  MatchOfColumn(pE
b840: 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
b850: 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72  idxNew;.    Expr
b860: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
b870: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
b880: 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42  *pNewTerm;.    B
b890: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c  itmask prereqCol
b8a0: 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b  umn, prereqExpr;
b8b0: 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ..    pRight = p
b8c0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
b8d0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [0].pExpr;.    p
b8e0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Left = pExpr->x.
b8f0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
b900: 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
b910: 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
b920: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
b930: 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
b940: 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
b950: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
b960: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
b970: 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
b980: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
b990: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
b9a0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
b9b0: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
b9c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
b9d0: 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20  TK_MATCH, .     
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
ba00: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ba10: 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20  Right, 0), 0);. 
ba20: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
ba30: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
ba40: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
ba50: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
ba60: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
ba70: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
ba80: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  w==0 );.      pN
ba90: 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
baa0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
bab0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
bac0: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78  Right = prereqEx
bad0: 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  pr;.      pNewTe
bae0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
baf0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
bb00: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb10: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
bb20: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
bb30: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
bb40: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41  Operator = WO_MA
bb50: 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  TCH;.      pNewT
bb60: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
bb70: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
bb80: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
bb90: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
bba0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
bbb0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
bbc0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
bbd0: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
bbe0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
bbf0: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
bc00: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
bc10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
bc20: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
bc30: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
bc40: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
bc50: 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57 68  OR_STAT4.  /* Wh
bc60: 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  en sqlite_stat3 
bc70: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
bc80: 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f  s available an o
bc90: 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20  perator of the. 
bca0: 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e   ** form "x IS N
bcb0: 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d  OT NULL" can som
bcc0: 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61  etimes be evalua
bcd0: 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65  ted more efficie
bce0: 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e  ntly.  ** as "x>
bcf0: 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f  NULL" if x is no
bd00: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
bd10: 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f  MARY KEY.  So co
bd20: 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76  nstruct a.  ** v
bd30: 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74  irtual term of t
bd40: 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20  hat form..  **. 
bd50: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
bd60: 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d  e virtual term m
bd70: 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69  ust be tagged wi
bd80: 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20  th TERM_VNULL.  
bd90: 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56  This.  ** TERM_V
bda0: 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75  NULL tag will su
bdb0: 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e  ppress the not-n
bdc0: 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65  ull check at the
bdd0: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
bde0: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69  of the loop.  Wi
bdf0: 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56  thout the TERM_V
be00: 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e  NULL flag, the n
be10: 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
be20: 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20  .  ** the start 
be30: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  of the loop will
be40: 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73   prevent any res
be50: 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20  ults from being 
be60: 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20  returned..  */. 
be70: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
be80: 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
be90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
bea0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
beb0: 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
bec0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26  >iColumn>=0.   &
bed0: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
bee0: 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
bef0: 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20 20  _Stat3).  ){.   
bf00: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
bf10: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
bf20: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
bf30: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
bf40: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
bf50: 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
bf60: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
bf70: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
bf80: 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
bfb0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
bfe0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
bff0: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
c000: 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
c010: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
c020: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
c030: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
c060: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
c070: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
c080: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
c090: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
c0a0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c0b0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c0c0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
c0d0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c0e0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c0f0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c100: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
c110: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
c120: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
c130: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
c140: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
c150: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
c160: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
c170: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
c180: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
c190: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
c1a0: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
c1b0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
c1c0: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
c1d0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c1e0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
c1f0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
c200: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c210: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
c220: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
c230: 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
c240: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
c250: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
c260: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
c270: 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
c280: 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
c290: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
c2a0: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
c2b0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
c2c0: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
c2d0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
c2e0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
c2f0: 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20 65  es pList for a e
c300: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 65  ntry that matche
c310: 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  s the iCol-th co
c320: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78  lumn.** of index
c330: 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pIdx..**.** If 
c340: 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69  such an expressi
c350: 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73  on is found, its
c360: 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d   index in pList-
c370: 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64  >a[] is returned
c380: 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65  . If.** no expre
c390: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
c3a0: 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
c3b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
c3c0: 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61  ndIndexCol(.  Pa
c3d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3f0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
c400: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
c410: 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
c420: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c430: 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68  n list to search
c440: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c   */.  int iBase,
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
c470: 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69  for table associ
c480: 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a  ated with pIdx *
c490: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
c4c0: 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  match column of 
c4d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f       /* Column o
c500: 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  f index to match
c510: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
c520: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
c530: 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
c540: 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72  ll[iCol];..  for
c550: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
c560: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
c570: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
c580: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
c590: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
c5a0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  pr);.    if( p->
c5b0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
c5c0: 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e     && p->iColumn
c5d0: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
c5e0: 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70  [iCol].     && p
c5f0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a  ->iTable==iBase.
c600: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c      ){.      Col
c610: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
c620: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
c630: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
c640: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
c650: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43     if( ALWAYS(pC
c660: 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74  oll) && 0==sqlit
c670: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
c680: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
c690: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
c6a0: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
c6b0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c6c0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
c6d0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
c6e0: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
c6f0: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
c700: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
c710: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
c720: 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
c730: 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
c740: 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68 65  redundant if the
c750: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
c760: 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20 6f  ns some subset o
c770: 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61  f.** columns tha
c780: 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e 64  t are unique and
c790: 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74   non-null..*/.st
c7a0: 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69  atic int isDisti
c7b0: 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20  nctRedundant(.  
c7c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c7e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c7f0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
c800: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ist,        /* T
c810: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
c820: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
c830: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
c840: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
c850: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
c860: 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20 20  *pDistinct      
c870: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
c880: 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  et that needs to
c890: 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a   be DISTINCT */.
c8a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
c8b0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
c8c0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b     .  int iBase;
c8f0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
c900: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
c910: 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65   table or sub-se
c920: 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d  lect in the FROM
c930: 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20   clause of.  ** 
c940: 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
c950: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
c960: 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77  possible to show
c970: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
c980: 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20  CT .  ** clause 
c990: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
c9a0: 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
c9b0: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
c9c0: 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70  n 0;.  iBase = p
c9d0: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
c9e0: 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20  ursor;.  pTab = 
c9f0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
ca00: 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  Tab;..  /* If an
ca10: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
ca20: 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63  ions is an IPK c
ca30: 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69  olumn on table i
ca40: 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72  Base, then retur
ca50: 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f  n .  ** true. No
ca60: 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62  te: The (p->iTab
ca70: 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20  le==iBase) part 
ca80: 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61 79  of this test may
ca90: 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68 65   be false if the
caa0: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45  .  ** current SE
cab0: 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c  LECT is a correl
cac0: 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ated sub-query..
cad0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
cae0: 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78  i<pDistinct->nEx
caf0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
cb00: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
cb10: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
cb20: 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70  Distinct->a[i].p
cb30: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
cb40: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
cb50: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
cb60: 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ase && p->iColum
cb70: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  n<0 ) return 1;.
cb80: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74    }..  /* Loop t
cb90: 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63  hrough all indic
cba0: 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c  es on the table,
cbb0: 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74   checking each t
cbc0: 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65  o see if it make
cbd0: 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49  s.  ** the DISTI
cbe0: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65  NCT qualifier re
cbf0: 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73  dundant. It does
cc00: 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a   so if:.  **.  *
cc10: 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78  *   1. The index
cc20: 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55   is itself UNIQU
cc30: 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a  E, and.  **.  **
cc40: 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65     2. All of the
cc50: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
cc60: 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72  index are either
cc70: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69   part of the pDi
cc80: 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20  stinct.  **     
cc90: 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74   list, or else t
cca0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
ccb0: 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20  contains a term 
ccc0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c  of the form "col
ccd0: 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77  =X",.  **      w
cce0: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73  here X is a cons
ccf0: 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20  tant value. The 
cd00: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
cd10: 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ces of the.  ** 
cd20: 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20       comparison 
cd30: 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  and select-list 
cd40: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
cd50: 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20   match those of 
cd60: 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
cd70: 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66    **   3. All of
cd80: 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c   those index col
cd90: 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74  umns for which t
cda0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
cdb0: 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20  does not.  **   
cdc0: 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f     contain a "co
cdd0: 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75  l=X" term are su
cde0: 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e  bject to a NOT N
cdf0: 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  ULL constraint..
ce00: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
ce10: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ce20: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
ce30: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 21  Next){.    if( !
ce40: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
ce50: 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dx) ) continue;.
ce60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ce70: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Idx->nKeyCol; i+
ce80: 2b 29 7b 0a 20 20 20 20 20 20 69 31 36 20 69 43  +){.      i16 iC
ce90: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
cea0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
ceb0: 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57  ( 0==findTerm(pW
cec0: 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20  C, iBase, iCol, 
ced0: 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f  ~(Bitmask)0, WO_
cee0: 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  EQ, pIdx) ){.   
cef0: 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c       int iIdxCol
cf00: 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28   = findIndexCol(
cf10: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
cf20: 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20  t, iBase, pIdx, 
cf30: 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
cf40: 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61  iIdxCol<0 || pTa
cf50: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
cf60: 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
cf70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cf80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
cf90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
cfa0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
cfb0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
cfc0: 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61  ndex implies tha
cfd0: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  t the DISTINCT q
cfe0: 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75  ualifier is redu
cff0: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ndant. */.      
d000: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
d010: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
d020: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  .}.../*.** Estim
d030: 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68  ate the logarith
d040: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
d050: 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a  alue to base 2..
d060: 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
d070: 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e   estLog(LogEst N
d080: 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e 3c 3d 31  ){.  return N<=1
d090: 30 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4c  0 ? 0 : sqlite3L
d0a0: 6f 67 45 73 74 28 4e 29 20 2d 20 33 33 3b 0a 7d  ogEst(N) - 33;.}
d0b0: 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
d0c0: 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
d0d0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
d0e0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
d0f0: 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
d100: 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
d110: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
d120: 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
d130: 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
d140: 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
d150: 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
d160: 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
d170: 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
d180: 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
d190: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d1a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
d1b0: 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  && defined(WHERE
d1c0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73  TRACE_ENABLED).s
d1d0: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
d1e0: 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69  _IDX_INPUTS(sqli
d1f0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
d200: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
d210: 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
d220: 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
d230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d240: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
d250: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
d260: 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e  bugPrintf("  con
d270: 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c  straint[%d]: col
d280: 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70  =%d termid=%d op
d290: 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e  =%d usabled=%d\n
d2a0: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
d2b0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
d2c0: 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  nt[i].iColumn,. 
d2d0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d2e0: 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
d2f0: 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  set,.       p->a
d300: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70  Constraint[i].op
d310: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
d320: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
d330: 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
d340: 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79  0; i<p->nOrderBy
d350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
d360: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d370: 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63    orderby[%d]: c
d380: 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22  ol=%d desc=%d\n"
d390: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
d3a0: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
d3b0: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
d3c0: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
d3d0: 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74  .desc);.  }.}.st
d3e0: 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
d3f0: 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69  IDX_OUTPUTS(sqli
d400: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
d410: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
d420: 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
d430: 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
d440: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d450: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
d460: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
d470: 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61  bugPrintf("  usa
d480: 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d  ge[%d]: argvIdx=
d490: 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20  %d omit=%d\n",. 
d4a0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
d4b0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
d4c0: 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
d4d0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
d4e0: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
d4f0: 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  omit);.  }.  sql
d500: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
d510: 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c  "  idxNum=%d\n",
d520: 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73   p->idxNum);.  s
d530: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d540: 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e  f("  idxStr=%s\n
d550: 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20  ", p->idxStr);. 
d560: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d570: 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f  ntf("  orderByCo
d580: 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d  nsumed=%d\n", p-
d590: 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
d5a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
d5b0: 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
d5c0: 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20  atedCost=%g\n", 
d5d0: 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  p->estimatedCost
d5e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
d5f0: 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
d600: 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22  atedRows=%lld\n"
d610: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  , p->estimatedRo
d620: 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  ws);.}.#else.#de
d630: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49  fine TRACE_IDX_I
d640: 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65  NPUTS(A).#define
d650: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
d660: 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69  TS(A).#endif..#i
d670: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d680: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
d690: 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  X./*.** Return T
d6a0: 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45  RUE if the WHERE
d6b0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65   clause term pTe
d6c0: 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20  rm is of a form 
d6d0: 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c  where it.** coul
d6e0: 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  d be used with a
d6f0: 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73  n index to acces
d700: 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67  s pSrc, assuming
d710: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a   an appropriate.
d720: 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64  ** index existed
d730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d740: 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
d750: 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  x(.  WhereTerm *
d760: 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  pTerm,          
d770: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
d780: 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63  use term to chec
d790: 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  k */.  struct Sr
d7a0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
d7b0: 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77  ,     /* Table w
d7c0: 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
d7d0: 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d  access */.  Bitm
d7e0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
d7f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
d800: 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f  bles in outer lo
d810: 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ops of the join 
d820: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66  */.){.  char aff
d830: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c  ;.  if( pTerm->l
d840: 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d  eftCursor!=pSrc-
d850: 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72  >iCursor ) retur
d860: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
d870: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
d880: 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72  O_EQ)==0 ) retur
d890: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
d8a0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
d8b0: 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
d8c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
d8d0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
d8e0: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30  umn<0 ) return 0
d8f0: 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
d900: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
d910: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
d920: 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
d930: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
d940: 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
d950: 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
d960: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
d970: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  1;.}.#endif...#i
d980: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d990: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
d9a0: 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
d9b0: 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
d9c0: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
d9d0: 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
d9e0: 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
d9f0: 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
da00: 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
da10: 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
da20: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
da30: 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
da40: 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
da50: 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
da60: 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
da70: 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
da80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
da90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
daa0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
dab0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
dac0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
dad0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
dae0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
daf0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
db00: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
db10: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
db20: 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
db30: 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
db40: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
db50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
db60: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
db70: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
db80: 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
db90: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
dba0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
dbb0: 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
dbc0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f  .){.  int nKeyCo
dbd0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
dbe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
dbf0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
dc00: 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
dc10: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
dc20: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
dc30: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
dc40: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
dc50: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
dc60: 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
dc70: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
dc80: 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49   pWC->a[] */.  I
dc90: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
dca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
dcb0: 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
dcc0: 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
dcd0: 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
dce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dcf0: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
dd00: 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
dd10: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
dd20: 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd40: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
dd50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
dd60: 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
dd70: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd90: 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
dda0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
ddb0: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
ddc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
ddd0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c  of the index fil
dde0: 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  l loop */.  int 
ddf0: 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
de00: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
de10: 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69  ter holding an i
de20: 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
de30: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de50: 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a  Column counter *
de60: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
de90: 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f  */.  int mxBitCo
dea0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
deb0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75   /* Maximum colu
dec0: 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55  mn in pSrc->colU
ded0: 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  sed */.  CollSeq
dee0: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
def0: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
df00: 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e  g sequence to on
df10: 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57   a column */.  W
df20: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
df30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
df40: 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  e Loop object */
df50: 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65  .  char *zNotUse
df60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
df70: 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 6f 6e  * Extra space on
df80: 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64 78   the end of pIdx
df90: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64   */.  Bitmask id
dfa0: 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  xCols;          
dfb0: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63    /* Bitmap of c
dfc0: 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20  olumns used for 
dfd0: 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
dfe0: 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b  tmask extraCols;
dff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
e000: 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  map of additiona
e010: 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  l columns */.  u
e020: 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20  8 sentWarning = 
e030: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
e040: 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e 67  ue if a warnning
e050: 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65 64   has been issued
e060: 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61   */..  /* Genera
e070: 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20  te code to skip 
e080: 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69 6f  over the creatio
e090: 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61  n and initializa
e0a0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
e0b0: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
e0c0: 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73   on 2nd and subs
e0d0: 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e  equent iteration
e0e0: 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a  s of the loop. *
e0f0: 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
e100: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
e110: 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49   v!=0 );.  addrI
e120: 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  nit = sqlite3Cod
e130: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
e140: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e150: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
e160: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
e170: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61  s that will be a
e180: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
e190: 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20  x.  ** and used 
e1a0: 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20 63  to match WHERE c
e1b0: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
e1c0: 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d  s */.  nKeyCol =
e1d0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   0;.  pTable = p
e1e0: 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
e1f0: 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
e200: 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f  C->nTerm];.  pLo
e210: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
e220: 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  oop;.  idxCols =
e230: 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
e240: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
e250: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
e260: 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
e270: 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
e280: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
e290: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
e2a0: 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
e2b0: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
e2c0: 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
e2d0: 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
e2e0: 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
e2f0: 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
e300: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
e310: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
e320: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
e330: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
e340: 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
e350: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e360: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
e370: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
e380: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
e390: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
e3a0: 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
e3b0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
e3c0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
e3d0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
e3e0: 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
e3f0: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
e400: 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
e410: 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
e420: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
e430: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
e440: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
e450: 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 20 72 65   nKeyCol+1) ) re
e460: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4c  turn;.        pL
e470: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79  oop->aLTerm[nKey
e480: 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  Col++] = pTerm;.
e490: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
e4a0: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
e4b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
e4c0: 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20  sert( nKeyCol>0 
e4d0: 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  );.  pLoop->u.bt
e4e0: 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  ree.nEq = pLoop-
e4f0: 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f  >nLTerm = nKeyCo
e500: 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  l;.  pLoop->wsFl
e510: 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
e520: 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44  MN_EQ | WHERE_ID
e530: 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49  X_ONLY | WHERE_I
e540: 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20 20  NDEXED.         
e550: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48              | WH
e560: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
e570: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
e580: 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69  number of additi
e590: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
e5a0: 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a  ded to create a.
e5b0: 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e    ** covering in
e5c0: 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e  dex.  A "coverin
e5d0: 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69  g index" is an i
e5e0: 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
e5f0: 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75  ns all.  ** colu
e600: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65 65  mns that are nee
e610: 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ded by the query
e620: 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72 69  .  With a coveri
e630: 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20  ng index, the.  
e640: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
e650: 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  e never needs to
e660: 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20 41   be accessed.  A
e670: 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73  utomatic indices
e680: 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20   must.  ** be a 
e690: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62  covering index b
e6a0: 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65 78  ecause the index
e6b0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
e6c0: 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a  ated if the.  **
e6d0: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
e6e0: 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20  changes and the 
e6f0: 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
e700: 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75  cannot both be u
e710: 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  sed.  ** if they
e720: 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e   go out of sync.
e730: 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c  .  */.  extraCol
e740: 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  s = pSrc->colUse
e750: 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20  d & (~idxCols | 
e760: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b  MASKBIT(BMS-1));
e770: 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70  .  mxBitCol = (p
e780: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42  Table->nCol >= B
e790: 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20  MS-1) ? BMS-1 : 
e7a0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20  pTable->nCol;.  
e7b0: 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
e7c0: 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
e7d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
e7e0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32  ble->nCol==BMS-2
e7f0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
e800: 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
e810: 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
e820: 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
e830: 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d  ) nKeyCol++;.  }
e840: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
e850: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
e860: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65  MS-1) ){.    nKe
e870: 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e  yCol += pTable->
e880: 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a  nCol - BMS + 1;.
e890: 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46    }.  pLoop->wsF
e8a0: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
e8b0: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
e8c0: 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20  IDX_ONLY;..  /* 
e8d0: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
e8e0: 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
e8f0: 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
e900: 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71  x */.  pIdx = sq
e910: 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
e920: 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d  exObject(pParse-
e930: 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20  >db, nKeyCol+1, 
e940: 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20  0, &zNotUsed);. 
e950: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
e960: 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  eturn;.  pLoop->
e970: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
e980: 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a   pIdx;.  pIdx->z
e990: 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
e9a0: 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61  ex";.  pIdx->pTa
e9b0: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ble = pTable;.  
e9c0: 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73  n = 0;.  idxCols
e9d0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
e9e0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
e9f0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
ea00: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
ea10: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
ea20: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
ea30: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
ea40: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
ea50: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
ea60: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
ea70: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
ea80: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
ea90: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
eaa0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
eab0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
eac0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
ead0: 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
eae0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
eaf0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
eb00: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
eb10: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
eb20: 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20       idxCols |= 
eb30: 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  cMask;.        p
eb40: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
eb50: 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
eb60: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
eb70: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
eb80: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
eb90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
eba0: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
ebb0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  t);.        pIdx
ebc0: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c  ->azColl[n] = AL
ebd0: 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43  WAYS(pColl) ? pC
ebe0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49  oll->zName : "BI
ebf0: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e  NARY";.        n
ec00: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
ec10: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
ec20: 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75  (u32)n==pLoop->u
ec30: 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20  .btree.nEq );.. 
ec40: 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e   /* Add addition
ec50: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
ec60: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75  d to make the au
ec70: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e  tomatic index in
ec80: 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69  to.  ** a coveri
ec90: 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f  ng index */.  fo
eca0: 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
ecb0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
ecc0: 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
ecd0: 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20  KBIT(i) ){.     
ece0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
ecf0: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
ed00: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
ed10: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
ed20: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
ed30: 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
ed40: 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
ed50: 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  -1) ){.    for(i
ed60: 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65  =BMS-1; i<pTable
ed70: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
ed80: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ed90: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
eda0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
edb0: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
edc0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
edd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e  }.  assert( n==n
ede0: 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78  KeyCol );.  pIdx
edf0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
ee00: 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  -1;.  pIdx->azCo
ee10: 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
ee20: 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
ee30: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
ee40: 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ex */.  assert( 
ee50: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
ee60: 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  =0 );.  pLevel->
ee70: 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
ee80: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
ee90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
eea0: 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65   OP_OpenAutoinde
eeb0: 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  x, pLevel->iIdxC
eec0: 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a  ur, nKeyCol+1);.
eed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
eee0: 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
eef0: 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43  , pIdx);.  VdbeC
ef00: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20  omment((v, "for 
ef10: 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  %s", pTable->zNa
ef20: 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  me));..  /* Fill
ef30: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
ef40: 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e  ndex with conten
ef50: 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  t */.  addrTop =
ef60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ef70: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
ef80: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
ef90: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
efa0: 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  v);.  regRecord 
efb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
efc0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
efd0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
efe0: 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
eff0: 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Idx, pLevel->iTa
f000: 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  bCur, regRecord,
f010: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
f020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f030: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
f040: 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t, pLevel->iIdxC
f050: 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ur, regRecord);.
f060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f070: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
f080: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
f090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f0a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
f0b0: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
f0c0: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
f0d0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f0e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f0f0: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54  eP5(v, SQLITE_ST
f100: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
f110: 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EX);.  sqlite3Vd
f120: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f130: 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
f140: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f150: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
f160: 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  d);.  .  /* Jump
f170: 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
f180: 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
f190: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
f1a0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f1b0: 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a  v, addrInit);.}.
f1c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f1d0: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
f1e0: 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65  INDEX */..#ifnde
f1f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f200: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
f210: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
f220: 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65  pulate an sqlite
f230: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
f240: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68  ucture. It is th
f250: 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
f260: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
f270: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
f280: 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72   release the str
f290: 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73  ucture.** by pas
f2a0: 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72  sing the pointer
f2b0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
f2c0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71  s function to sq
f2d0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
f2e0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
f2f0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f  index_info *allo
f300: 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20  cateIndexInfo(. 
f310: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
f320: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
f330: 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63  WC,.  struct Src
f340: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
f350: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
f360: 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69  derBy.){.  int i
f370: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , j;.  int nTerm
f380: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f390: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
f3a0: 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
f3b0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
f3c0: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70  index_orderby *p
f3d0: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74  IdxOrderBy;.  st
f3e0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f3f0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
f400: 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
f410: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
f420: 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
f430: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
f440: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
f450: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
f460: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
f470: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
f480: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
f490: 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  erring.  ** to t
f4a0: 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
f4b0: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65  e */.  for(i=nTe
f4c0: 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
f4d0: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
f4e0: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
f4f0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
f500: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
f510: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
f520: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
f530: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
f540: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
f550: 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
f560: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f570: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f580: 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
f590: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f5a0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f5b0: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
f5c0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
f5d0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
f5e0: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
f5f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
f600: 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f   ~(WO_ISNULL|WO_
f610: 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e  EQUIV))==0 ) con
f620: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
f630: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
f640: 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
f650: 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d  tinue;.    nTerm
f660: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
f670: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
f680: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
f690: 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
f6a0: 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20  e current .  ** 
f6b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
f6c0: 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
f6d0: 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
f6e0: 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  By part of.  ** 
f6f0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
f700: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
f710: 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42  ..  */.  nOrderB
f720: 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  y = 0;.  if( pOr
f730: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
f740: 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e   n = pOrderBy->n
f750: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
f760: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
f770: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
f780: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
f790: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
f7a0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
f7b0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
f7c0: 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
f7d0: 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
f7e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
f7f0: 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65  =n){.      nOrde
f800: 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  rBy = n;.    }. 
f810: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
f820: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
f830: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
f840: 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  re.  */.  pIdxIn
f850: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
f860: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
f870: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
f880: 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
f8b0: 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
f8c0: 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
f8f0: 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
f900: 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
f910: 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
f920: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f930: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f940: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
f950: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f960: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
f970: 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
f980: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
f990: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f9a0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
f9b0: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
f9c0: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
f9d0: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
f9e0: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
f9f0: 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
fa00: 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
fa10: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
fa20: 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
fa30: 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
fa40: 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
fa50: 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
fa60: 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
fa70: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
fa80: 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
fa90: 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
faa0: 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
fab0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
fac0: 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
fad0: 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
fae0: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
faf0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
fb00: 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
fb10: 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
fb20: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
fb30: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
fb40: 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
fb50: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
fb60: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
fb70: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
fb80: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
fb90: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
fba0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
fbb0: 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
fbc0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
fbd0: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
fbe0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
fbf0: 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
fc00: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
fc10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
fc20: 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
fc30: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
fc40: 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
fca0: 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
fcb0: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
fcc0: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
fcd0: 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
fce0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
fcf0: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
fd00: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
fd10: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
fd20: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
fd30: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
fd40: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
fd50: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
fd60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
fd70: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
fd80: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
fd90: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
fda0: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
fdb0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
fdc0: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
fdd0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
fde0: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
fdf0: 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56  _ISNULL|WO_EQUIV
fe00: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
fe10: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
fe20: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
fe30: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
fe40: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
fe50: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
fe60: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
fe70: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
fe80: 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
fe90: 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70  ;.    op = (u8)p
fea0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
feb0: 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  & WO_ALL;.    if
fec0: 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70  ( op==WO_IN ) op
fed0: 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49   = WO_EQ;.    pI
fee0: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f  dxCons[j].op = o
fef0: 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  p;.    /* The di
ff00: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
ff10: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
ff20: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
ff30: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
ff40: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
ff50: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
ff60: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
ff70: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
ff80: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
ff90: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
ffa0: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
ffb0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
ffc0: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
ffd0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
ffe0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
fff0: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
10000 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
10010 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10020 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
10030 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
10040 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
10050 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
10060 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10070 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
10080 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
10090 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
100a0 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
100b0 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
100c0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
100d0 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
100e0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
100f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
10100 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
10110 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
10120 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
10130 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
10140 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
10150 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
10160 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
10170 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
10180 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
10190 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
101a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
101b0 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
101c0 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
101d0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
101e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
101f0 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  pIdxInfo;.}../*.
10200 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a  ** The table obj
10210 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61  ect reference pa
10220 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
10230 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
10240 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
10250 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61  must represent a
10260 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
10270 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
10280 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49  vokes the xBestI
10290 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ndex().** method
102a0 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
102b0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
102c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
102d0 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
102e0 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65   comes in as the
102f0 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   3rd argument to
10300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
10310 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
10320 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
10330 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
10340 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
10350 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
10360 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
10370 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
10380 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
10390 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
103a0 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
103b0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
103c0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
103d0 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
103e0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
103f0 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
10400 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
10410 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
10420 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
10430 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
10440 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
10450 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
10460 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
10470 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
10480 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
10490 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
104a0 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
104b0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
104c0 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
104d0 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
104e0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
104f0 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
10500 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
10510 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
10520 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
10530 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  c;..  TRACE_IDX_
10540 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
10550 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
10560 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
10570 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
10580 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
10590 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
105a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
105b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
105c0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
105d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
105e0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
105f0 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45  e if( !pVtab->zE
10600 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
10610 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10620 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c  Parse, "%s", sql
10630 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
10640 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10650 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10660 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
10670 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
10680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
10690 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
106a0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74  >zErrMsg);.  pVt
106b0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
106c0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
106d0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
106e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d  ++){.    if( !p-
106f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
10700 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f  usable && p->aCo
10710 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
10720 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a  .argvIndex>0 ){.
10730 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10740 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
10750 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
10760 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72  %s: xBestIndex r
10770 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c  eturned an inval
10780 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e  id plan", pTab->
10790 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
107a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  }..  return pPar
107b0 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64  se->nErr;.}.#end
107c0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
107d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
107e0 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69  ALTABLE) */...#i
107f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10800 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
10810 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
10820 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
10830 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
10840 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
10850 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
10860 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
10870 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
10880 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
10890 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
108a0 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
108b0 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56  ows less than pV
108c0 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  al.**    aStat[1
108d0 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
108e0 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
108f0 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52   to pVal.**.** R
10900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10910 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73  on success..*/.s
10920 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
10930 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73  KeyStats(.  Pars
10940 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10950 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10960 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
10970 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73  /* Index to cons
109a0 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a  ider domain of *
109b0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
109c0 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20  rd *pRec,       
109d0 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c  /* Vector of val
109e0 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  ues to consider 
109f0 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
10a00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10a10 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
10a20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
10a30 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
10a40 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
10a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10a60 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
10a70 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  n here */.){.  I
10a80 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
10a90 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d  ple = pIdx->aSam
10aa0 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  ple;.  int iCol;
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
10ad0 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69 6e  equired stats in
10ae0 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a   anEq[] etc. */.
10af0 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20    int iMin = 0; 
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b10 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
10b20 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20   not yet tested 
10b30 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 64  */.  int i = pId
10b40 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20  x->nSample;     
10b50 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
10b60 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ple larger than 
10b70 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  or equal to pRec
10b80 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b   */.  int iTest;
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65    /* Next sample
10bb0 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e   to test */.  in
10bc0 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
10bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
10be0 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
10bf0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  n operation */..
10c00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10c10 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
10c20 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20  RAMETER( pParse 
10c30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
10c40 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20  rt( pRec!=0 );. 
10c50 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e 46   iCol = pRec->nF
10c60 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73 73 65  ield - 1;.  asse
10c70 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
10c80 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
10c90 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
10ca0 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 53  && iCol<pIdx->nS
10cb0 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20 64 6f  ampleCol );.  do
10cc0 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69  {.    iTest = (i
10cd0 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20 72 65  Min+i)/2;.    re
10ce0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
10cf0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
10d00 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c 20 61  mple[iTest].n, a
10d10 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 70 2c  Sample[iTest].p,
10d20 20 70 52 65 63 2c 20 30 29 3b 0a 20 20 20 20 69   pRec, 0);.    i
10d30 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
10d40 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
10d50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10d60 20 20 20 69 20 3d 20 69 54 65 73 74 3b 0a 20 20     i = iTest;.  
10d70 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65    }.  }while( re
10d80 73 20 26 26 20 69 4d 69 6e 3c 69 20 29 3b 0a 0a  s && iMin<i );..
10d90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
10da0 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  BUG.  /* The fol
10db0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
10dc0 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74  atements check t
10dd0 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73  hat the binary s
10de0 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20  earch code.  ** 
10df0 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20  above found the 
10e00 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68  right answer. Th
10e10 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
10e20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72  no purpose other
10e30 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e  .  ** than to in
10e40 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73  voke the asserts
10e50 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d  .  */.  if( res=
10e60 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
10e70 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65  (res==0) is true
10e80 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65 20 24 69  , then sample $i
10e90 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c 20 74   must be equal t
10ea0 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20 20 61 73  o pRec */.    as
10eb0 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53  sert( i<pIdx->nS
10ec0 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 73 73  ample );.    ass
10ed0 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56  ert( 0==sqlite3V
10ee0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
10ef0 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
10f00 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
10f10 63 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 7c  c, 0).         |
10f20 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
10f30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
10f40 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74  }else{.    /* Ot
10f50 68 65 72 77 69 73 65 2c 20 70 52 65 63 20 6d 75  herwise, pRec mu
10f60 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  st be smaller th
10f70 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61 6e 64  an sample $i and
10f80 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20   larger than.   
10f90 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69 2d 31   ** sample ($i-1
10fa0 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ).  */.    asser
10fb0 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  t( i==pIdx->nSam
10fc0 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ple .         ||
10fd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
10fe0 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
10ff0 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
11000 69 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29 3e 30  i].p, pRec, 0)>0
11010 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61  .         || pPa
11020 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
11030 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73  ailed );.    ass
11040 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20 20  ert( i==0.      
11050 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
11060 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
11070 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61  Sample[i-1].n, a
11080 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70  Sample[i-1].p, p
11090 52 65 63 2c 20 30 29 3c 30 0a 20 20 20 20 20 20  Rec, 0)<0.      
110a0 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
110b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
110c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
110d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
110e0 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74  UG */..  /* At t
110f0 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70  his point, aSamp
11100 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72  le[i] is the fir
11110 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  st sample that i
11120 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  s greater than. 
11130 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20   ** or equal to 
11140 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d  pVal.  Or if i==
11150 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74  pIdx->nSample, t
11160 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  hen all samples 
11170 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68  are less.  ** th
11180 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61  an pVal.  If aSa
11190 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74  mple[i]==pVal, t
111a0 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f  hen res==0..  */
111b0 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b  .  if( res==0 ){
111c0 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
111d0 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
111e0 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74  iCol];.    aStat
111f0 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [1] = aSample[i]
11200 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d  .anEq[iCol];.  }
11210 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e  else{.    tRowcn
11220 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72  t iLower, iUpper
11230 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
11240 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  i==0 ){.      iL
11250 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
11260 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65  iUpper = aSample
11270 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [0].anLt[iCol];.
11280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11290 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c   i64 nRow0 = sql
112a0 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
112b0 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
112c0 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 55 70  t[0]);.      iUp
112d0 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e  per = i>=pIdx->n
112e0 53 61 6d 70 6c 65 20 3f 20 6e 52 6f 77 30 20 3a  Sample ? nRow0 :
112f0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
11300 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 4c  [iCol];.      iL
11310 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
11320 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b  -1].anEq[iCol] +
11330 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e   aSample[i-1].an
11340 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a  Lt[iCol];.    }.
11350 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70      aStat[1] = p
11360 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c  Idx->aAvgEq[iCol
11370 5d 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  ];.    if( iLowe
11380 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
11390 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
113a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
113b0 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
113c0 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
113d0 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
113e0 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
113f0 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
11400 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
11410 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
11420 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
11430 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a  wer + iGap;.  }.
11440 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11450 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
11460 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
11470 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
11480 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61  NULL, pTerm is a
11490 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69   term that provi
114a0 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20  des an upper or 
114b0 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f  lower.** bound o
114c0 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20  n a range scan. 
114d0 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72  Without consider
114e0 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73  ing pTerm, it is
114f0 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74   estimated .** t
11500 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c  hat the scan wil
11510 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77  l visit nNew row
11520 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
11530 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
11540 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ber.** estimated
11550 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61   to be visited a
11560 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72  fter taking pTer
11570 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a  m into account..
11580 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  **.** If the use
11590 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  r explicitly spe
115a0 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68  cified a likelih
115b0 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20  ood() value for 
115c0 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68  this term,.** th
115d0 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
115e0 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c  lue is the likel
115f0 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64  ihood multiplied
11600 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
11610 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e  f.** input rows.
11620 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   Otherwise, this
11630 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
11640 73 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f  s that an "IS NO
11650 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20  T NULL" term.** 
11660 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  has a likelihood
11670 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e   of 0.50, and an
11680 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c  y other term a l
11690 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32  ikelihood of 0.2
116a0 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  5..*/.static Log
116b0 45 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64  Est whereRangeAd
116c0 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a  just(WhereTerm *
116d0 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e  pTerm, LogEst nN
116e0 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52  ew){.  LogEst nR
116f0 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28  et = nNew;.  if(
11700 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66   pTerm ){.    if
11710 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
11720 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ob<=0 ){.      n
11730 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Ret += pTerm->tr
11740 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c  uthProb;.    }el
11750 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77  se if( (pTerm->w
11760 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
11770 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
11780 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20   nRet -= 20;    
11790 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d      assert( 20==
117a0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
117b0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
117c0 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a  return nRet;.}..
117d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
117e0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
117f0 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  AT4./* .** This 
11800 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11810 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
11820 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
11830 73 20 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a  s visited by a.*
11840 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20  * range-scan on 
11850 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65  a skip-scan inde
11860 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  x. For example:.
11870 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
11880 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
11890 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c   b, c);.**   SEL
118a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
118b0 45 52 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45  ERE a=? AND c BE
118c0 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a  TWEEN ? AND ?;.*
118d0 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70  *.** Value pLoop
118e0 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e  ->nOut is curren
118f0 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 65  tly set to the e
11900 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
11910 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69  of rows .** visi
11920 74 65 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67  ted for scanning
11930 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20   (a=? AND b=?). 
11940 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
11950 64 75 63 65 73 20 74 68 61 74 20 65 73 74 69 6d  duces that estim
11960 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20  ate .** by some 
11970 66 61 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e  factor to accoun
11980 74 20 66 6f 72 20 74 68 65 20 28 63 20 42 45 54  t for the (c BET
11990 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78  WEEN ? AND ?) ex
119a0 70 72 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a  pression based.*
119b0 2a 20 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64  * on the stat4 d
119c0 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ata for the inde
119d0 78 2e 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c  x. this scan wil
119e0 6c 20 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75  l be peformed mu
119f0 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
11a00 20 28 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20   (once for each 
11a10 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f  (a,b) combinatio
11a20 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  n that matches a
11a30 3d 3f 29 20 69 73 20 64 65 61 6c 74 20 77 69 74  =?) is dealt wit
11a40 68 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  h .** by the cal
11a50 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f  ler..**.** It do
11a60 65 73 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e  es this by scann
11a70 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
11a80 73 74 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63  stat4 samples, c
11a90 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a  omparing values.
11aa0 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
11ab0 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  m pLower and pUp
11ac0 70 65 72 20 77 69 74 68 20 74 68 65 20 63 6f 72  per with the cor
11ad0 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
11ae0 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d  n in each.** sam
11af0 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20  ple. If L and U 
11b00 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  are the number o
11b10 66 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20  f samples found 
11b20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
11b30 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74  or.** equal to t
11b40 68 65 20 76 61 6c 75 65 73 20 65 78 74 72 61 63  he values extrac
11b50 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
11b60 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
11b70 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20  ctively, and.** 
11b80 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  N is the total n
11b90 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
11ba0 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  , the pLoop->nOu
11bb0 74 20 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73  t value is adjus
11bc0 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  ted.** as follow
11bd0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20  s:.**.**   nOut 
11be0 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55  = nOut * ( min(U
11bf0 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a   - L, 1) / N ).*
11c00 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69  *.** If pLower i
11c10 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c  s NULL, or a val
11c20 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  ue cannot be ext
11c30 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
11c40 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65  term, L is.** se
11c50 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55  t to zero. If pU
11c60 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  pper is NULL, or
11c70 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
11c80 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
11c90 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65  m it,.** U is se
11ca0 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  t to N..**.** No
11cb0 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  rmally, this fun
11cc0 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f  ction sets *pbDo
11cd0 6e 65 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72  ne to 1 before r
11ce0 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65  eturning. Howeve
11cf0 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75  r,.** if no valu
11d00 65 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74  e can be extract
11d10 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70  ed from either p
11d20 4c 6f 77 65 72 20 6f 72 20 70 55 70 70 65 72 20  Lower or pUpper 
11d30 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65  (and so the.** e
11d40 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
11d50 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65  umber of rows de
11d60 6c 69 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20  livered remains 
11d70 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44  unchanged), *pbD
11d80 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61  one.** is left a
11d90 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  s is..**.** If a
11da0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
11db0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
11dc0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
11dd0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
11de0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
11df0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
11e00 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
11e10 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11e20 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
11e30 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
11e40 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
11e50 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
11e60 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
11e70 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
11e80 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
11e90 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
11ea0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
11eb0 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
11ec0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
11ed0 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
11ee0 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
11ef0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
11f00 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61  Loop,    /* Upda
11f10 74 65 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c  te the .nOut val
11f20 75 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20  ue of this loop 
11f30 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65  */.  int *pbDone
11f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
11f50 20 74 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c   to true if at l
11f60 65 61 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76  east one expr. v
11f70 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 2a  alue extracted *
11f80 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
11f90 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
11fa0 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
11fb0 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
11fc0 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74  ree.nEq;.  sqlit
11fd0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11fe0 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65  >db;.  int nLowe
11ff0 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55  r = -1;.  int nU
12000 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c  pper = p->nSampl
12010 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  e+1;.  int rc = 
12020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12030 20 69 43 6f 6c 20 3d 20 70 2d 3e 61 69 43 6f 6c   iCol = p->aiCol
12040 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 75 38 20 61  umn[nEq];.  u8 a
12050 66 66 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70  ff = iCol>=0 ? p
12060 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
12070 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
12080 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
12090 45 52 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ER;.  CollSeq *p
120a0 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74  Coll;.  .  sqlit
120b0 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30  e3_value *p1 = 0
120c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ;          /* Va
120d0 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
120e0 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73  om pLower */.  s
120f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32  qlite3_value *p2
12100 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
12110 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
12120 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f  d from pUpper */
12130 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
12140 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20   *pVal = 0;     
12150 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
12160 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72  acted from recor
12170 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  d */..  pColl = 
12180 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
12190 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
121a0 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20  azColl[nEq]);.  
121b0 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
121c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
121d0 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
121e0 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d  (pParse, pLower-
121f0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
12200 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e  aff, &p1);.    n
12210 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20  Lower = 0;.  }. 
12220 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72   if( pUpper && r
12230 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12250 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
12260 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65  pr(pParse, pUppe
12270 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
12280 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20  , aff, &p2);.   
12290 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30   nUpper = p2 ? 0
122a0 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20   : p->nSample;. 
122b0 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20   }..  if( p1 || 
122c0 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  p2 ){.    int i;
122d0 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a  .    int nDiff;.
122e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
122f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
12300 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  p->nSample; i++)
12310 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
12320 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28  ite3Stat4Column(
12330 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  db, p->aSample[i
12340 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  ].p, p->aSample[
12350 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c  i].n, nEq, &pVal
12360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
12370 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31  =SQLITE_OK && p1
12380 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
12390 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
123a0 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c  Compare(p1, pVal
123b0 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
123c0 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
123d0 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Lower++;.      }
123e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
123f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29  QLITE_OK && p2 )
12400 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
12410 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
12420 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20  mpare(p2, pVal, 
12430 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
12440 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70  if( res>=0 ) nUp
12450 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  per++;.      }. 
12460 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d     }.    nDiff =
12470 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65   (nUpper - nLowe
12480 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66  r);.    if( nDif
12490 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31  f<=0 ) nDiff = 1
124a0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
124b0 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
124c0 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  per and lower bo
124d0 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61  und specified, a
124e0 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  nd the .    ** c
124f0 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63  omparisons indic
12500 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72  ate that they ar
12510 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72  e close together
12520 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61  , use the fallba
12530 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ck.    ** method
12540 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68   (assume that th
12550 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f  e scan visits 1/
12560 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20  64 of the rows) 
12570 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20  for estimating. 
12580 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72     ** the number
12590 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
125a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74  . Otherwise, est
125b0 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
125c0 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20   of rows.    ** 
125d0 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64  using the method
125e0 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
125f0 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
12600 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
12610 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  on. */.    if( n
12620 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65  Diff!=1 || pUppe
12630 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d  r==0 || pLower==
12640 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
12650 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65  Adjust = (sqlite
12660 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70  3LogEst(p->nSamp
12670 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67  le) - sqlite3Log
12680 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20  Est(nDiff));.   
12690 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d     pLoop->nOut -
126a0 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20  = nAdjust;.     
126b0 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20   *pbDone = 1;.  
126c0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
126d0 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69  x10, ("range ski
126e0 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  p-scan regions: 
126f0 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25  %u..%u  adjust=%
12700 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  d est=%d\n",.   
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20          nLower, 
12730 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a  nUpper, nAdjust*
12740 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29  -1, pLoop->nOut)
12750 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  );.    }..  }els
12760 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  e{.    assert( *
12770 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d  pbDone==0 );.  }
12780 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ..  sqlite3Value
12790 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69  Free(p1);.  sqli
127a0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29  te3ValueFree(p2)
127b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
127c0 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
127d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
127e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
127f0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
12800 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  T4 */../*.** Thi
12810 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12820 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
12830 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
12840 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
12850 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
12860 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
12870 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
12880 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
12890 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
128a0 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
128b0 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
128c0 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
128d0 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
128e0 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
128f0 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
12900 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
12910 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
12920 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
12930 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
12940 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
12950 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
12960 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
12970 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
12980 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
12990 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
129a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
129b0 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129d0 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
129e0 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
129f0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
12a00 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
12a10 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
12a20 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
12a30 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
12a40 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
12a50 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
12a60 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
12a70 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
12a80 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
12a90 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c   value in (pBuil
12aa0 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
12ab0 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 69  ee.nEq) is the i
12ac0 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65  ndex of the inde
12ad0 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a  x.** column subj
12ae0 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65  ect to the range
12af0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c   constraint. Or,
12b00 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74   equivalently, t
12b10 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
12b20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
12b30 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62  ints optimized b
12b40 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69  y the proposed i
12b50 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65  ndex scan. For e
12b60 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d  xample,.** assum
12b70 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f  ing index p is o
12b80 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20  n t1(a, b), and 
12b90 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73  the SQL query is
12ba0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
12bb0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
12bc0 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20  ? AND b > ? AND 
12bd0 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  b < ? ....**.** 
12be0 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
12bf0 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e  to 1 (as the ran
12c00 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f  ge restricted co
12c10 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20  lumn, b, is the 
12c20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d  second .** left-
12c30 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
12c40 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69  he index). Or, i
12c50 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a  f the query is:.
12c60 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
12c70 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
12c80 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
12c90 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
12ca0 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  set to 0..**.** 
12cb0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
12cc0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
12cd0 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
12ce0 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  he sqlite3LogEst
12cf0 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  () of the.** num
12d00 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
12d10 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
12d20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76  is expected to v
12d30 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a  isit without .**
12d40 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65   considering the
12d50 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
12d60 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c  ts. If nEq is 0,
12d70 20 74 68 69 73 20 69 73 20 74 68 65 20 6e 75 6d   this is the num
12d80 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20  ber of .** rows 
12d90 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73  in the index. As
12da0 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
12db0 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69  occurs, *pnOut i
12dc0 73 20 61 64 6a 75 73 74 65 64 20 28 72 65 64 75  s adjusted (redu
12dd0 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75  ced).** to accou
12de0 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  nt for the range
12df0 20 63 6f 6e 74 72 61 69 6e 74 73 20 70 4c 6f 77   contraints pLow
12e00 65 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a  er and pUpper..*
12e10 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73  * .** In the abs
12e20 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73  ence of sqlite_s
12e30 74 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74  tat4 ANALYZE dat
12e40 61 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61  a, or if such da
12e50 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ta cannot be.** 
12e60 75 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72  used, a single r
12e70 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20  ange inequality 
12e80 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
12e90 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61  ch space by a fa
12ea0 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61  ctor of 4. .** a
12eb0 6e 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e  nd a pair of con
12ec0 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e  straints (x>? AN
12ed0 44 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74  D x<?) reduces t
12ee0 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62  he expected numb
12ef0 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69  er of.** rows vi
12f00 73 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f  sited by a facto
12f10 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74  r of 64..*/.stat
12f20 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
12f30 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
12f40 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12f50 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
12f60 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
12f70 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
12f80 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
12f90 69 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65  ilder,.  WhereTe
12fa0 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
12fb0 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
12fc0 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
12fd0 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
12fe0 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
12ff0 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
13000 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
13010 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
13020 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
13030 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
13040 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20  Loop *pLoop     
13050 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e  /* Modify the .n
13060 4f 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72  Out and maybe .r
13070 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b  Run fields */.){
13080 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13090 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75  TE_OK;.  int nOu
130a0 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b  t = pLoop->nOut;
130b0 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a  .  LogEst nNew;.
130c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
130d0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
130e0 54 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20  TAT4.  Index *p 
130f0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
13100 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
13110 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
13120 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20  ree.nEq;..  if( 
13130 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a 20 20 20  p->nSample>0.   
13140 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c  && nEq<p->nSampl
13150 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69 6d  eCol.   && Optim
13160 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
13170 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
13180 45 5f 53 74 61 74 33 29 20 0a 20 20 29 7b 0a 20  E_Stat3) .  ){. 
13190 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69     if( nEq==pBui
131a0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
131b0 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65  ){.      Unpacke
131c0 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
131d0 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
131e0 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b        tRowcnt a[
131f0 32 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66  2];.      u8 aff
13200 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69  ;..      /* Vari
13210 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c  able iLower will
13220 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65   be set to the e
13230 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
13240 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
13250 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69   .      ** the i
13260 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65  ndex that are le
13270 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65  ss than the lowe
13280 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
13290 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a  ange query. The.
132a0 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62        ** lower b
132b0 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63  ound being the c
132c0 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
132d0 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65  $P and $L, where
132e0 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20   $P is the.     
132f0 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66   ** key-prefix f
13300 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71  ormed by the nEq
13310 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20   values matched 
13320 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20  against the nEq 
13330 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20  left-most.      
13340 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ** columns of th
13350 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20  e index, and $L 
13360 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  is the value in 
13370 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a  pLower..      **
13380 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66  .      ** Or, if
13390 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20   pLower is NULL 
133a0 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20  or $L cannot be 
133b0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
133c0 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20  t (because it.  
133d0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20      ** is not a 
133e0 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20  simple variable 
133f0 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  or literal value
13400 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  ), the lower bou
13410 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  nd of the.      
13420 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20  ** range is $P. 
13430 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69  Due to a quirk i
13440 6e 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b  n the way whereK
13450 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c  eyStats() works,
13460 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   even.      ** i
13470 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c  f $L is availabl
13480 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  e, whereKeyStats
13490 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
134a0 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a   both ($P) and .
134b0 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29        ** ($P:$L)
134c0 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20   and the larger 
134d0 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72  of the two retur
134e0 6e 65 64 20 76 61 6c 75 65 73 20 75 73 65 64 2e  ned values used.
134f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13500 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55  ** Similarly, iU
13510 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65  pper is to be se
13520 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
13530 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
13540 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a  of rows.      **
13550 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75   less than the u
13560 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  pper bound of th
13570 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57  e range query. W
13580 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62  here the upper b
13590 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  ound.      ** is
135a0 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20   either ($P) or 
135b0 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20  ($P:$U). Again, 
135c0 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76  even if $U is av
135d0 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61  ailable, both va
135e0 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  lues.      ** of
135f0 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75   iUpper are requ
13600 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65  ested of whereKe
13610 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65  yStats() and the
13620 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20   smaller used.. 
13630 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52       */.      tR
13640 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 0a 20 20  owcnt iLower;.  
13650 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
13660 65 72 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  er;..      if( n
13670 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Eq==p->nKeyCol )
13680 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20  {.        aff = 
13690 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
136a0 45 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ER;.      }else{
136b0 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 70  .        aff = p
136c0 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
136d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d  ->aiColumn[nEq]]
136e0 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
136f0 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65   }.      /* Dete
13700 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64  rmine iLower and
13710 20 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24   iUpper using ($
13720 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  P) only. */.    
13730 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a    if( nEq==0 ){.
13740 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
13750 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70   0;.        iUpp
13760 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  er = sqlite3LogE
13770 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
13780 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20  LogEst[0]);.    
13790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
137a0 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
137b0 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74  all could be opt
137c0 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69  imized away - si
137d0 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c  nce the same val
137e0 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20  ues must .      
137f0 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72    ** have been r
13800 65 71 75 65 73 74 65 64 20 77 68 65 6e 20 74 65  equested when te
13810 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20  sting key $P in 
13820 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
13830 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  t().  */.       
13840 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
13850 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
13860 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69  0, a);.        i
13870 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Lower = a[0];.  
13880 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
13890 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20  [0] + a[1];.    
138a0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
138b0 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
138c0 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
138d0 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
138e0 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
138f0 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
13900 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b          int bOk;
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13920 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76      /* True if v
13930 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
13940 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
13950 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
13960 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45  xpr = pLower->pE
13970 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
13980 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
13990 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
139a0 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
139b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
139c0 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
139d0 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
139e0 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
139f0 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c  pExpr, aff, nEq,
13a00 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20   &bOk);.        
13a10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13a20 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20  K && bOk ){.    
13a30 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
13a40 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  ew;.          wh
13a50 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
13a60 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
13a70 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e  a);.          iN
13a80 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c  ew = a[0] + ((pL
13a90 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
13aa0 26 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20  & WO_GT) ? a[1] 
13ab0 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  : 0);.          
13ac0 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20  if( iNew>iLower 
13ad0 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b  ) iLower = iNew;
13ae0 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  .          nOut-
13af0 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
13b00 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
13b10 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
13b20 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65  ove on the iUppe
13b30 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
13b40 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20   ($P:$U). */.   
13b50 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b     if( pUpper ){
13b60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  .        int bOk
13b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13b80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13b90 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74  value is extract
13ba0 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f  ed from pExpr */
13bb0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
13bc0 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70  Expr = pUpper->p
13bd0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
13be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
13bf0 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
13c00 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
13c10 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )!=0 );.        
13c20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
13c30 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
13c40 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
13c50 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71   pExpr, aff, nEq
13c60 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20  , &bOk);.       
13c70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13c80 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20  OK && bOk ){.   
13c90 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
13ca0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 77  New;.          w
13cb0 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
13cc0 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c  rse, p, pRec, 1,
13cd0 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   a);.          i
13ce0 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
13cf0 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
13d00 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61 5b 31 5d   & WO_LE) ? a[1]
13d10 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20   : 0);.         
13d20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72   if( iNew<iUpper
13d30 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77   ) iUpper = iNew
13d40 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  ;.          nOut
13d50 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
13d60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75      }..      pBu
13d70 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52  ilder->pRec = pR
13d80 65 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ec;.      if( rc
13d90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13da0 20 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65         if( iUppe
13db0 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  r>iLower ){.    
13dc0 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c        nNew = sql
13dd0 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65  ite3LogEst(iUppe
13de0 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20  r - iLower);.   
13df0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13e00 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b        nNew = 10;
13e10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13e20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  10==sqlite3LogEs
13e30 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(2) );.        
13e40 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e  }.        if( nN
13e50 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20  ew<nOut ){.     
13e60 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77       nOut = nNew
13e70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13e80 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
13e90 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a  = (LogEst)nOut;.
13ea0 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
13eb0 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65  CE(0x10, ("range
13ec0 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
13ed0 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22  u..%u  est=%d\n"
13ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
13f00 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
13f10 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
13f20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13f30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
13f40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13f50 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
13f60 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
13f70 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73  eRangeSkipScanEs
13f80 74 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72  t(pParse, pLower
13f90 2c 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c  , pUpper, pLoop,
13fa0 20 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20   &bDone);.      
13fb0 69 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75  if( bDone ) retu
13fc0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
13fd0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
13fe0 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
13ff0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
14000 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b  METER(pBuilder);
14010 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
14020 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
14030 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
14040 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
14050 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20  pper->wtFlags & 
14060 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
14070 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
14080 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77  RangeAdjust(pLow
14090 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65  er, nOut);.  nNe
140a0 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64  w = whereRangeAd
140b0 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65  just(pUpper, nNe
140c0 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  w);..  /* TUNING
140d0 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  : If there is bo
140e0 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
140f0 6c 6f 77 65 72 20 6c 69 6d 69 74 2c 20 61 73 73  lower limit, ass
14100 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69 73  ume the range is
14110 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79  .  ** reduced by
14120 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37   an additional 7
14130 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  5%. This means t
14140 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c  hat, by default,
14150 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20   an open-ended. 
14160 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20   ** range query 
14170 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69  (e.g. col > ?) i
14180 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74  s assumed to mat
14190 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f  ch 1/4 of the ro
141a0 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ws in the.  ** i
141b0 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c  ndex. While a cl
141c0 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e  osed range (e.g.
141d0 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41   col BETWEEN ? A
141e0 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74  ND ?) is estimat
141f0 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  ed to.  ** match
14200 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64   1/64 of the ind
14210 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c  ex. */ .  if( pL
14220 6f 77 65 72 20 26 26 20 70 55 70 70 65 72 20 29  ower && pUpper )
14230 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 0a 20 20   nNew -= 20;..  
14240 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21  nOut -= (pLower!
14250 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30  =0) + (pUpper!=0
14260 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30  );.  if( nNew<10
14270 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20   ) nNew = 10;.  
14280 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20  if( nNew<nOut ) 
14290 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 70  nOut = nNew;.  p
142a0 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
142b0 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74  gEst)nOut;.  ret
142c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
142d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
142e0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
142f0 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
14300 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
14310 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
14320 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
14330 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  ** an equality c
14340 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55  onstraint x=VALU
14350 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74  E and where that
14360 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e   VALUE occurs in
14370 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61  .** the histogra
14380 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e  m data.  This on
14390 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20  ly works when x 
143a0 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  is the left-most
143b0 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  .** column of an
143c0 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74   index and sqlit
143d0 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61  e_stat3 histogra
143e0 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  m data is availa
143f0 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  ble.** for that 
14400 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78  index.  When pEx
14410 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  pr==NULL that me
14420 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ans the constrai
14430 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e  nt is.** "x IS N
14440 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20  ULL" instead of 
14450 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a  "x=VALUE"..**.**
14460 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
14470 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
14480 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
14490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
144a0 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
144b0 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
144c0 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
144d0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
144e0 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
144f0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
14500 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
14510 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
14520 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
14530 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
14540 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
14550 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
14560 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
14570 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
14580 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
14590 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
145a0 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
145b0 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
145c0 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
145d0 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
145e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
145f0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
14600 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
14610 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
14620 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
14630 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
14640 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
14650 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
14660 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
14670 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
14680 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e  ion for VALUE in
14690 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e   the x=VALUE con
146a0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f  straint */.  tRo
146b0 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
146c0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
146d0 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
146e0 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
146f0 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
14700 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
14710 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
14720 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72  t nEq = pBuilder
14730 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
14740 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  nEq;.  UnpackedR
14750 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
14760 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
14770 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
14780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
14790 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
147a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
147b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
147c0 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
147d0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
147e0 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
147f0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
14800 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b  ics */.  int bOk
14810 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  ;..  assert( nEq
14820 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
14830 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq<=p->nColumn
14840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
14850 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
14860 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d   assert( p->nSam
14870 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
14880 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
14890 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20  cValid<nEq );.. 
148a0 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72   /* If values ar
148b0 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
148c0 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  for all fields o
148d0 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74  f the index to t
148e0 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20  he left.  ** of 
148f0 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74  this one, no est
14900 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64  imate can be mad
14910 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
14920 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20  _NOTFOUND. */.  
14930 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  if( pBuilder->nR
14940 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20  ecValid<(nEq-1) 
14950 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14960 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
14970 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73   }..  /* This is
14980 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
14990 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20   only. The call 
149a0 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34 50  to sqlite3Stat4P
149b0 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20  robeSetValue(). 
149c0 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20   ** below would 
149d0 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
149e0 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28  value.  */.  if(
149f0 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq>=p->nColumn
14a00 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d   ){.    *pnRow =
14a10 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
14a20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14a30 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
14a40 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
14a50 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66 69 6e  mn[nEq-1]].affin
14a60 69 74 79 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ity;.  rc = sqli
14a70 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
14a80 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
14a90 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
14aa0 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29  ff, nEq-1, &bOk)
14ab0 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  ;.  pBuilder->pR
14ac0 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28  ec = pRec;.  if(
14ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
14af0 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( bOk==0 ) retur
14b00 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
14b10 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  D;.  pBuilder->n
14b20 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a  RecValid = nEq;.
14b30 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  .  whereKeyStats
14b40 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
14b50 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45  , 0, a);.  WHERE
14b60 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75  TRACE(0x10,("equ
14b70 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f  ality scan regio
14b80 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29  ns: %d\n", (int)
14b90 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77  a[1]));.  *pnRow
14ba0 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65   = a[1];.  .  re
14bb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
14bc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
14bd0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
14be0 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  4 */..#ifdef SQL
14bf0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14c00 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
14c10 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
14c20 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
14c30 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
14c40 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
14c50 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77   IN constraint w
14c60 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
14c70 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
14c80 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  IN operator.** i
14c90 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  s a list of valu
14ca0 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  es.  Example:.**
14cb0 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45  .**        WHERE
14cc0 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a   x IN (1,2,3,4).
14cd0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
14ce0 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
14cf0 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
14d00 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
14d10 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
14d20 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
14d30 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
14d40 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
14d50 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
14d60 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
14d70 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
14d80 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
14d90 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
14da0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
14db0 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
14dc0 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
14dd0 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
14de0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
14df0 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
14e00 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
14e10 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
14e20 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
14e30 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
14e40 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
14e50 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
14e60 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45  int whereInScanE
14e70 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
14e80 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
14e90 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
14ea0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
14eb0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
14ec0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
14ed0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
14ee0 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76  st,     /* The v
14ef0 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65  alue list on the
14f00 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76   RHS of "x IN (v
14f10 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f  1,v2,v3,...)" */
14f20 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
14f30 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
14f40 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
14f50 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
14f60 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
14f70 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
14f80 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
14f90 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20  ;.  i64 nRow0 = 
14fa0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
14fb0 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  nt(p->aiRowLogEs
14fc0 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65  t[0]);.  int nRe
14fd0 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65  cValid = pBuilde
14fe0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20  r->nRecValid;.  
14ff0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15000 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75  OK;     /* Subfu
15010 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
15020 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
15030 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  nEst;           
15040 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
15050 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
15060 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  erm */.  tRowcnt
15070 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20   nRowEst = 0;   
15080 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
15090 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
150a0 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  f rows */.  int 
150b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
150c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
150d0 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
150e0 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
150f0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  );.  for(i=0; rc
15100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
15110 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
15120 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20  ++){.    nEst = 
15130 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20  nRow0;.    rc = 
15140 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
15150 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
15160 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  er, pList->a[i].
15170 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20  pExpr, &nEst);. 
15180 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45     nRowEst += nE
15190 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  st;.    pBuilder
151a0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
151b0 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20  ecValid;.  }..  
151c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
151d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f  K ){.    if( nRo
151e0 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e  wEst > nRow0 ) n
151f0 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a  RowEst = nRow0;.
15200 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f      *pnRow = nRo
15210 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54  wEst;.    WHERET
15220 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72  RACE(0x10,("IN r
15230 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74  ow estimate: est
15240 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  =%g\n", nRowEst)
15250 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
15260 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
15270 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20  alid==nRecValid 
15280 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15290 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
152a0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
152b0 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
152c0 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
152d0 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
152e0 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
152f0 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
15300 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
15310 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
15320 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
15330 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
15340 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
15350 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
15360 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
15370 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
15380 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
15390 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
153a0 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
153b0 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
153c0 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
153d0 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
153e0 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
153f0 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
15400 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
15410 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
15420 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
15430 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
15440 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
15450 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
15460 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
15470 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
15480 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
15490 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
154a0 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
154b0 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
154c0 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
154d0 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
154e0 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
154f0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
15500 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
15510 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
15520 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
15530 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
15540 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
15550 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
15560 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
15570 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
15580 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
15590 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
155a0 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
155b0 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
155c0 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
155d0 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
155e0 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
155f0 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
15600 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
15610 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
15620 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
15630 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
15640 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
15650 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
15660 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
15670 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
15680 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
15690 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
156a0 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
156b0 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
156c0 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
156d0 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
156e0 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
156f0 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
15700 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
15710 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
15720 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
15730 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
15740 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
15750 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
15760 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
15770 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  && (pTerm->wtFla
15780 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
15790 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c  ==0.      && (pL
157a0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
157b0 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
157c0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
157d0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
157e0 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  ).      && (pLev
157f0 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 26 20 70  el->notReady & p
15800 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 29  Term->prereqAll)
15810 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 54 65  ==0.  ){.    pTe
15820 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
15830 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69  ERM_CODED;.    i
15840 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  f( pTerm->iParen
15850 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  t>=0 ){.      Wh
15860 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20  ereTerm *pOther 
15870 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  = &pTerm->pWC->a
15880 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  [pTerm->iParent]
15890 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70  ;.      if( (--p
158a0 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d  Other->nChild)==
158b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  0 ){.        dis
158c0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
158d0 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20   pOther);.      
158e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
158f0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
15900 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
15910 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c  to apply the col
15920 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
15930 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74  ing zAff.** to t
15940 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73  he n registers s
15950 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e  tarting at base.
15960 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70   .**.** As an op
15970 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49  timization, SQLI
15980 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
15990 69 65 73 20 28 77 68 69 63 68 20 61 72 65 20 6e  ies (which are n
159a0 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a  o-ops) at the.**
159b0 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65   beginning and e
159c0 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69  nd of zAff are i
159d0 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20  gnored.  If all 
159e0 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20  entries in zAff 
159f0 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  are.** SQLITE_AF
15a00 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20  F_NONE, then no 
15a10 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72 61  code gets genera
15a20 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
15a30 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74  routine makes it
15a40 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41  s own copy of zA
15a50 66 66 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ff so that the c
15a60 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a  aller is free.**
15a70 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20   to modify zAff 
15a80 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  after this routi
15a90 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73  ne returns..*/.s
15aa0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41  tatic void codeA
15ab0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72  pplyAffinity(Par
15ac0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
15ad0 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61  base, int n, cha
15ae0 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65  r *zAff){.  Vdbe
15af0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
15b00 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d  dbe;.  if( zAff=
15b10 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
15b20 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
15b30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
15b40 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
15b50 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
15b60 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73  .  /* Adjust bas
15b70 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20  e and n to skip 
15b80 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f  over SQLITE_AFF_
15b90 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20  NONE entries at 
15ba0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
15bb0 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68  ** and end of th
15bc0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
15bd0 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  g..  */.  while(
15be0 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d   n>0 && zAff[0]=
15bf0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
15c00 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20   ){.    n--;.   
15c10 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66   base++;.    zAf
15c20 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  f++;.  }.  while
15c30 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d  ( n>1 && zAff[n-
15c40 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  1]==SQLITE_AFF_N
15c50 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
15c60 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74    }..  /* Code t
15c70 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
15c80 70 63 6f 64 65 20 69 66 20 74 68 65 72 65 20 69  pcode if there i
15c90 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20  s anything left 
15ca0 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20  to do. */.  if( 
15cb0 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  n>0 ){.    sqlit
15cc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15cd0 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73  OP_Affinity, bas
15ce0 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, n);.    sqlit
15cf0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
15d00 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a  , -1, zAff, n);.
15d10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15d20 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
15d30 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ge(pParse, base,
15d40 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a   n);.  }.}.../*.
15d50 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15d60 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71   for a single eq
15d70 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74  uality term of t
15d80 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
15d90 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a    An equality.**
15da0 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74   term can be eit
15db0 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20  her X=expr or X 
15dc0 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72  IN (...).   pTer
15dd0 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f  m is the term to
15de0 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a   be .** coded..*
15df0 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74  *.** The current
15e00 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63   value for the c
15e10 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66  onstraint is lef
15e20 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  t in register iR
15e30 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  eg..**.** For a 
15e40 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68  constraint of th
15e50 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74  e form X=expr, t
15e60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
15e70 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
15e80 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  ts.** result is 
15e90 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
15ea0 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69  k.  For constrai
15eb0 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
15ec0 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68  X IN (...).** th
15ed0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
15ee0 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  up a loop that w
15ef0 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72  ill iterate over
15f00 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58   all values of X
15f10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15f20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
15f30 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15f40 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e,      /* The p
15f50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15f60 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
15f70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74  Term,   /* The t
15f80 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
15f90 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f   clause to be co
15fa0 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ded */.  WhereLe
15fb0 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20  vel *pLevel, /* 
15fc0 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  The level of the
15fd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20   FROM clause we 
15fe0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
15ff0 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20  /.  int iEq,    
16000 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16010 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79   of the equality
16020 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69   term within thi
16030 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74  s level */.  int
16040 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
16050 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76   /* True for rev
16060 65 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70  erse-order IN op
16070 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  erations */.  in
16080 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20  t iTarget       
16090 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
160a0 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e  leave results in
160b0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
160c0 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20  /.){.  Expr *pX 
160d0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
160e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
160f0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
16100 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   iReg;          
16110 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
16120 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ter holding resu
16130 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lts */..  assert
16140 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20  ( iTarget>0 );. 
16150 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
16160 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  EQ ){.    iReg =
16170 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16180 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
16190 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67  X->pRight, iTarg
161a0 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  et);.  }else if(
161b0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55   pX->op==TK_ISNU
161c0 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  LL ){.    iReg =
161d0 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71   iTarget;.    sq
161e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
161f0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
16200 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
16210 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16220 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
16230 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69  int eType;.    i
16240 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72  nt iTab;.    str
16250 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
16260 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
16270 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
16280 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66 28  pWLoop;..    if(
16290 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
162a0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
162b0 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20  TABLE)==0.      
162c0 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
162d0 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20  e.pIndex!=0.    
162e0 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74    && pLoop->u.bt
162f0 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72  ree.pIndex->aSor
16300 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20  tOrder[iEq].    
16310 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
16320 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20  e( iEq==0 );.   
16330 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65     testcase( bRe
16340 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20  v );.      bRev 
16350 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20  = !bRev;.    }. 
16360 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
16370 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
16380 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
16390 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69      eType = sqli
163a0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
163b0 50 61 72 73 65 2c 20 70 58 2c 20 49 4e 5f 49 4e  Parse, pX, IN_IN
163c0 44 45 58 5f 4c 4f 4f 50 2c 20 30 29 3b 0a 20 20  DEX_LOOP, 0);.  
163d0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
163e0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
163f0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
16400 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
16410 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
16420 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d      }.    iTab =
16430 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
16440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16450 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
16460 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
16470 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
16480 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
16490 2c 20 62 52 65 76 29 3b 0a 20 20 20 20 56 64 62  , bRev);.    Vdb
164a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 21  eCoverageIf(v, !
164b0 62 52 65 76 29 3b 0a 20 20 20 20 61 73 73 65 72  bRev);.    asser
164c0 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
164d0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
164e0 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  _OR)==0 );.    p
164f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
16500 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a   WHERE_IN_ABLE;.
16510 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
16520 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  u.in.nIn==0 ){. 
16530 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
16540 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
16550 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
16560 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
16570 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20  ->u.in.nIn++;.  
16580 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61    pLevel->u.in.a
16590 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20  InLoop =.       
165a0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
165b0 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  OrFree(pParse->d
165c0 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
165d0 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
16600 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
16610 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75  op[0])*pLevel->u
16620 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  .in.nIn);.    pI
16630 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  n = pLevel->u.in
16640 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  .aInLoop;.    if
16650 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70  ( pIn ){.      p
16660 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  In += pLevel->u.
16670 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20  in.nIn - 1;.    
16680 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54    pIn->iCur = iT
16690 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  ab;.      if( eT
166a0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
166b0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WID ){.        p
166c0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
166d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
166e0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
166f0 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Tab, iReg);.    
16700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16710 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
16720 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16730 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
16740 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
16750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16760 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20  pIn->eEndLoopOp 
16770 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
16780 49 66 4f 70 65 6e 20 3a 20 4f 50 5f 4e 65 78 74  IfOpen : OP_Next
16790 49 66 4f 70 65 6e 3b 0a 20 20 20 20 20 20 73 71  IfOpen;.      sq
167a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
167b0 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c 2c 20 69 52  v, OP_IfNull, iR
167c0 65 67 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  eg); VdbeCoverag
167d0 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(v);.    }else{
167e0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  .      pLevel->u
167f0 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  .in.nIn = 0;.   
16800 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
16810 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
16820 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65  el, pTerm);.  re
16830 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
16840 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
16850 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
16860 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
16870 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
16880 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 73  or an.** index s
16890 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  can..**.** For e
168a0 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72  xample, consider
168b0 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c   table t1(a,b,c,
168c0 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65  d,e,f) with inde
168d0 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20  x i1(a,b,c)..** 
168e0 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52  Suppose the WHER
168f0 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73  E clause is this
16900 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e  :  a==5 AND b IN
16910 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35   (1,2,3) AND c>5
16920 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65   AND c<10.** The
16930 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61   index has as ma
16940 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61  ny as three equa
16950 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16960 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a  , but in this.**
16970 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68   example, the th
16980 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73  ird "c" value is
16990 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
169a0 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a   So only two .**
169b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
169c0 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f   coded.  This ro
169d0 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72  utine will gener
169e0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
169f0 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64  uate.** a==5 and
16a00 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20   b IN (1,2,3).  
16a10 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
16a20 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77  es for a and b w
16a30 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a  ill be stored.**
16a40 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20   in consecutive 
16a50 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
16a60 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
16a70 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73  irst register is
16a80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
16a90 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
16aa0 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42  above nEq==2.  B
16ab0 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  ut this subrouti
16ac0 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
16ad0 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71   value.** of nEq
16ae0 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49   including 0.  I
16af0 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72  f nEq==0, this r
16b00 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79  outine is nearly
16b10 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65   a no-op..** The
16b20 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64   only thing it d
16b30 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20  oes is allocate 
16b40 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  the pLevel->iMem
16b50 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
16b60 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20  .** compute the 
16b70 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
16b80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
16b90 61 52 65 67 20 70 61 72 61 6d 65 74 65 72 20 69  aReg parameter i
16ba0 73 20 30 20 6f 72 20 31 2e 20 20 49 74 20 69 73  s 0 or 1.  It is
16bb0 20 30 20 69 66 20 61 6c 6c 20 57 48 45 52 45 20   0 if all WHERE 
16bc0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
16bd0 74 73 0a 2a 2a 20 61 72 65 20 3d 3d 20 6f 72 20  ts.** are == or 
16be0 49 4e 20 61 6e 64 20 61 72 65 20 63 6f 76 65 72  IN and are cover
16bf0 65 64 20 62 79 20 74 68 65 20 6e 45 71 2e 20 20  ed by the nEq.  
16c00 6e 45 78 74 72 61 52 65 67 20 69 73 20 31 20 69  nExtraReg is 1 i
16c10 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
16c20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
16c30 74 72 61 69 6e 74 20 28 73 75 63 68 20 61 73 20  traint (such as 
16c40 74 68 65 20 22 63 3e 3d 35 20 41 4e 44 20 63 3c  the "c>=5 AND c<
16c50 31 30 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70  10" in the examp
16c60 6c 65 29 20 74 68 61 74 0a 2a 2a 20 6f 63 63 75  le) that.** occu
16c70 72 73 20 61 66 74 65 72 20 74 68 65 20 6e 45 71  rs after the nEq
16c80 20 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61   quality constra
16c90 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ints..**.** This
16ca0 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
16cb0 65 73 20 61 20 72 61 6e 67 65 20 6f 66 20 6e 45  es a range of nE
16cc0 71 2b 6e 45 78 74 72 61 52 65 67 20 6d 65 6d 6f  q+nExtraReg memo
16cd0 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 72 65 74  ry cells and ret
16ce0 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65  urns.** the inde
16cf0 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6d  x of the first m
16d00 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68  emory cell in th
16d10 61 74 20 72 61 6e 67 65 2e 20 54 68 65 20 63 6f  at range. The co
16d20 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73  de that.** calls
16d30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
16d40 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f  ll use that memo
16d50 72 79 20 72 61 6e 67 65 20 74 6f 20 73 74 6f 72  ry range to stor
16d60 65 20 6b 65 79 73 20 66 6f 72 0a 2a 2a 20 73 74  e keys for.** st
16d70 61 72 74 20 61 6e 64 20 74 65 72 6d 69 6e 61 74  art and terminat
16d80 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f  ion conditions o
16d90 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b  f the loop..** k
16da0 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
16db0 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72  loop.  If one or
16dc0 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f   more IN operato
16dd0 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a  rs appear, then.
16de0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
16df0 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64  allocates an add
16e00 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f  itional nEq memo
16e10 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74  ry cells for int
16e20 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a  ernal.** use..**
16e30 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
16e40 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20  ning, *pzAff is 
16e50 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
16e60 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
16e70 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66  ing a.** copy of
16e80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
16e90 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74  nity string of t
16ea0 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74  he index allocat
16eb0 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
16ec0 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45  te3DbMalloc(). E
16ed0 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69  xcept, entries i
16ee0 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  n the copy of th
16ef0 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61  e string associa
16f00 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61  ted.** with equa
16f10 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16f20 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61   that use NONE a
16f30 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20  ffinity are set 
16f40 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  to.** SQLITE_AFF
16f50 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74  _NONE. This is t
16f60 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20  o deal with SQL 
16f70 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c  such as the foll
16f80 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  owing:.**.**   C
16f90 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
16fa0 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
16fb0 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45  Y, b);.**   SELE
16fc0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41  CT ... FROM t1 A
16fd0 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74  S t2, t1 WHERE t
16fe0 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a  1.a = t2.b;.**.*
16ff0 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
17000 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65   above, the inde
17010 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54  x on t1(a) has T
17020 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75  EXT affinity. Bu
17030 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72  t since.** the r
17040 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
17050 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  f the equality c
17060 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29  onstraint (t2.b)
17070 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69   has NONE affini
17080 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72  ty,.** no conver
17090 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61  sion should be a
170a0 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20  ttempted before 
170b0 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c  using a t2.b val
170c0 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a  ue as part of.**
170d0 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68   a key to search
170e0 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63   the index. Henc
170f0 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
17100 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
17110 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72   affinity.** str
17120 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d  ing in this exam
17130 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74  ple would be set
17140 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   to SQLITE_AFF_N
17150 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONE..*/.static i
17160 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69  nt codeAllEquali
17170 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  tyTerms(.  Parse
17180 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17190 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
171a0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ext */.  WhereLe
171b0 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f  vel *pLevel,   /
171c0 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c  * Which nested l
171d0 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  oop of the FROM 
171e0 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f  we are coding */
171f0 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
17200 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65           /* Reve
17210 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  rse the order of
17220 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f   IN operators */
17230 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67  .  int nExtraReg
17240 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
17250 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
17260 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
17270 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
17280 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Aff          /* 
17290 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e  OUT: Set to poin
172a0 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74  t to affinity st
172b0 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 31 36  ring */.){.  u16
172c0 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20   nEq;           
172d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
172e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
172f0 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
17300 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31   to code */.  u1
17310 36 20 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  6 nSkip;        
17320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17330 75 6d 62 65 72 20 6f 66 20 6c 65 66 74 2d 6d 6f  umber of left-mo
17340 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b  st columns to sk
17350 69 70 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ip */.  Vdbe *v 
17360 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
17370 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20        /* The vm 
17380 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
17390 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
173a0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
173b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
173c0 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
173d0 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
173e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
173f0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
17400 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
17410 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
17420 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
17430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17440 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   The WhereLoop o
17450 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  bject */.  int j
17460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17470 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
17480 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
17490 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
174a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
174b0 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
174c0 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
174f0 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
17500 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  te */.  char *zA
17510 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
17520 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
17530 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75  y string to retu
17540 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  rn */..  /* This
17550 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20   module is only 
17560 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20  called on query 
17570 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61  plans that use a
17580 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c  n index. */.  pL
17590 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
175a0 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Loop;.  assert( 
175b0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
175c0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
175d0 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45  ABLE)==0 );.  nE
175e0 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
175f0 65 65 2e 6e 45 71 3b 0a 20 20 6e 53 6b 69 70 20  ee.nEq;.  nSkip 
17600 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
17610 2e 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d  .nSkip;.  pIdx =
17620 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
17630 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74  pIndex;.  assert
17640 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20  ( pIdx!=0 );..  
17650 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
17660 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65  w many memory ce
17670 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  lls we will need
17680 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
17690 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42  hem..  */.  regB
176a0 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
176b0 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d  em + 1;.  nReg =
176c0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
176d0 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b  nEq + nExtraReg;
176e0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
176f0 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66  += nReg;..  zAff
17700 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
17710 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  up(pParse->db, s
17720 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
17730 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29  ityStr(v, pIdx))
17740 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b  ;.  if( !zAff ){
17750 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
17760 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
17770 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53  1;.  }..  if( nS
17780 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  kip ){.    int i
17790 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
177a0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71  >iIdxCur;.    sq
177b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
177c0 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74  v, (bRev?OP_Last
177d0 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64  :OP_Rewind), iId
177e0 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43  xCur);.    VdbeC
177f0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
17800 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43  v==0);.    VdbeC
17810 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
17820 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43  v!=0);.    VdbeC
17830 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
17840 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25  n skip-scan on %
17850 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
17860 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74  );.    j = sqlit
17870 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
17880 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c  OP_Goto);.    pL
17890 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d  evel->addrSkip =
178a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
178b0 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f  p4Int(v, (bRev?O
178c0 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b  P_SeekLT:OP_Seek
178d0 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GT),.           
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178f0 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67   iIdxCur, 0, reg
17900 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20  Base, nSkip);.  
17910 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
17920 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20  (v, bRev==0);.  
17930 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
17940 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
17950 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17960 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20  pHere(v, j);.   
17970 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69   for(j=0; j<nSki
17980 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  p; j++){.      s
17990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
179a0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
179b0 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61  IdxCur, j, regBa
179c0 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61 73 73  se+j);.      ass
179d0 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ert( pIdx->aiCol
179e0 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[j]>=0 );.   
179f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
17a00 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 70  v, "%s", pIdx->p
17a10 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49 64 78  Table->aCol[pIdx
17a20 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  ->aiColumn[j]].z
17a30 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
17a40 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c  }    ..  /* Eval
17a50 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
17a60 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
17a70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66  */.  assert( zAf
17a80 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74 72  f==0 || (int)str
17a90 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29  len(zAff)>=nEq )
17aa0 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b  ;.  for(j=nSkip;
17ab0 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
17ac0 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54    int r1;.    pT
17ad0 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
17ae0 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65  erm[j];.    asse
17af0 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
17b00 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
17b10 77 69 6e 67 20 74 65 73 74 63 61 73 65 20 69 73  wing testcase is
17b20 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65   true for indice
17b30 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74  s with redundant
17b40 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a   columns. .    *
17b50 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44  * Ex: CREATE IND
17b60 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c  EX i1 ON t1(a,b,
17b70 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  a); SELECT * FRO
17b80 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41  M t1 WHERE a=0 A
17b90 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74  ND b=0; */.    t
17ba0 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d  estcase( (pTerm-
17bb0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
17bc0 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  CODED)!=0 );.   
17bd0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
17be0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
17bf0 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
17c00 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  r1 = codeEqualit
17c10 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
17c20 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20  erm, pLevel, j, 
17c30 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29  bRev, regBase+j)
17c40 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65  ;.    if( r1!=re
17c50 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20  gBase+j ){.     
17c60 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
17c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
17c80 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17c90 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a  arse, regBase);.
17ca0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
17cb0 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = r1;.      }els
17cc0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
17cd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17ce0 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65  OP_SCopy, r1, re
17cf0 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
17d00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
17d10 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
17d20 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
17d30 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
17d40 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
17d50 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
17d60 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
17d70 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
17d80 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d  ISNULL|WO_IN))==
17d90 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
17da0 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
17db0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
17dc0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17dd0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
17de0 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
17df0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17e00 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c  Op2(v, OP_IfNull
17e10 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65  , regBase+j, pLe
17e20 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
17e30 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
17e40 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
17e50 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
17e60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
17e70 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
17e80 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
17e90 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[j])==SQLITE_AF
17ea0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
17eb0 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
17ec0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
17ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17ee0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
17ef0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
17f00 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41  hange(pRight, zA
17f10 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ff[j]) ){.      
17f20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
17f30 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
17f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17f50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
17f60 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
17f70 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
17f80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17f90 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
17fa0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17fb0 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20  is a helper for 
17fc0 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
17fd0 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20  e() below.**.** 
17fe0 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74  pStr holds the t
17ff0 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ext of an expres
18000 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65  sion that we are
18010 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65   building up one
18020 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69   term.** at a ti
18030 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  me.  This routin
18040 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72  e adds a new ter
18050 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  m to the end of 
18060 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
18070 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70  ** Terms are sep
18080 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f  arated by AND so
18090 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74   add the "AND" t
180a0 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ext for second a
180b0 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  nd subsequent.**
180c0 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a   terms only..*/.
180d0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
180e0 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  ainAppendTerm(. 
180f0 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c   StrAccum *pStr,
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18110 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73  The text express
18120 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20  ion being built 
18130 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  */.  int iTerm, 
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69   /* Index of thi
18160 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69  s term.  First i
18170 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  s zero */.  cons
18180 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
18190 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
181a0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
181b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
181c0 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op             /
181d0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
181e0 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  erator */.){.  i
181f0 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74  f( iTerm ) sqlit
18200 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
18210 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20  (pStr, " AND ", 
18220 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  5);.  sqlite3Str
18230 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 70  AccumAppendAll(p
18240 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20  Str, zColumn);. 
18250 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
18260 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
18270 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
18280 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
18290 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a  tr, "?", 1);.}..
182a0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
182b0 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20  Level describes 
182c0 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73  a strategy for s
182d0 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54  canning table pT
182e0 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ab. This .** fun
182f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
18300 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
18310 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ing buffer conta
18320 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70 74  ining a descript
18330 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ion.** of the su
18340 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f  bset of table ro
18350 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  ws scanned by th
18360 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68  e strategy in th
18370 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20  e form of an.** 
18380 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  SQL expression. 
18390 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  Or, if all rows 
183a0 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c  are scanned, NUL
183b0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
183c0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
183d0 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a  , if the query:.
183e0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
183f0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
18400 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a  =1 AND b>2;.**.*
18410 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65  * is run and the
18420 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
18430 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74  n (a, b), then t
18440 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
18450 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67  urns a.** string
18460 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   similar to:.**.
18470 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e  **   "a=? AND b>
18480 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  ?".**.** The ret
18490 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  urned pointer po
184a0 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ints to memory o
184b0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
184c0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a  ite3DbMalloc()..
184d0 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
184e0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
184f0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65  he caller to fre
18500 65 20 74 68 65 20 62 75 66 66 65 72 20 77 68 65  e the buffer whe
18510 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  n it is.** no lo
18520 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
18530 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65  /.static char *e
18540 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
18550 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
18560 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
18570 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
18580 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
18590 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
185a0 49 6e 64 65 78 3b 0a 20 20 75 31 36 20 6e 45 71  Index;.  u16 nEq
185b0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
185c0 65 2e 6e 45 71 3b 0a 20 20 75 31 36 20 6e 53 6b  e.nEq;.  u16 nSk
185d0 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ip = pLoop->u.bt
185e0 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74  ree.nSkip;.  int
185f0 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20   i, j;.  Column 
18600 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  *aCol = pTab->aC
18610 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f 6c  ol;.  i16 *aiCol
18620 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
18630 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63  Column;.  StrAcc
18640 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e  um txt;..  if( n
18650 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  Eq==0 && (pLoop-
18660 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
18670 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
18680 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30  E_TOP_LIMIT))==0
18690 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
186a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
186b0 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74  trAccumInit(&txt
186c0 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d  , 0, 0, SQLITE_M
186d0 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78  AX_LENGTH);.  tx
186e0 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c  t.db = db;.  sql
186f0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
18700 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32  nd(&txt, " (", 2
18710 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
18720 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  nEq; i++){.    c
18730 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d  har *z = aiColum
18740 6e 5b 69 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69  n[i] < 0 ? "rowi
18750 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
18760 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[i]].zName;.  
18770 20 20 69 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29    if( i>=nSkip )
18780 7b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 41  {.      explainA
18790 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
187a0 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20  i, z, "=");.    
187b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
187c0 20 69 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   i ) sqlite3StrA
187d0 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
187e0 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20   " AND ", 5);.  
187f0 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
18800 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
18810 22 41 4e 59 28 22 2c 20 34 29 3b 0a 20 20 20 20  "ANY(", 4);.    
18820 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
18830 6d 41 70 70 65 6e 64 41 6c 6c 28 26 74 78 74 2c  mAppendAll(&txt,
18840 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
18850 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
18860 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a  (&txt, ")", 1);.
18870 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6a 20 3d      }.  }..  j =
18880 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d   i;.  if( pLoop-
18890 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42  >wsFlags&WHERE_B
188a0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
188b0 63 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75  char *z = aiColu
188c0 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20 22 72 6f 77  mn[j] < 0 ? "row
188d0 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
188e0 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
188f0 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
18900 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20  Term(&txt, i++, 
18910 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69  z, ">");.  }.  i
18920 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
18930 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  s&WHERE_TOP_LIMI
18940 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
18950 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c   = aiColumn[j] <
18960 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   0 ? "rowid" : a
18970 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
18980 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c  .zName;.    expl
18990 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
189a0 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a  xt, i, z, "<");.
189b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
189c0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
189d0 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74  , ")", 1);.  ret
189e0 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63  urn sqlite3StrAc
189f0 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b  cumFinish(&txt);
18a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
18a10 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
18a20 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e  op unless curren
18a30 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
18a40 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
18a50 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  PLAN.** command.
18a60 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65   If the query be
18a70 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20  ing compiled is 
18a80 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
18a90 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a   PLAN, a single.
18aa0 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64  ** record is add
18ab0 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
18ac0 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
18ad0 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61   table scan stra
18ae0 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76  tegy in .** pLev
18af0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  el..*/.static vo
18b00 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  id explainOneSca
18b10 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
18b20 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
18b30 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
18b40 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
18b50 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
18b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
18b70 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f  ble list this lo
18b80 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a  op refers to */.
18b90 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
18ba0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
18bb0 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69    /* Scan to wri
18bc0 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  te OP_Explain op
18bd0 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  code for */.  in
18be0 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c00 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65   Value for "leve
18c10 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  l" column of out
18c20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  put */.  int iFr
18c30 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
18c40 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
18c50 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c  e for "from" col
18c60 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
18c70 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
18c80 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
18c90 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
18ca0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
18cb0 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a  reBegin() */.){.
18cc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
18cd0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
18ce0 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a  e->explain==2 ).
18cf0 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
18d00 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
18d10 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
18d20 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
18d30 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62  >iFrom];.    Vdb
18d40 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
18d50 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d  Vdbe;      /* VM
18d60 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
18d70 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
18d80 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
18d90 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  db;     /* Datab
18da0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
18db0 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20    char *zMsg;   
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74  /* Text to add t
18de0 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a  o EQP output */.
18df0 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50      int iId = pP
18e00 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
18e10 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28    /* Select id (
18e20 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74  left-most output
18e30 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20   column) */.    
18e40 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20  int isSearch;   
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e60 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52   True for a SEAR
18e70 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43  CH. False for SC
18e80 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  AN. */.    Where
18e90 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
18ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18eb0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72  controlling Wher
18ec0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
18ed0 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20      u32 flags;  
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ef0 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20    /* Flags that 
18f00 64 65 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f  describe this lo
18f10 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70  op */..    pLoop
18f20 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
18f30 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70  p;.    flags = p
18f40 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
18f50 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
18f60 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
18f70 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
18f80 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
18f90 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
18fa0 20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61   isSearch = (fla
18fb0 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49  gs&(WHERE_BTM_LI
18fc0 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
18fd0 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20  MIT))!=0.       
18fe0 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26       || ((flags&
18ff0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
19000 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  LE)==0 && (pLoop
19010 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29  ->u.btree.nEq>0)
19020 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
19030 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48   (wctrlFlags&(WH
19040 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c  ERE_ORDERBY_MIN|
19050 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
19060 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d  X));..    zMsg =
19070 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
19080 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72  db, "%s", isSear
19090 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41  ch?"SEARCH":"SCA
190a0 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
190b0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
190c0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
190d0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
190e0 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45  zMsg, "%s SUBQUE
190f0 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74  RY %d", zMsg,pIt
19100 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a  em->iSelectId);.
19110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19120 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
19130 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
19140 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c  , "%s TABLE %s",
19150 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e   zMsg, pItem->zN
19160 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
19170 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
19180 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  as ){.      zMsg
19190 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
191a0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
191b0 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
191c0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
191d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
191e0 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b  ags & (WHERE_IPK
191f0 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  |WHERE_VIRTUALTA
19200 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26  BLE))==0.     &&
19210 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75   ALWAYS(pLoop->u
19220 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
19230 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
19240 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 3b  onst char *zFmt;
19250 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
19260 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
19270 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
19280 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
19290 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
192a0 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49  ge(db, pLoop, pI
192b0 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
192c0 20 20 61 73 73 65 72 74 28 20 21 28 66 6c 61 67    assert( !(flag
192d0 73 26 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  s&WHERE_AUTO_IND
192e0 45 58 29 20 7c 7c 20 28 66 6c 61 67 73 26 57 48  EX) || (flags&WH
192f0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 3b  ERE_IDX_ONLY) );
19300 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52  .      if( !HasR
19310 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54 61 62  owid(pItem->pTab
19320 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65  ) && IsPrimaryKe
19330 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a  yIndex(pIdx) ){.
19340 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 7a          zFmt = z
19350 57 68 65 72 65 20 3f 20 22 25 73 20 55 53 49 4e  Where ? "%s USIN
19360 47 20 50 52 49 4d 41 52 59 20 4b 45 59 25 2e 30  G PRIMARY KEY%.0
19370 73 25 73 22 20 3a 20 22 25 73 25 2e 30 73 25 73  s%s" : "%s%.0s%s
19380 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
19390 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52 45  f( flags & WHERE
193a0 5f 41 55 54 4f 5f 49 4e 44 45 58 20 29 7b 0a 20  _AUTO_INDEX ){. 
193b0 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 25         zFmt = "%
193c0 73 20 55 53 49 4e 47 20 41 55 54 4f 4d 41 54 49  s USING AUTOMATI
193d0 43 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  C COVERING INDEX
193e0 25 2e 30 73 25 73 22 3b 0a 20 20 20 20 20 20 7d  %.0s%s";.      }
193f0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
19400 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
19410 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20  ){.        zFmt 
19420 3d 20 22 25 73 20 55 53 49 4e 47 20 43 4f 56 45  = "%s USING COVE
19430 52 49 4e 47 20 49 4e 44 45 58 20 25 73 25 73 22  RING INDEX %s%s"
19440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19450 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 25         zFmt = "%
19460 73 20 55 53 49 4e 47 20 49 4e 44 45 58 20 25 73  s USING INDEX %s
19470 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
19480 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
19490 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
194a0 73 67 2c 20 7a 46 6d 74 2c 20 7a 4d 73 67 2c 20  sg, zFmt, zMsg, 
194b0 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68  pIdx->zName, zWh
194c0 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ere);.      sqli
194d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57  te3DbFree(db, zW
194e0 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  here);.    }else
194f0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
19500 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28  ERE_IPK)!=0 && (
19510 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
19520 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a  NSTRAINT)!=0 ){.
19530 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
19540 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
19550 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47   zMsg, "%s USING
19560 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
19570 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20   KEY", zMsg);.. 
19580 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 28       if( flags&(
19590 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
195a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
195b0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
195c0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
195d0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
195e0 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73   (rowid=?)", zMs
195f0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
19600 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
19610 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48  _BOTH_LIMIT)==WH
19620 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29  ERE_BOTH_LIMIT )
19630 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
19640 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
19650 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
19660 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69  rowid>? AND rowi
19670 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d<?)", zMsg);.  
19680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
19690 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
196a0 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
196b0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
196c0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
196d0 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20  "%s (rowid>?)", 
196e0 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
196f0 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 66 6c  se if( ALWAYS(fl
19700 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
19710 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20  MIT) ){.        
19720 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
19730 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
19740 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c   "%s (rowid<?)",
19750 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
19760 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
19770 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
19780 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20  LTABLE.    else 
19790 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
197a0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
197b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  !=0 ){.      zMs
197c0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
197d0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
197e0 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  s VIRTUAL TABLE 
197f0 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d  INDEX %d:%s", zM
19800 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
19810 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
19820 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f  tab.idxNum, pLoo
19830 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
19840 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
19850 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
19860 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
19870 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29  Msg, "%s", zMsg)
19880 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19890 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
198a0 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76  plain, iId, iLev
198b0 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c  el, iFrom, zMsg,
198c0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
198d0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
198e0 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ne explainOneSca
198f0 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  n(u,v,w,x,y,z).#
19900 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
19910 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
19920 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19930 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74   code for the st
19940 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65  art of the iLeve
19950 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65  l-th loop in the
19960 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
19970 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
19980 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49  described by pWI
19990 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  nfo..*/.static B
199a0 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f  itmask codeOneLo
199b0 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65  opStart(.  Where
199c0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
199d0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f  /* Complete info
199e0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
199f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
19a00 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
19a10 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
19a20 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66  h level of pWInf
19a30 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65  o->a[] should be
19a40 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d   coded */.  Bitm
19a50 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
19a60 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73   /* Which tables
19a70 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61   are currently a
19a80 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  vailable */.){. 
19a90 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
19aa0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
19ab0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
19ac0 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
19ad0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
19ae0 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
19af0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  e */.  int addrN
19b00 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  xt;         /* W
19b10 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20  here to jump to 
19b20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
19b30 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a  e next IN case *
19b40 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c  /.  int omitTabl
19b50 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
19b60 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
19b70 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  ndex only */.  i
19b80 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
19b90 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
19ba0 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
19bb0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
19bc0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
19bd0 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65  *pLevel;  /* The
19be0 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20   where level to 
19bf0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
19c00 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
19c10 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
19c20 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e 67  oop object being
19c30 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
19c40 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
19c50 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
19c60 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
19c70 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
19c80 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
19c90 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
19ca0 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61    /* A WHERE cla
19cb0 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61  use term */.  Pa
19cc0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19ce0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
19cf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
19d00 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
19d10 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
19d20 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
19d30 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
19d60 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e  d stmt under con
19d70 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
19d80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19d90 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
19da0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
19db0 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20  erm being coded 
19dc0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b  */.  int addrBrk
19dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19de0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
19df0 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
19e00 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
19e10 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20  int addrCont;   
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
19e40 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
19e50 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
19e60 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b  t iRowidReg = 0;
19e70 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
19e80 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
19e90 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20  is register, if 
19ea0 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e  not zero */.  in
19eb0 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  t iReleaseReg = 
19ec0 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  0;      /* Temp 
19ed0 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
19ee0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
19ef0 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  g */..  pParse =
19f00 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
19f10 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
19f20 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70  Vdbe;.  pWC = &p
19f30 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62  WInfo->sWC;.  db
19f40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
19f50 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
19f60 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20  o->a[iLevel];.  
19f70 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
19f80 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74  pWLoop;.  pTabIt
19f90 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  em = &pWInfo->pT
19fa0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
19fb0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72  ->iFrom];.  iCur
19fc0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
19fd0 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  rsor;.  pLevel->
19fe0 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65  notReady = notRe
19ff0 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26  ady & ~getMask(&
1a000 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
1a010 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76 20  , iCur);.  bRev 
1a020 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61  = (pWInfo->revMa
1a030 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20  sk>>iLevel)&1;. 
1a040 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
1a050 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1a060 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d  HERE_IDX_ONLY)!=
1a070 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  0 .           &&
1a080 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1a090 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
1a0a0 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20  CE_TABLE)==0;.  
1a0b0 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
1a0c0 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45  t((v, "Begin WHE
1a0d0 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69  RE-loop%d: %s",i
1a0e0 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e  Level,pTabItem->
1a0f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  pTab->zName));..
1a100 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
1a110 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61  ls for the "brea
1a120 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65  k" and "continue
1a130 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20  " instructions. 
1a140 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
1a150 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
1a160 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72  to addrBrk to br
1a170 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
1a180 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20  p..  ** Jump to 
1a190 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64  cont to go immed
1a1a0 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65  iately to the ne
1a1b0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
1a1c0 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  the.  ** loop.. 
1a1d0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68   **.  ** When th
1a1e0 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
1a1f0 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
1a200 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20  ave a "addrNxt" 
1a210 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20  label that.  ** 
1a220 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
1a230 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
1a240 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
1a250 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a  tion.  When.  **
1a260 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
1a270 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
1a280 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
1a290 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62  he "addrNxt" lab
1a2a0 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73  el.  ** is the s
1a2b0 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22  ame as "addrBrk"
1a2c0 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b  ..  */.  addrBrk
1a2d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
1a2e0 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
1a2f0 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
1a300 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1a310 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65    addrCont = pLe
1a320 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20  vel->addrCont = 
1a330 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1a340 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  abel(v);..  /* I
1a350 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
1a360 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
1a370 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
1a380 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a  allocate and.  *
1a390 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
1a3a0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
1a3b0 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
1a3c0 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
1a3d0 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
1a3e0 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
1a3f0 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
1a400 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
1a410 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
1a420 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
1a430 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
1a440 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
1a450 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
1a460 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
1a470 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a480 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
1a490 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1a4a0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1a4b0 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46  nt((v, "init LEF
1a4c0 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
1a4d0 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20  flag"));.  }..  
1a4e0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20  /* Special case 
1a4f0 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
1a500 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d   subquery implem
1a510 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
1a520 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70  utine */.  if( p
1a530 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  TabItem->viaCoro
1a540 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  utine ){.    int
1a550 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62   regYield = pTab
1a560 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
1a570 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a580 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
1a590 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  tCoroutine, regY
1a5a0 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65  ield, 0, pTabIte
1a5b0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
1a5c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1a5d0 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
1a5e0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a5f0 2c 20 72 65 67 59 69 65 6c 64 2c 20 61 64 64 72  , regYield, addr
1a600 42 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Brk);.    VdbeCo
1a610 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56  verage(v);.    V
1a620 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a630 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73  next row of \"%s
1a640 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  \"", pTabItem->p
1a650 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
1a660 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1a670 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a  P_Goto;.  }else.
1a680 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a690 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1a6a0 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d  E.  if(  (pLoop-
1a6b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1a6c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
1a6d0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  0 ){.    /* Case
1a6e0 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69   1:  The table i
1a6f0 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  s a virtual-tabl
1a700 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c  e.  Use the VFil
1a710 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20  ter and VNext.  
1a720 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f    **          to
1a730 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
1a740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1a750 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56   iReg;   /* P3 V
1a760 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c  alue for OP_VFil
1a770 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ter */.    int a
1a780 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20  ddrNotFound;.   
1a790 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1a7a0 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
1a7b0 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ;..    sqlite3Ex
1a7c0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1a7d0 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  se);.    iReg = 
1a7e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1a7f0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e  nge(pParse, nCon
1a800 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
1a810 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
1a820 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a  Level->addrBrk;.
1a830 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1a840 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
1a850 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72  {.      int iTar
1a860 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a  get = iReg+j+2;.
1a870 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c        pTerm = pL
1a880 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
1a890 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
1a8a0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1a8b0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1a8c0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1a8d0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  N ){.        cod
1a8e0 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
1a8f0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
1a900 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54  vel, j, bRev, iT
1a910 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1a920 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70  addrNotFound = p
1a930 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
1a940 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a950 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a960 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65  Code(pParse, pTe
1a970 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
1a980 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  t, iTarget);.   
1a990 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1a9a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a9b0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1a9c0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1a9d0 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20  xNum, iReg);.   
1a9e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a9f0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1aa00 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69  , nConstraint, i
1aa10 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  Reg+1);.    sqli
1aa20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1aa30 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75   OP_VFilter, iCu
1aa40 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c  r, addrNotFound,
1aa50 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20   iReg,.         
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1aa70 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  op->u.vtab.idxSt
1aa80 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1aa90 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1aaa0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1aab0 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50  ? P4_MPRINTF : P
1aac0 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 56  4_STATIC);.    V
1aad0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1aae0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1aaf0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
1ab00 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1ab10 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c  Constraint && j<
1ab20 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  16; j++){.      
1ab30 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74  if( (pLoop->u.vt
1ab40 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26  ab.omitMask>>j)&
1ab50 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  1 ){.        dis
1ab60 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1ab70 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1ab80 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1ab90 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  }.    pLevel->op
1aba0 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20   = OP_VNext;.   
1abb0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
1abc0 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
1abd0 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
1abe0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1abf0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1ac00 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1ac10 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74  se, iReg, nConst
1ac20 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71  raint+2);.    sq
1ac30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1ac40 70 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c  p(pParse);.  }el
1ac50 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
1ac60 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1ac70 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
1ac80 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1ac90 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a  & WHERE_IPK)!=0.
1aca0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
1acb0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
1acc0 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
1acd0 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20  OLUMN_EQ))!=0.  
1ace0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32  ){.    /* Case 2
1acf0 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
1ad00 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
1ad10 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
1ad20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  an.    **       
1ad30 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
1ad40 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
1ad50 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
1ad60 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   Or.    **      
1ad70 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
1ad80 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
1ad90 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
1ada0 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20   (...)".    **  
1adb0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63          construc
1adc0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
1add0 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62  sert( pLoop->u.b
1ade0 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20  tree.nEq==1 );. 
1adf0 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
1ae00 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20  ->aLTerm[0];.   
1ae10 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
1ae20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1ae30 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
1ae40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ae50 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
1ae60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1ae70 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1ae80 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1ae90 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
1aea0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1aeb0 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d  .    iRowidReg =
1aec0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1aed0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1aee0 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76   pLevel, 0, bRev
1aef0 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
1af00 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 52 65      if( iRowidRe
1af10 67 21 3d 69 52 65 6c 65 61 73 65 52 65 67 20 29  g!=iReleaseReg )
1af20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1af30 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
1af40 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20  ReleaseReg);.   
1af50 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1af60 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
1af70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1af80 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
1af90 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64  t, iRowidReg, ad
1afa0 64 72 4e 78 74 29 3b 20 56 64 62 65 43 6f 76 65  drNxt); VdbeCove
1afb0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1afc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1afd0 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
1afe0 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69  iCur, addrNxt, i
1aff0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56  RowidReg);.    V
1b000 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b010 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b020 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1b030 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69  ge(pParse, iRowi
1b040 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71  dReg, 1);.    sq
1b050 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1b060 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1b070 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1b080 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1b090 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
1b0a0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1b0b0 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20  P_Noop;.  }else 
1b0c0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1b0d0 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1b0e0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
1b0f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1b100 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
1b110 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  ANGE)!=0.  ){.  
1b120 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65    /* Case 3:  We
1b130 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
1b140 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
1b150 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
1b160 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20   field..    */. 
1b170 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
1b180 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  OP_Noop;.    int
1b190 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20   start;.    int 
1b1a0 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b  memEndValue = 0;
1b1b0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1b1c0 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
1b1d0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1b1e0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1b1f0 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  j = 0;.    pStar
1b200 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20  t = pEnd = 0;.  
1b210 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1b220 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
1b230 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20  _LIMIT ) pStart 
1b240 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1b250 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c  j++];.    if( pL
1b260 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1b270 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
1b280 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61   pEnd = pLoop->a
1b290 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
1b2a0 61 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d  assert( pStart!=
1b2b0 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a  0 || pEnd!=0 );.
1b2c0 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
1b2d0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
1b2e0 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61  tart;.      pSta
1b2f0 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
1b300 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20   pEnd = pTerm;. 
1b310 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
1b320 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
1b330 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1b340 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
1b350 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65  sion that define
1b360 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  s the start boun
1b370 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  d */.      int r
1b380 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20  1, rTemp;       
1b390 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f   /* Registers fo
1b3a0 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74  r holding the st
1b3b0 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a  art boundary */.
1b3c0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
1b3d0 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74  llowing constant
1b3e0 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65   maps TK_xx code
1b3f0 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e  s into correspon
1b400 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73  ding .      ** s
1b410 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74  eek opcodes.  It
1b420 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61   depends on a pa
1b430 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e  rticular orderin
1b440 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20  g of TK_xx.     
1b450 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1b460 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b  u8 aMoveOp[] = {
1b470 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1b480 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GT */  OP_Seek
1b490 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  GT,.           /
1b4a0 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53  * TK_LE */  OP_S
1b4b0 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20 20  eekLE,.         
1b4c0 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f    /* TK_LT */  O
1b4d0 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20  P_SeekLT,.      
1b4e0 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f       /* TK_GE */
1b4f0 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20    OP_SeekGE.    
1b500 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72    };.      asser
1b510 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b  t( TK_LE==TK_GT+
1b520 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b  1 );      /* Mak
1b530 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72  e sure the order
1b540 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ing.. */.      a
1b550 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
1b560 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+2 );      /*
1b570 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f    ... of the TK_
1b580 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a  xx values... */.
1b590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1b5a0 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20  _GE==TK_GT+3 ); 
1b5b0 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20       /*  ... is 
1b5c0 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20  correcct. */..  
1b5d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74      assert( (pSt
1b5e0 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
1b5f0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
1b600 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b610 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73   pStart->wtFlags
1b620 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1b630 29 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53  );.      pX = pS
1b640 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
1b650 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
1b660 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b670 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  se( pStart->left
1b680 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20  Cursor!=iCur ); 
1b690 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f  /* transitive co
1b6a0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
1b6b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1b6c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1b6d0 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
1b6e0 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  &rTemp);.      s
1b6f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b700 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e  (v, aMoveOp[pX->
1b710 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c  op-TK_GT], iCur,
1b720 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
1b730 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1b740 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1b750 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1b760 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  f(v, pX->op==TK_
1b770 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  GT);.      VdbeC
1b780 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d  overageIf(v, pX-
1b790 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20  >op==TK_LE);.   
1b7a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1b7b0 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  f(v, pX->op==TK_
1b7c0 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LT);.      VdbeC
1b7d0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d  overageIf(v, pX-
1b7e0 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20  >op==TK_GE);.   
1b7f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1b800 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1b810 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
1b820 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
1b830 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b840 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
1b850 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1b860 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
1b870 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b890 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
1b8a0 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
1b8b0 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  d, iCur, addrBrk
1b8c0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1b8d0 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d  erageIf(v, bRev=
1b8e0 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  =0);.      VdbeC
1b8f0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
1b900 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  v!=0);.    }.   
1b910 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20   if( pEnd ){.   
1b920 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
1b930 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45     pX = pEnd->pE
1b940 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
1b950 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
1b960 20 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d    assert( (pEnd-
1b970 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1b980 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20  VNULL)==0 );.   
1b990 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e     testcase( pEn
1b9a0 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  d->leftCursor!=i
1b9b0 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69  Cur ); /* Transi
1b9c0 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  tive constraints
1b9d0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
1b9e0 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67  se( pEnd->wtFlag
1b9f0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1ba00 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64   );.      memEnd
1ba10 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65  Value = ++pParse
1ba20 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
1ba30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1ba40 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1ba50 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a  , memEndValue);.
1ba60 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70        if( pX->op
1ba70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LT || pX->o
1ba80 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p==TK_GT ){.    
1ba90 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
1baa0 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47  v ? OP_Le : OP_G
1bab0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
1bac0 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1bad0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20   bRev ? OP_Lt : 
1bae0 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20  OP_Gt;.      }. 
1baf0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
1bb00 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a  (pLevel, pEnd);.
1bb10 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20      }.    start 
1bb20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1bb30 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1bb40 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52   pLevel->op = bR
1bb50 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f  ev ? OP_Prev : O
1bb60 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  P_Next;.    pLev
1bb70 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
1bb80 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1bb90 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72  start;.    asser
1bba0 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30  t( pLevel->p5==0
1bbb0 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74   );.    if( test
1bbc0 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
1bbd0 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
1bbe0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1bbf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1bc00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1bc10 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77  owid, iCur, iRow
1bc20 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1bc30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1bc40 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1bc50 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1bc60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1bc70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73  dbeAddOp3(v, tes
1bc80 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  tOp, memEndValue
1bc90 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69  , addrBrk, iRowi
1bca0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62  dReg);.      Vdb
1bcb0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74  eCoverageIf(v, t
1bcc0 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  estOp==OP_Le);. 
1bcd0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1bce0 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f  eIf(v, testOp==O
1bcf0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Lt);.      Vdb
1bd00 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74  eCoverageIf(v, t
1bd10 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  estOp==OP_Ge);. 
1bd20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1bd30 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f  eIf(v, testOp==O
1bd40 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  P_Gt);.      sql
1bd50 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1bd60 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  (v, SQLITE_AFF_N
1bd70 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f  UMERIC | SQLITE_
1bd80 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1bd90 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1bda0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1bdb0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
1bdc0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20  .    /* Case 4: 
1bdd0 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20  A scan using an 
1bde0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
1bdf0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
1be00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61   WHERE clause ma
1be10 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f  y contain zero o
1be20 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20  r more equality 
1be30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1be40 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22  terms ("==" or "
1be50 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74  IN" operators) t
1be60 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
1be70 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   N.    **       
1be80 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75    left-most colu
1be90 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
1bea0 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f  . It may also co
1beb0 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ntain.    **    
1bec0 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20       inequality 
1bed0 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20  constraints (>, 
1bee0 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20  <, >= or <=) on 
1bef0 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20  the indexed.    
1bf00 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
1bf10 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65  n that immediate
1bf20 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e  ly follows the N
1bf30 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c   equalities. Onl
1bf40 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1bf50 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    the right-most
1bf60 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61   column can be a
1bf70 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74  n inequality - t
1bf80 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20  he rest must.   
1bf90 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20   **         use 
1bfa0 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e  the "==" and "IN
1bfb0 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72  " operators. For
1bfc0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1bfd0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1bfe0 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
1bff0 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66  y,z), then the f
1c000 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73  ollowing clauses
1c010 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a   are all .    **
1c020 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
1c030 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed:.    **.    *
1c040 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1c050 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c060 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a     x=5 AND y=10.
1c070 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1c080 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20    x=5 AND y<10. 
1c090 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1c0a0 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44   x=5 AND y>5 AND
1c0b0 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
1c0c0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1c0d0 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20  y=5 AND z<=10.  
1c0e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1c0f0 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72      The z<10 ter
1c100 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  m of the followi
1c110 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ng cannot be use
1c120 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20  d, only.    **  
1c130 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74         the x=5 t
1c140 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  erm:.    **.    
1c150 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1c160 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a  5 AND z<10.    *
1c170 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1c180 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69   N may be zero i
1c190 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
1c1a0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1c1b0 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ts..    **      
1c1c0 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20     If there are 
1c1d0 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  no inequality co
1c1e0 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20  nstraints, then 
1c1f0 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20  N is at.    **  
1c200 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65         least one
1c210 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1c220 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73          This cas
1c230 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
1c240 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
1c250 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20   WHERE clause.  
1c260 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e    **         con
1c270 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20  straints but an 
1c280 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65  index is selecte
1c290 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64  d anyway, in ord
1c2a0 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  er.    **       
1c2b0 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
1c2c0 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
1c2d0 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
1c2e0 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a  ER BY..    */  .
1c2f0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1c300 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d   u8 aStartOp[] =
1c310 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20   {.      0,.    
1c320 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65    0,.      OP_Re
1c330 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  wind,           
1c340 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 2: (!start_co
1c350 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1c360 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20  rtEq &&  !bRev) 
1c370 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74  */.      OP_Last
1c380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1c390 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   3: (!start_cons
1c3a0 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1c3b0 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f  Eq &&   bRev) */
1c3c0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 54  .      OP_SeekGT
1c3d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  ,           /* 4
1c3e0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1c3f0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1c400 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1c410 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 20       OP_SeekLT, 
1c420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20            /* 5: 
1c430 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1c440 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1c450 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1c460 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20 20 20     OP_SeekGE,   
1c470 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73          /* 6: (s
1c480 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1c490 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1c4a0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1c4b0 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20 20 20   OP_SeekLE      
1c4c0 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61        /* 7: (sta
1c4d0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1c4e0 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20  &&  startEq &&  
1c4f0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1c500 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1c510 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b   u8 aEndOp[] = {
1c520 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c  .      OP_IdxGE,
1c530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1c540 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1c550 74 73 20 26 26 20 21 62 52 65 76 20 26 26 20 21  ts && !bRev && !
1c560 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20  endEq) */.      
1c570 4f 50 5f 49 64 78 47 54 2c 20 20 20 20 20 20 20  OP_IdxGT,       
1c580 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f       /* 1: (end_
1c590 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21  constraints && !
1c5a0 62 52 65 76 20 26 26 20 20 65 6e 64 45 71 29 20  bRev &&  endEq) 
1c5b0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c  */.      OP_IdxL
1c5c0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1c5d0 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   2: (end_constra
1c5e0 69 6e 74 73 20 26 26 20 20 62 52 65 76 20 26 26  ints &&  bRev &&
1c5f0 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20   !endEq) */.    
1c600 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20 20 20    OP_IdxLT,     
1c610 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 65 6e         /* 3: (en
1c620 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1c630 20 20 62 52 65 76 20 26 26 20 20 65 6e 64 45 71    bRev &&  endEq
1c640 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
1c650 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  u16 nEq = pLoop-
1c660 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 20  >u.btree.nEq;   
1c670 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
1c680 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f  = or IN terms */
1c690 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65  .    int regBase
1c6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c6b0 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
1c6c0 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74  er holding const
1c6d0 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  raint values */.
1c6e0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1c6f0 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20  RangeStart = 0; 
1c700 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
1c710 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
1c720 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20  ge start */.    
1c730 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
1c740 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
1c750 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
1c760 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
1c770 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  nd */.    int st
1c780 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20  artEq;          
1c790 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c7a0 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73  f range start us
1c7b0 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
1c7c0 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71  */.    int endEq
1c7d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c7e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1c7f0 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d  ange end uses ==
1c800 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1c810 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73    int start_cons
1c820 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f  traints;       /
1c830 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65  * Start of range
1c840 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
1c850 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  */.    int nCons
1c860 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
1c870 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c880 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1c890 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
1c8a0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
1c8b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1c8c0 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
1c8d0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
1c8e0 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20  IdxCur;         
1c8f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1c900 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
1c910 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
1c920 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20  int nExtraReg = 
1c930 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1c940 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
1c950 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64  registers needed
1c960 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20   */.    int op; 
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
1c990 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
1c9a0 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66    char *zStartAf
1c9b0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
1c9c0 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73  * Affinity for s
1c9d0 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f  tart of range co
1c9e0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
1c9f0 63 68 61 72 20 63 45 6e 64 41 66 66 20 3d 20 30  char cEndAff = 0
1ca00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ca10 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64  Affinity for end
1ca20 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
1ca30 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38 20 62  aint */.    u8 b
1ca40 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30  SeekPastNull = 0
1ca50 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1ca60 20 74 6f 20 73 65 65 6b 20 70 61 73 74 20 69 6e   to seek past in
1ca70 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f 0a 20  itial nulls */. 
1ca80 20 20 20 75 38 20 62 53 74 6f 70 41 74 4e 75 6c     u8 bStopAtNul
1ca90 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1caa0 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74 69 6f 6e  /* Add condition
1cab0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 61 74   to terminate at
1cac0 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20 20 70   NULLs */..    p
1cad0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
1cae0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
1caf0 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
1cb00 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
1cb10 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f  assert( nEq>=pLo
1cb20 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
1cb30 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  p );..    /* If 
1cb40 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66  this loop satisf
1cb50 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72  ies a sort order
1cb60 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75   (pOrderBy) requ
1cb70 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a  est that .    **
1cb80 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
1cb90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
1cba0 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c  implement a "SEL
1cbb0 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20  ECT min(x) ..." 
1cbc0 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74  .    ** query, t
1cbd0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hen the caller w
1cbe0 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74  ill only allow t
1cbf0 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66  he loop to run f
1cc00 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  or.    ** a sing
1cc10 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68  le iteration. Th
1cc20 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1cc30 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75  e first row retu
1cc40 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75  rned.    ** shou
1cc50 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55  ld not have a NU
1cc60 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  LL value stored 
1cc70 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d  in 'x'. If colum
1cc80 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20  n 'x' is.    ** 
1cc90 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66  the first one af
1cca0 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61  ter the nEq equa
1ccb0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1ccc0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20   in the index,. 
1ccd0 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69     ** this requi
1cce0 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c  res some special
1ccf0 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a   handling..    *
1cd00 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  /.    assert( pW
1cd10 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
1cd20 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57  0.         || pW
1cd30 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
1cd40 6e 45 78 70 72 3d 3d 31 0a 20 20 20 20 20 20 20  nExpr==1.       
1cd50 20 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63    || (pWInfo->wc
1cd60 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1cd70 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 20 29  RDERBY_MIN)==0 )
1cd80 3b 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  ;.    if( (pWInf
1cd90 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
1cda0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
1cdb0 21 3d 30 0a 20 20 20 20 20 26 26 20 70 57 49 6e  !=0.     && pWIn
1cdc0 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 0a 20 20 20  fo->nOBSat>0.   
1cdd0 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79    && (pIdx->nKey
1cde0 43 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  Col>nEq).    ){.
1cdf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1ce00 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  oop->u.btree.nSk
1ce10 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  ip==0 );.      b
1ce20 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31  SeekPastNull = 1
1ce30 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1ce40 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1ce50 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
1ce60 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1ce70 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
1ce80 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
1ce90 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72  .    ** of the r
1cea0 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ange. .    */.  
1ceb0 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69    j = nEq;.    i
1cec0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1ced0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
1cee0 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61  MIT ){.      pRa
1cef0 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70  ngeStart = pLoop
1cf00 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
1cf10 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
1cf20 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1cf30 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1cf40 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
1cf50 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
1cf60 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61  geEnd = pLoop->a
1cf70 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
1cf80 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
1cf90 0a 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67  .      if( pRang
1cfa0 65 53 74 61 72 74 3d 3d 30 0a 20 20 20 20 20 20  eStart==0.      
1cfb0 20 26 26 20 28 6a 20 3d 20 70 49 64 78 2d 3e 61   && (j = pIdx->a
1cfc0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e 3d 30  iColumn[nEq])>=0
1cfd0 20 0a 20 20 20 20 20 20 20 26 26 20 70 49 64 78   .       && pIdx
1cfe0 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a  ->pTable->aCol[j
1cff0 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
1d000 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53     ){.        bS
1d010 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b  eekPastNull = 1;
1d020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d030 20 20 20 61 73 73 65 72 74 28 20 70 52 61 6e 67     assert( pRang
1d040 65 45 6e 64 3d 3d 30 20 7c 7c 20 28 70 52 61 6e  eEnd==0 || (pRan
1d050 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
1d060 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
1d070 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  );..    /* Gener
1d080 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
1d090 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
1d0a0 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
1d0b0 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20  == or IN.    ** 
1d0c0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61  and store the va
1d0d0 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65  lues of those te
1d0e0 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rms in an array 
1d0f0 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
1d100 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
1d110 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  regBase..    */.
1d120 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f      regBase = co
1d130 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
1d140 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c  ms(pParse,pLevel
1d150 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c  ,bRev,nExtraReg,
1d160 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20  &zStartAff);.   
1d170 20 61 73 73 65 72 74 28 20 7a 53 74 61 72 74 41   assert( zStartA
1d180 66 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ff==0 || sqlite3
1d190 53 74 72 6c 65 6e 33 30 28 7a 53 74 61 72 74 41  Strlen30(zStartA
1d1a0 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 20 20  ff)>=nEq );.    
1d1b0 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 20  if( zStartAff ) 
1d1c0 63 45 6e 64 41 66 66 20 3d 20 7a 53 74 61 72 74  cEndAff = zStart
1d1d0 41 66 66 5b 6e 45 71 5d 3b 0a 20 20 20 20 61 64  Aff[nEq];.    ad
1d1e0 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
1d1f0 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a  addrNxt;..    /*
1d200 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1d210 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72   a reverse order
1d220 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65   scan on an asce
1d230 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a  nding index, or.
1d240 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64      ** a forward
1d250 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
1d260 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
1d270 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74  x, interchange t
1d280 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  he .    ** start
1d290 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28   and end terms (
1d2a0 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20  pRangeStart and 
1d2b0 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20  pRangeEnd)..    
1d2c0 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c  */.    if( (nEq<
1d2d0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26  pIdx->nKeyCol &&
1d2e0 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
1d2f0 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
1d300 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20  QLITE_SO_ASC)). 
1d310 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20      || (bRev && 
1d320 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e  pIdx->nKeyCol==n
1d330 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
1d340 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20   SWAP(WhereTerm 
1d350 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52  *, pRangeEnd, pR
1d360 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
1d370 20 20 53 57 41 50 28 75 38 2c 20 62 53 65 65 6b    SWAP(u8, bSeek
1d380 50 61 73 74 4e 75 6c 6c 2c 20 62 53 74 6f 70 41  PastNull, bStopA
1d390 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  tNull);.    }.. 
1d3a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1d3b0 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
1d3c0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
1d3d0 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
1d3e0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1d3f0 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
1d400 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f  (pRangeStart->eO
1d410 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29  perator & WO_GE)
1d420 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1d430 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
1d440 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  & (pRangeEnd->eO
1d450 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
1d460 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1d470 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
1d480 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  & (pRangeEnd->eO
1d490 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29  perator & WO_GE)
1d4a0 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74  !=0 );.    start
1d4b0 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72  Eq = !pRangeStar
1d4c0 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74  t || pRangeStart
1d4d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1d4e0 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
1d4f0 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e   endEq =   !pRan
1d500 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45  geEnd || pRangeE
1d510 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
1d520 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
1d530 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
1d540 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61  ints = pRangeSta
1d550 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20  rt || nEq>0;..  
1d560 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e    /* Seek the in
1d570 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68  dex cursor to th
1d580 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
1d590 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f  ange. */.    nCo
1d5a0 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
1d5b0 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74      if( pRangeSt
1d5c0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
1d5d0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
1d5e0 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
1d5f0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
1d600 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1d610 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
1d620 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1d630 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61    if( (pRangeSta
1d640 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1d650 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20  RM_VNULL)==0.   
1d660 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
1d670 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67  prCanBeNull(pRig
1d680 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ht).      ){.   
1d690 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d6a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
1d6b0 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ull, regBase+nEq
1d6c0 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
1d6d0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1d6e0 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
1d6f0 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
1d700 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1d710 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1d720 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1d730 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d  StartAff[nEq])==
1d740 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
1d750 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
1d760 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  ince the compari
1d770 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72  son is to be per
1d780 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63  formed with no c
1d790 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20  onversions.     
1d7a0 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20       ** applied 
1d7b0 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c  to the operands,
1d7c0 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74   set the affinit
1d7d0 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52  y to apply to pR
1d7e0 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20  ight to .       
1d7f0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46     ** SQLITE_AFF
1d800 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20  _NONE.  */.     
1d810 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
1d820 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
1d830 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
1d840 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1d850 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
1d860 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
1d870 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
1d880 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  nEq]) ){.       
1d890 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
1d8a0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
1d8b0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
1d8c0 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e       }  .      n
1d8d0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1d8e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
1d8f0 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
1d900 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1d910 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  L );.    }else i
1d920 66 28 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c  f( bSeekPastNull
1d930 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d940 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d950 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
1d960 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e  se+nEq);.      n
1d970 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1d980 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b      startEq = 0;
1d990 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  .      start_con
1d9a0 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
1d9b0 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c    }.    codeAppl
1d9c0 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
1d9d0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1d9e0 74 72 61 69 6e 74 20 2d 20 62 53 65 65 6b 50 61  traint - bSeekPa
1d9f0 73 74 4e 75 6c 6c 2c 20 7a 53 74 61 72 74 41 66  stNull, zStartAf
1da00 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74  f);.    op = aSt
1da10 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e  artOp[(start_con
1da20 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28  straints<<2) + (
1da30 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52  startEq<<1) + bR
1da40 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ev];.    assert(
1da50 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 73 71   op!=0 );.    sq
1da60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1da70 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
1da80 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
1da90 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
1daa0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1dab0 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
1dac0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1dad0 3d 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20 20 74  ==OP_Rewind);  t
1dae0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1daf0 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 56 64  Rewind );.    Vd
1db00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1db10 6f 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20 20 20  op==OP_Last);   
1db20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1db30 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 56 64  P_Last );.    Vd
1db40 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1db50 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 20  op==OP_SeekGT); 
1db60 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1db70 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20  P_SeekGT );.    
1db80 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1db90 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 29  , op==OP_SeekGE)
1dba0 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1dbb0 3d 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20  =OP_SeekGE );.  
1dbc0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1dbd0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  (v, op==OP_SeekL
1dbe0 45 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  E);  testcase( o
1dbf0 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a  p==OP_SeekLE );.
1dc00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1dc10 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65  If(v, op==OP_See
1dc20 6b 4c 54 29 3b 20 20 74 65 73 74 63 61 73 65 28  kLT);  testcase(
1dc30 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 29   op==OP_SeekLT )
1dc40 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
1dc50 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
1dc60 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1dc70 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e  traint at the en
1dc80 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
1dc90 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a  range (if any)..
1dca0 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73      */.    nCons
1dcb0 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
1dcc0 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20    if( pRangeEnd 
1dcd0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1dce0 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e  Right = pRangeEn
1dcf0 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  d->pExpr->pRight
1dd00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1dd10 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1dd20 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e  Parse, regBase+n
1dd30 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  Eq, 1);.      sq
1dd40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1dd50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
1dd60 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1dd70 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
1dd80 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1dd90 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  _VNULL)==0.     
1dda0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
1ddb0 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
1ddc0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
1ddd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dde0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 75 6c  dOp2(v, OP_IfNul
1ddf0 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
1de00 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
1de10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1de20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1de30 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
1de40 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
1de50 68 74 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51  ht, cEndAff)!=SQ
1de60 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20  LITE_AFF_NONE.  
1de70 20 20 20 20 20 26 26 20 21 73 71 6c 69 74 65 33       && !sqlite3
1de80 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
1de90 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
1dea0 2c 20 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20  , cEndAff).     
1deb0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1dec0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
1ded0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
1dee0 71 2c 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b  q, 1, &cEndAff);
1def0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1df00 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1df10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
1df20 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
1df30 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1df40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1df50 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a   bStopAtNull ){.
1df60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1df70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1df80 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
1df90 45 71 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71  Eq);.      endEq
1dfa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e   = 0;.      nCon
1dfb0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d  straint++;.    }
1dfc0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1dfd0 65 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66  ee(db, zStartAff
1dfe0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
1dff0 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
1e000 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
1e010 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
1e020 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
1e030 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
1e040 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
1e050 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
1e060 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
1e070 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74  /.    if( nConst
1e080 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f  raint ){.      o
1e090 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a  p = aEndOp[bRev*
1e0a0 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20  2 + endEq];.    
1e0b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e0c0 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
1e0d0 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
1e0e0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
1e0f0 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73  aint);.      tes
1e100 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
1e110 78 47 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65  xGT );  VdbeCove
1e120 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
1e130 5f 49 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20  _IdxGT );.      
1e140 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1e150 5f 49 64 78 47 45 20 29 3b 20 20 56 64 62 65 43  _IdxGE );  VdbeC
1e160 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1e170 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
1e180 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e190 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64  =OP_IdxLT );  Vd
1e1a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e1b0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
1e1c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e1d0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20  op==OP_IdxLE ); 
1e1e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e1f0 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  v, op==OP_IdxLE 
1e200 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1e210 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20   Seek the table 
1e220 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69  cursor, if requi
1e230 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62  red */.    disab
1e240 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1e250 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
1e260 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1e270 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
1e280 0a 20 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62  .    if( omitTab
1e290 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  le ){.      /* p
1e2a0 49 64 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e  Idx is a coverin
1e2b0 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65  g index.  No nee
1e2c0 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  d to access the 
1e2d0 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  main table. */. 
1e2e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73     }else if( Has
1e2f0 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62  Rowid(pIdx->pTab
1e300 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  le) ){.      iRo
1e310 77 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73  widReg = ++pPars
1e320 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
1e330 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e340 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
1e350 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
1e360 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1e370 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1e380 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1e390 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1e3a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e3b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
1e3c0 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
1e3d0 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
1e3e0 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
1e3f0 65 6c 73 65 20 69 66 28 20 69 43 75 72 21 3d 69  else if( iCur!=i
1e400 49 64 78 43 75 72 20 29 7b 0a 20 20 20 20 20 20  IdxCur ){.      
1e410 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
1e420 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
1e430 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  dex(pIdx->pTable
1e440 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  );.      iRowidR
1e450 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1e460 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1e470 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a   pPk->nKeyCol);.
1e480 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1e490 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
1e4a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d  ++){.        k =
1e4b0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1e4c0 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d  Index(pIdx, pPk-
1e4d0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20  >aiColumn[j]);. 
1e4e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e4f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1e500 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
1e510 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b  k, iRowidReg+j);
1e520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e530 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e540 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
1e550 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f  nd, iCur, addrCo
1e560 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt,.            
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1e580 52 6f 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e  RowidReg, pPk->n
1e590 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
1e5a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
1e5b0 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  .    /* Record t
1e5c0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
1e5d0 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
1e5e0 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62   the loop. Disab
1e5f0 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45  le .    ** WHERE
1e600 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
1e610 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20  de redundant by 
1e620 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20  the index range 
1e630 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  scan..    */.   
1e640 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1e650 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
1e660 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  OW ){.      pLev
1e670 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
1e680 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e690 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c  bRev ){.      pL
1e6a0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72  evel->op = OP_Pr
1e6b0 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ev;.    }else{. 
1e6c0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
1e6d0 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d  = OP_Next;.    }
1e6e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1e6f0 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 70  = iIdxCur;.    p
1e700 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f  Level->p3 = (pLo
1e710 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
1e720 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29 21 3d 30  E_UNQ_WANTED)!=0
1e730 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69 66 28 20   ? 1:0;.    if( 
1e740 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1e750 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
1e760 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)==0 ){.      
1e770 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
1e780 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
1e790 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
1e7a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1e7b0 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
1e7c0 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  5==0 );.    }.  
1e7d0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
1e7e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
1e7f0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
1e800 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1e810 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
1e820 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1e830 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20  5:  Two or more 
1e840 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78  separately index
1e850 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
1e860 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a  ed by OR.    **.
1e870 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
1e880 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1e890 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1e8a0 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a  a,b,c,d);.    **
1e8b0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
1e8c0 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
1e8d0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
1e8e0 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i2 ON t1(b);.
1e8f0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1e900 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63  INDEX i3 ON t1(c
1e910 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1e920 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1e930 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52   t1 WHERE a=5 OR
1e940 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e   b=7 OR (c=11 AN
1e950 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20  D d=13).    **. 
1e960 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61     ** In the exa
1e970 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20  mple, there are 
1e980 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65  three indexed te
1e990 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1e9a0 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20   OR..    ** The 
1e9b0 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
1e9c0 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
1e9d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1e9e0 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
1e9f0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
1ea00 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
1ea10 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
1ea20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1ea30 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  n, for each inde
1ea40 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f  xed term, the fo
1ea50 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67  llowing. The arg
1ea60 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a  uments to.    **
1ea70 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20   RowSetTest are 
1ea80 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f  such that the ro
1ea90 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
1eaa0 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  nt row is insert
1eab0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  ed.    ** into t
1eac0 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74  he RowSet. If it
1ead0 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
1eae0 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69  ent, control ski
1eaf0 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f  ps the.    ** Go
1eb00 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a  sub opcode and j
1eb10 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f  umps straight to
1eb20 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1eb30 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28  ted by WhereEnd(
1eb40 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
1eb50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1eb60 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e  hereBegin(<term>
1eb70 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ).    **        
1eb80 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20    RowSetTest    
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1eba0 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74  Insert rowid int
1ebb0 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20  o rowset.    ** 
1ebc0 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20           Gosub  
1ebd0 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20      2 A.    **  
1ebe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
1ebf0 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20  reEnd().    **. 
1ec00 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20     ** Following 
1ec10 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20  the above, code 
1ec20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1ec30 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20   loop. Label A, 
1ec40 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
1ec50 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61  * of the Gosub a
1ec60 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74  bove, jumps to t
1ec70 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72  he instruction r
1ec80 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47  ight after the G
1ec90 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oto..    **.    
1eca0 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
1ecb0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
1ecc0 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
1ecd0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
1ece0 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   1.    **       
1ecf0 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20     Goto       B 
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1ed10 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e   The loop is fin
1ed20 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  ished..    **.  
1ed30 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c    **       A: <l
1ed40 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20  oop body>       
1ed50 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75            # Retu
1ed60 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65  rn data, whateve
1ed70 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
1ed80 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
1ed90 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
1eda0 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63        # Jump bac
1edb0 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20  k to the Gosub. 
1edc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1edd0 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65     B: <after the
1ede0 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20   loop>.    **.  
1edf0 20 20 2a 2a 20 41 64 64 65 64 20 32 30 31 34 2d    ** Added 2014-
1ee00 30 35 2d 32 36 3a 20 49 66 20 74 68 65 20 74 61  05-26: If the ta
1ee10 62 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55 54  ble is a WITHOUT
1ee20 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68   ROWID table, th
1ee30 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65 20 61 6e  en.    ** use an
1ee40 20 65 70 68 65 72 6d 65 72 61 6c 20 69 6e 64 65   ephermeral inde
1ee50 78 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 52  x instead of a R
1ee60 6f 77 53 65 74 20 74 6f 20 72 65 63 6f 72 64 20  owSet to record 
1ee70 74 68 65 20 70 72 69 6d 61 72 79 0a 20 20 20 20  the primary.    
1ee80 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68 65 20 72  ** keys of the r
1ee90 6f 77 73 20 77 65 20 68 61 76 65 20 61 6c 72 65  ows we have alre
1eea0 61 64 79 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2a  ady seen..    **
1eeb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72  .    */.    Wher
1eec0 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
1eed0 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61     /* The OR-cla
1eee0 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  use broken out i
1eef0 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
1ef00 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72      SrcList *pOr
1ef10 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68  Tab;       /* Sh
1ef20 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69  ortened table li
1ef30 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20  st or OR-clause 
1ef40 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
1ef50 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20    Index *pCov = 
1ef60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1ef70 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65  * Potential cove
1ef80 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e  ring index (or N
1ef90 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ULL) */.    int 
1efa0 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65  iCovCur = pParse
1efb0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75  ->nTab++;  /* Cu
1efc0 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e  rsor used for in
1efd0 64 65 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e  dex scans (if an
1efe0 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72  y) */..    int r
1eff0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
1f000 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20  rse->nMem;      
1f010 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1f020 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f   used with OP_Go
1f030 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  sub */.    int r
1f040 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20  egRowset = 0;   
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f060 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1f070 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65   for RowSet obje
1f080 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ct */.    int re
1f090 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20  gRowid = 0;     
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1f0c0 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f  holding rowid */
1f0d0 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f  .    int iLoopBo
1f0e0 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dy = sqlite3Vdbe
1f0f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
1f100 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20  * Start of loop 
1f110 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  body */.    int 
1f120 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20  iRetInit;       
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1f150 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e   of regReturn in
1f160 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e  it */.    int un
1f170 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b  testedTerms = 0;
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f190 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63  Some terms not c
1f1a0 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64  ompletely tested
1f1b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1f1e0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1f1f0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1f200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f210 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
1f220 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75  r sub-WHERE clau
1f230 73 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  se */.    Expr *
1f240 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f260 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
1f270 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
1f280 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1f290 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
1f2a0 3b 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20  ;.   .    pTerm 
1f2b0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1f2c0 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0];.    assert( 
1f2d0 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
1f2e0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
1f2f0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
1f300 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1f310 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
1f320 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d  & TERM_ORINFO)!=
1f330 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d  0 );.    pOrWc =
1f340 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
1f350 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76  fo->wc;.    pLev
1f360 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75  el->op = OP_Retu
1f370 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  rn;.    pLevel->
1f380 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a  p1 = regReturn;.
1f390 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61  .    /* Set up a
1f3a0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20   new SrcList in 
1f3b0 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e  pOrTab containin
1f3c0 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  g the table bein
1f3d0 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a  g scanned.    **
1f3e0 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e   by this loop in
1f3f0 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61   the a[0] slot a
1f400 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20  nd all notReady 
1f410 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d  tables in a[1..]
1f420 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
1f430 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  his becomes the 
1f440 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72  SrcList in the r
1f450 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f  ecursive call to
1f460 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1f470 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  in()..    */.   
1f480 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
1f490 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  vel>1 ){.      i
1f4a0 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20  nt nNotReady;   
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4c0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   The number of n
1f4d0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a  otReady tables *
1f4e0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  /.      struct S
1f4f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69  rcList_item *ori
1f500 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69  gSrc;     /* Ori
1f510 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61  ginal list of ta
1f520 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e  bles */.      nN
1f530 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f  otReady = pWInfo
1f540 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65  ->nLevel - iLeve
1f550 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72  l - 1;.      pOr
1f560 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61  Tab = sqlite3Sta
1f570 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20  ckAllocRaw(db,. 
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
1f5a0 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74  f(*pOrTab)+ nNot
1f5b0 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72  Ready*sizeof(pOr
1f5c0 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  Tab->a[0]));.   
1f5d0 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30     if( pOrTab==0
1f5e0 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61   ) return notRea
1f5f0 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  dy;.      pOrTab
1f600 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28  ->nAlloc = (u8)(
1f610 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a  nNotReady + 1);.
1f620 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53        pOrTab->nS
1f630 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c  rc = pOrTab->nAl
1f640 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  loc;.      memcp
1f650 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61  y(pOrTab->a, pTa
1f660 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70  bItem, sizeof(*p
1f670 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20  TabItem));.     
1f680 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66   origSrc = pWInf
1f690 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
1f6a0 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
1f6b0 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b  <=nNotReady; k++
1f6c0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1f6d0 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c  y(&pOrTab->a[k],
1f6e0 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c   &origSrc[pLevel
1f6f0 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65  [k].iFrom], size
1f700 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29  of(pOrTab->a[k])
1f710 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f720 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54  else{.      pOrT
1f730 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ab = pWInfo->pTa
1f740 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  bList;.    }..  
1f750 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1f760 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73  the rowset regis
1f770 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e  ter to contain N
1f780 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c  ULL. An SQL NULL
1f790 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69   is .    ** equi
1f7a0 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70  valent to an emp
1f7b0 74 79 20 72 6f 77 73 65 74 2e 20 20 4f 72 2c 20  ty rowset.  Or, 
1f7c0 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 72 6d  create an epherm
1f7d0 65 72 61 6c 20 69 6e 64 65 78 0a 20 20 20 20 2a  eral index.    *
1f7e0 2a 20 63 61 70 61 62 6c 65 20 6f 66 20 68 6f 6c  * capable of hol
1f7f0 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79  ding primary key
1f800 73 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66  s in the case of
1f810 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1f820 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f830 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  Also initialize 
1f840 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e  regReturn to con
1f850 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73  tain the address
1f860 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74   of the instruct
1f870 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  ion .    ** imme
1f880 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
1f890 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20  g the OP_Return 
1f8a0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
1f8b0 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a   the loop. This.
1f8c0 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
1f8d0 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63  ed in a few obsc
1f8e0 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  ure LEFT JOIN ca
1f8f0 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f  ses where contro
1f900 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f  l jumps.    ** o
1f910 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ver the top of t
1f920 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  he loop into the
1f930 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20   body of it. In 
1f940 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20  this case the . 
1f950 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65     ** correct re
1f960 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65  sponse for the e
1f970 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20  nd-of-loop code 
1f980 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20  (the OP_Return) 
1f990 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61  is to .    ** fa
1f9a0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
1f9b0 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
1f9c0 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f  on, just as an O
1f9d0 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20  P_Next does if. 
1f9e0 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20     ** called on 
1f9f0 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
1fa00 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
1fa10 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
1fa20 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
1fa30 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
1fa40 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  K)==0 ){.      i
1fa50 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1fa60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67  ) ){.        reg
1fa70 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
1fa80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
1fa90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1faa0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1fab0 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20  , regRowset);.  
1fac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fad0 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
1fae0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1faf0 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
1fb00 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
1fb10 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1fb20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1fb30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1fb40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
1fb50 20 72 65 67 52 6f 77 73 65 74 2c 20 70 50 6b 2d   regRowset, pPk-
1fb60 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20  >nKeyCol);.     
1fb70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1fb80 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
1fb90 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20 20 7d  e, pPk);.      }
1fba0 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
1fbb0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1fbc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74  ;.    }.    iRet
1fbd0 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
1fbe0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1fbf0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65  nteger, 0, regRe
1fc00 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  turn);..    /* I
1fc10 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  f the original W
1fc20 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a  HERE clause is z
1fc30 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28   of the form:  (
1fc40 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
1fc50 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68   AND y.    ** Th
1fc60 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  en for every ter
1fc70 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61  m xN, evaluate a
1fc80 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  s the subexpress
1fc90 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20  ion: xN AND z.  
1fca0 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74    ** That way, t
1fcb0 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61  erms in y that a
1fcc0 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f  re factored into
1fcd0 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e   the disjunction
1fce0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
1fcf0 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65  picked up by the
1fd00 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1fd10 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
1fd20 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20  Begin() below.. 
1fd30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74     **.    ** Act
1fd40 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65  ually, each sube
1fd50 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
1fd60 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e  verted to "xN AN
1fd70 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a  D w" where w is.
1fd80 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65      ** the "inte
1fd90 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f  resting" terms o
1fda0 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74  f z - terms that
1fdb0 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
1fdc0 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  te in the.    **
1fdd0 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
1fde0 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
1fdf0 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68  IN, and terms th
1fe00 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73  at are usable as
1fe10 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73   .    ** indices
1fe20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1fe30 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  This optimizatio
1fe40 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c  n also only appl
1fe50 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20 4f  ies if the (x1 O
1fe60 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72  R x2 OR ...) ter
1fe70 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  m.    ** is not 
1fe80 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
1fe90 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
1fea0 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a  LEFT JOIN..    *
1feb0 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74  * See ticket htt
1fec0 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
1fed0 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36  rg/src/info/f236
1fee0 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20  9304e4.    */.  
1fef0 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
1ff00 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
1ff10 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  iTerm;.      for
1ff20 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c  (iTerm=0; iTerm<
1ff30 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72  pWC->nTerm; iTer
1ff40 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  m++){.        Ex
1ff50 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d  pr *pExpr = pWC-
1ff60 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b  >a[iTerm].pExpr;
1ff70 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70 57  .        if( &pW
1ff80 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20 70  C->a[iTerm] == p
1ff90 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Term ) continue;
1ffa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
1ffb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ffc0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1ffd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ffe0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1fff0 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46  WC->a[iTerm].wtF
20000 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
20010 46 4f 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  FO );.        te
20020 73 74 63 61 73 65 28 20 70 57 43 2d 3e 61 5b 69  stcase( pWC->a[i
20030 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20  Term].wtFlags & 
20040 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
20050 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43 2d          if( pWC-
20060 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
20070 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f  s & (TERM_ORINFO
20080 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29  |TERM_VIRTUAL) )
20090 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
200a0 20 20 20 69 66 28 20 28 70 57 43 2d 3e 61 5b 69     if( (pWC->a[i
200b0 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74 6f 72 20  Term].eOperator 
200c0 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20 29 20 63  & WO_ALL)==0 ) c
200d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
200e0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
200f0 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
20100 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
20110 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
20120 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e  3ExprAnd(db, pAn
20130 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  dExpr, pExpr);. 
20140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20150 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
20160 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
20170 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
20180 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  rse, TK_AND, 0, 
20190 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20  pAndExpr, 0);.  
201a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
201b0 20 2f 2a 20 52 75 6e 20 61 20 73 65 70 61 72 61   /* Run a separa
201c0 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
201d0 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66  for each term of
201e0 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 20   the OR clause. 
201f0 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 65 6c   After.    ** el
20200 69 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c 69 63  iminating duplic
20210 61 74 65 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  ates from other 
20220 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 74  WHERE clauses, t
20230 68 65 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61  he action for ea
20240 63 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57 48  ch.    ** sub-WH
20250 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f  ERE clause is to
20260 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 6d   to invoke the m
20270 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73  ain loop body as
20280 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a 20   a subroutine.. 
20290 20 20 20 2a 2f 0a 20 20 20 20 77 63 74 72 6c 46     */.    wctrlF
202a0 6c 61 67 73 20 3d 20 20 57 48 45 52 45 5f 4f 4d  lags =  WHERE_OM
202b0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c 20  IT_OPEN_CLOSE | 
202c0 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 7c  WHERE_AND_ONLY |
202d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
202e0 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54     WHERE_FORCE_T
202f0 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45  ABLE | WHERE_ONE
20300 54 41 42 4c 45 5f 4f 4e 4c 59 3b 0a 20 20 20 20  TABLE_ONLY;.    
20310 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
20320 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  Wc->nTerm; ii++)
20330 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
20340 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f  m *pOrTerm = &pO
20350 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  rWc->a[ii];.    
20360 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
20370 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
20380 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  || (pOrTerm->eOp
20390 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
203a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57  !=0 ){.        W
203b0 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49  hereInfo *pSubWI
203c0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
203d0 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
203e0 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
203f0 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
20400 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72  pOrExpr = pOrTer
20410 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75 72  m->pExpr; /* Cur
20420 72 65 6e 74 20 4f 52 20 63 6c 61 75 73 65 20 74  rent OR clause t
20430 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  erm */.        i
20440 6e 74 20 6a 31 20 3d 20 30 3b 20 20 20 20 20 20  nt j1 = 0;      
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20460 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d  * Address of jum
20470 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  p operation */. 
20480 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
20490 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50  xpr && !ExprHasP
204a0 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c  roperty(pOrExpr,
204b0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
204c0 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45  .          pAndE
204d0 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72  xpr->pLeft = pOr
204e0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
204f0 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78  pOrExpr = pAndEx
20500 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
20510 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
20520 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
20530 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
20540 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
20550 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66          pSubWInf
20560 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
20570 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f  Begin(pParse, pO
20580 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30  rTab, pOrExpr, 0
20590 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c             wctrl
205c0 46 6c 61 67 73 2c 20 69 43 6f 76 43 75 72 29 3b  Flags, iCovCur);
205d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
205e0 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50   pSubWInfo || pP
205f0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
20600 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20610 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
20620 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ubWInfo ){.     
20630 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
20640 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  pSubLoop;.      
20650 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
20660 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  an(.            
20670 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62    pParse, pOrTab
20680 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  , &pSubWInfo->a[
20690 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76  0], iLevel, pLev
206a0 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20  el->iFrom, 0.   
206b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
206c0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
206d0 68 65 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  he sub-WHERE cla
206e0 75 73 65 20 62 6f 64 79 2e 20 20 46 69 72 73 74  use body.  First
206f0 20 73 6b 69 70 20 6f 76 65 72 0a 20 20 20 20 20   skip over.     
20700 20 20 20 20 20 2a 2a 20 64 75 70 6c 69 63 61 74       ** duplicat
20710 65 20 72 6f 77 73 20 66 72 6f 6d 20 70 72 69 6f  e rows from prio
20720 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75  r sub-WHERE clau
20730 73 65 73 2c 20 61 6e 64 20 72 65 63 6f 72 64 20  ses, and record 
20740 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
20750 20 72 6f 77 69 64 20 28 6f 72 20 50 52 49 4d 41   rowid (or PRIMA
20760 52 59 20 4b 45 59 29 20 66 6f 72 20 74 68 65 20  RY KEY) for the 
20770 63 75 72 72 65 6e 74 20 72 6f 77 20 73 6f 20 74  current row so t
20780 68 61 74 20 74 68 65 20 73 61 6d 65 0a 20 20 20  hat the same.   
20790 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 77 69         ** row wi
207a0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69 6e  ll be skipped in
207b0 20 73 75 62 73 65 71 75 65 6e 74 20 73 75 62 2d   subsequent sub-
207c0 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 0a 20  WHERE clauses.. 
207d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
207e0 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
207f0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
20800 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
20810 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
20820 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20         int r;.  
20830 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53            int iS
20840 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63  et = ((ii==pOrWc
20850 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69  ->nTerm-1)?-1:ii
20860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
20870 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
20880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
20890 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78     r = sqlite3Ex
208a0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
208b0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 2d 31  pParse, pTab, -1
208c0 2c 20 69 43 75 72 2c 20 72 65 67 52 6f 77 69 64  , iCur, regRowid
208d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
208e0 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
208f0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
20900 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20   OP_RowSetTest, 
20910 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c  regRowset, 0, r,
20920 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  iSet);.         
20930 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
20940 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
20950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20960 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
20970 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
20980 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
20990 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
209a0 69 6e 74 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e  int nPk = pPk->n
209b0 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
209c0 20 20 20 20 20 20 69 6e 74 20 69 50 6b 3b 0a 0a        int iPk;..
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
209e0 20 52 65 61 64 20 74 68 65 20 50 4b 20 69 6e 74   Read the PK int
209f0 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 65  o an array of te
20a00 6d 70 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f  mp registers. */
20a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
20a20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
20a30 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
20a40 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pk);.           
20a50 20 20 20 66 6f 72 28 69 50 6b 3d 30 3b 20 69 50     for(iPk=0; iP
20a60 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20  k<nPk; iPk++){. 
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
20a80 6e 74 20 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61  nt iCol = pPk->a
20a90 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20  iColumn[iPk];.  
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
20ab0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
20ac0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
20ad0 54 61 62 2c 20 69 43 6f 6c 2c 20 69 43 75 72 2c  Tab, iCol, iCur,
20ae0 20 72 2b 69 50 6b 2c 20 30 29 3b 0a 20 20 20 20   r+iPk, 0);.    
20af0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
20b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
20b10 65 63 6b 20 69 66 20 74 68 65 20 74 65 6d 70 20  eck if the temp 
20b20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 63 6f  table already co
20b30 6e 74 61 69 6e 73 20 74 68 69 73 20 6b 65 79 2e  ntains this key.
20b40 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20 20   If so,.        
20b50 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77        ** the row
20b60 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
20b70 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  n included in th
20b80 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
20b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
20ba0 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  * can be ignored
20bb0 20 28 62 79 20 6a 75 6d 70 69 6e 67 20 70 61 73   (by jumping pas
20bc0 74 20 74 68 65 20 47 6f 73 75 62 20 62 65 6c 6f  t the Gosub belo
20bd0 77 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  w). Otherwise,. 
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20bf0 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20 69  insert the key i
20c00 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
20c10 6c 65 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  le and proceed w
20c20 69 74 68 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ith processing. 
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20c40 74 68 65 20 72 6f 77 2e 0a 20 20 20 20 20 20 20  the row..       
20c50 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20c60 20 20 20 20 20 20 20 20 2a 2a 20 55 73 65 20 73          ** Use s
20c70 6f 6d 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ome of the same 
20c80 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61 73  optimizations as
20c90 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20   OP_RowSetTest: 
20ca0 49 66 20 69 53 65 74 0a 20 20 20 20 20 20 20 20  If iSet.        
20cb0 20 20 20 20 20 20 2a 2a 20 69 73 20 7a 65 72 6f        ** is zero
20cc0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
20cd0 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20 61 6c 72  e key cannot alr
20ce0 65 61 64 79 20 62 65 20 70 72 65 73 65 6e 74 20  eady be present 
20cf0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  in.             
20d00 20 2a 2a 20 74 68 65 20 74 65 6d 70 20 74 61 62   ** the temp tab
20d10 6c 65 2e 20 41 6e 64 20 69 66 20 69 53 65 74 20  le. And if iSet 
20d20 69 73 20 2d 31 2c 20 61 73 73 75 6d 65 20 74 68  is -1, assume th
20d30 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 0a  at there is no .
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20d50 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20   need to insert 
20d60 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65  the key into the
20d70 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61 73 20   temp table, as 
20d80 69 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 0a 20  it will never . 
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20da0 62 65 20 74 65 73 74 65 64 20 66 6f 72 2e 20 20  be tested for.  
20db0 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  */ .            
20dc0 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20 20    if( iSet ){.  
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 31                j1
20de0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
20df0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
20e00 75 6e 64 2c 20 72 65 67 52 6f 77 73 65 74 2c 20  und, regRowset, 
20e10 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20  0, r, nPk);.    
20e20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
20e30 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
20e40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20e50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
20e60 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Set>=0 ){.      
20e70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20e80 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
20e90 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 2c  P_MakeRecord, r,
20ea0 20 6e 50 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b   nPk, regRowid);
20eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ec0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20ed0 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p3(v, OP_IdxInse
20ee0 72 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 72  rt, regRowset, r
20ef0 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  egRowid, 0);.   
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
20f10 20 69 53 65 74 20 29 20 73 71 6c 69 74 65 33 56   iSet ) sqlite3V
20f20 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
20f30 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
20f40 55 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULT);.          
20f50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
20f60 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20       /* Release 
20f70 74 68 65 20 61 72 72 61 79 20 6f 66 20 74 65 6d  the array of tem
20f80 70 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  p registers */. 
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
20fa0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
20fb0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 2c 20  ange(pParse, r, 
20fc0 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nPk);.          
20fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
20fe0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
20ff0 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f  voke the main lo
21000 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62  op body as a sub
21010 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
21020 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21030 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
21040 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69  ub, regReturn, i
21050 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
21060 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
21070 72 65 20 28 73 6b 69 70 70 69 6e 67 20 74 68 65  re (skipping the
21080 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
21090 73 75 62 72 6f 75 74 69 6e 65 29 20 69 66 20 74  subroutine) if t
210a0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
210b0 63 75 72 72 65 6e 74 20 73 75 62 2d 57 48 45 52  current sub-WHER
210c0 45 20 72 6f 77 20 69 73 20 61 20 64 75 70 6c 69  E row is a dupli
210d0 63 61 74 65 20 66 72 6f 6d 20 70 72 69 6f 72 20  cate from prior 
210e0 73 75 62 2d 57 48 45 52 45 73 2e 20 2a 2f 0a 20  sub-WHEREs. */. 
210f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 31 20           if( j1 
21100 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
21110 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20  pHere(v, j1);.. 
21120 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21130 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
21140 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
21150 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
21160 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
21170 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
21180 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
21190 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
211a0 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
211b0 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
211c0 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
211d0 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
211e0 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
211f0 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
21200 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
21210 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
21220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21230 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
21240 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
21250 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
21260 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
21270 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
21280 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
21290 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
212a0 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
212b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
212c0 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
212d0 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
212e0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
212f0 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
21300 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
21310 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
21320 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
21330 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
21340 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
21350 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
21360 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
21370 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
21380 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
21390 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
213a0 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
213b0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
213c0 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
213d0 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
213e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
213f0 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
21400 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
21410 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
21420 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
21430 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
21440 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
21450 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
21460 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
21470 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
21480 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
21490 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
214a0 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
214b0 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
214c0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
214d0 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
214e0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
214f0 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
21500 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
21510 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
21520 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
21530 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21540 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20       pSubLoop = 
21550 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
21560 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
21570 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c    assert( (pSubL
21580 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21590 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
215a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
215b0 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
215c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
215d0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
215e0 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30         && (ii==0
215f0 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e   || pSubLoop->u.
21600 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43  btree.pIndex==pC
21610 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  ov).           &
21620 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
21630 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
21640 65 79 49 6e 64 65 78 28 70 53 75 62 4c 6f 6f 70  eyIndex(pSubLoop
21650 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
21660 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
21670 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
21680 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  rt( pSubWInfo->a
21690 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f  [0].iIdxCur==iCo
216a0 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20  vCur );.        
216b0 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c      pCov = pSubL
216c0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
216d0 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  dex;.           
216e0 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57   wctrlFlags |= W
216f0 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 3b  HERE_REOPEN_IDX;
21700 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21710 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
21720 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ov = 0;.        
21730 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
21740 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f  * Finish the loo
21750 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
21760 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
21770 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
21780 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
21790 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
217a0 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
217b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
217c0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
217d0 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a  pCovidx = pCov;.
217e0 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70      if( pCov ) p
217f0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
21800 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66   iCovCur;.    if
21810 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
21820 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
21830 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  eft = 0;.      s
21840 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
21850 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  (db, pAndExpr);.
21860 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21870 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
21880 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
21890 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
218a0 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
218b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
218c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
218d0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
218e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
218f0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
21900 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
21910 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
21920 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
21930 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62  kFree(db, pOrTab
21940 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
21950 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
21960 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
21970 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
21980 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
21990 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
219a0 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
219b0 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68    /* Case 6:  Th
219c0 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
219d0 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
219e0 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
219f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
21a00 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
21a10 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
21a20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
21a30 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
21a40 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
21a50 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
21a60 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
21a70 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
21a80 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
21a90 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
21aa0 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
21ab0 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 69   if( pTabItem->i
21ac0 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
21ad0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61      /* Tables ma
21ae0 72 6b 65 64 20 69 73 52 65 63 75 72 73 69 76 65  rked isRecursive
21af0 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
21b00 67 6c 65 20 72 6f 77 20 74 68 61 74 20 69 73 20  gle row that is 
21b10 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 20 20  stored in.      
21b20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73  ** a pseudo-curs
21b30 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  or.  No need to 
21b40 52 65 77 69 6e 64 20 6f 72 20 4e 65 78 74 20 73  Rewind or Next s
21b50 75 63 68 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a  uch cursors. */.
21b60 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
21b70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
21b80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
21b90 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
21ba0 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70 4c 65  bRev];.      pLe
21bb0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
21bc0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
21bd0 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
21be0 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61  beAddOp2(v, aSta
21bf0 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20  rt[bRev], iCur, 
21c00 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
21c10 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
21c20 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
21c30 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
21c40 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
21c50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
21c60 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
21c70 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
21c80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
21c90 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
21ca0 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
21cb0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
21cc0 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
21cd0 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
21ce0 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
21cf0 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
21d00 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
21d10 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
21d20 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
21d30 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
21d40 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
21d50 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
21d60 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
21d70 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  TUAL );.    test
21d80 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
21d90 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
21da0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
21db0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
21dc0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
21dd0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
21de0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
21df0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
21e00 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
21e10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )!=0 ){.      te
21e20 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
21e30 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30  untestedTerms==0
21e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e50 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
21e60 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
21e70 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
21e80 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   );.      pWInfo
21e90 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
21ea0 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 1;.      conti
21eb0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
21ec0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
21ed0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
21ee0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
21ef0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
21f00 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
21f10 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
21f20 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63  Join) ){.      c
21f30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
21f40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
21f50 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
21f60 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
21f70 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
21f80 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
21f90 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
21fa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  ;.  }..  /* Inse
21fb0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
21fc0 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73  for implied cons
21fd0 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e  traints based on
21fe0 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20   transitivity.  
21ff0 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f  ** of the "==" o
22000 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
22010 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  ** Example: If t
22020 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
22030 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74  contains "t1.a=t
22040 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31  2.b" and "t2.b=1
22050 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20  23".  ** and we 
22060 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74  are coding the t
22070 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74  1 loop and the t
22080 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79  2 loop has not y
22090 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74  et coded,.  ** t
220a0 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73  hen we cannot us
220b0 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62  e the "t1.a=t2.b
220c0 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75  " constraint, bu
220d0 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20  t we can code.  
220e0 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22  ** the implied "
220f0 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72  t1.a=123" constr
22100 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
22110 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
22120 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
22130 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
22140 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  .    Expr *pE, *
22150 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65  pEAlt;.    Where
22160 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20  Term *pAlt;.    
22170 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
22180 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
22190 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
221a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
221b0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
221c0 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57  tor!=(WO_EQUIV|W
221d0 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65  O_EQ) ) continue
221e0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
221f0 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
22200 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
22210 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
22220 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69 6e  eftJoin ) contin
22230 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65  ue;.    pE = pTe
22240 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
22250 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
22260 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
22270 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20  romJoin) );.    
22280 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
22290 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4c  prereqRight & pL
222a0 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
222b0 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20 3d  =0 );.    pAlt =
222c0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
222d0 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  Cur, pTerm->u.le
222e0 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61  ftColumn, notRea
222f0 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
22300 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41 6c   0);.    if( pAl
22310 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
22320 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e 77  .    if( pAlt->w
22330 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43  tFlags & (TERM_C
22340 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
22350 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
22360 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
22370 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 74  & WO_EQ );.    t
22380 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
22390 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
223a0 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64 75   );.    VdbeModu
223b0 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  leComment((v, "b
223c0 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20  egin transitive 
223d0 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20  constraint"));. 
223e0 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69 74     pEAlt = sqlit
223f0 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
22400 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c  db, sizeof(*pEAl
22410 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45 41  t));.    if( pEA
22420 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 41  lt ){.      *pEA
22430 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70  lt = *pAlt->pExp
22440 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d 3e  r;.      pEAlt->
22450 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66  pLeft = pE->pLef
22460 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
22470 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
22480 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72 43  se, pEAlt, addrC
22490 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
224a0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
224b0 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
224c0 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20 20  db, pEAlt);.    
224d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  }.  }..  /* For 
224e0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
224f0 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
22500 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
22510 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
22520 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
22530 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67  e row of the rig
22540 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74  ht table has mat
22550 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61  ched the left ta
22560 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ble.  .  */.  if
22570 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
22580 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  oin ){.    pLeve
22590 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73  l->addrFirst = s
225a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
225b0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
225c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
225d0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
225e0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
225f0 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
22600 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
22610 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
22620 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ));.    sqlite3E
22630 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
22640 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  arse);.    for(p
22650 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30  Term=pWC->a, j=0
22660 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; j<pWC->nTerm; 
22670 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
22680 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22690 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
226a0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
226b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
226c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
226d0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
226e0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
226f0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
22700 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
22710 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
22720 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
22730 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
22740 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21  evel->notReady)!
22750 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
22760 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
22770 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
22780 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
22790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
227a0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
227b0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
227c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
227d0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
227e0 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
227f0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
22800 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
22810 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
22820 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
22830 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65 76  }..  return pLev
22840 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  el->notReady;.}.
22850 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
22860 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
22870 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
22880 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
22890 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65  XPLAIN)./*.** Ge
228a0 6e 65 72 61 74 65 20 22 45 78 70 6c 61 6e 61 74  nerate "Explanat
228b0 69 6f 6e 22 20 74 65 78 74 20 66 6f 72 20 61 20  ion" text for a 
228c0 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2f 0a 73 74  WhereTerm..*/.st
228d0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 45  atic void whereE
228e0 78 70 6c 61 69 6e 54 65 72 6d 28 56 64 62 65 20  xplainTerm(Vdbe 
228f0 2a 76 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  *v, WhereTerm *p
22900 54 65 72 6d 29 7b 0a 20 20 63 68 61 72 20 7a 54  Term){.  char zT
22910 79 70 65 5b 34 5d 3b 0a 20 20 6d 65 6d 63 70 79  ype[4];.  memcpy
22920 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34  (zType, "...", 4
22930 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  );.  if( pTerm->
22940 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
22950 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30  IRTUAL ) zType[0
22960 5d 20 3d 20 27 56 27 3b 0a 20 20 69 66 28 20 70  ] = 'V';.  if( p
22970 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
22980 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54  & WO_EQUIV  ) zT
22990 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20  ype[1] = 'E';.  
229a0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
229b0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
229c0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
229d0 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b   zType[2] = 'L';
229e0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
229f0 6e 50 72 69 6e 74 66 28 76 2c 20 22 25 73 20 22  nPrintf(v, "%s "
22a00 2c 20 7a 54 79 70 65 29 3b 0a 20 20 73 71 6c 69  , zType);.  sqli
22a10 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 76  te3ExplainExpr(v
22a20 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b  , pTerm->pExpr);
22a30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 57 48 45  .}.#endif /* WHE
22a40 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
22a50 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
22a60 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 20 2a 2f  _TREE_EXPLAIN */
22a70 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ...#ifdef WHERET
22a80 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
22a90 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
22aa0 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
22ab0 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
22ac0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
22ad0 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
22ae0 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57  (WhereLoop *p, W
22af0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
22b00 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
22b10 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
22b20 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20  nfo;.  int nb = 
22b30 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  1+(pWInfo->pTabL
22b40 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a  ist->nSrc+7)/8;.
22b50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22b60 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
22b70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
22b80 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20  >a + p->iTab;.  
22b90 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
22ba0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c  tem->pTab;.  sql
22bb0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22bc0 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
22bd0 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
22c00 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
22c10 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20  , p->prereq);.  
22c20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
22c30 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c50 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
22c60 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
22c70 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
22c80 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
22c90 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
22ca0 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
22cb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
22cc0 61 6d 65 3b 0a 20 20 20 20 20 69 66 28 20 70 2d  ame;.     if( p-
22cd0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
22ce0 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75  && (zName = p->u
22cf0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
22d00 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
22d10 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
22d20 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
22d30 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30  oindex_", 17)==0
22d40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
22d50 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
22d60 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a  n30(zName) - 1;.
22d70 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
22d80 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69  Name[i]!='_' ) i
22d90 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  --;.        zNam
22da0 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  e += i;.      }.
22db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
22dc0 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73  ugPrintf(".%-16s
22dd0 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d   %2d", zName, p-
22de0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20  >u.btree.nEq);. 
22df0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22e00 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
22e10 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20  tf("%20s","");. 
22e20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
22e30 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
22e40 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  f( p->u.vtab.idx
22e50 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  Str ){.      z =
22e60 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
22e70 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29  ("(%d,\"%s\",%x)
22e80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22e90 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
22ea0 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  Num, p->u.vtab.i
22eb0 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62  dxStr, p->u.vtab
22ec0 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
22ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
22ee0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
22ef0 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75  ("(%d,%x)", p->u
22f00 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
22f10 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
22f20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22f30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22f40 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20  " %-19s", z);.  
22f50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22f60 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
22f70 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
22f80 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77  %05x N %d", p->w
22f90 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
22fa0 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
22fb0 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20  ugPrintf(" cost 
22fc0 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e  %d,%d,%d\n", p->
22fd0 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c  rSetup, p->rRun,
22fe0 20 70 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 64 65   p->nOut);.#ifde
22ff0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
23000 54 52 45 45 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  TREE_EXPLAIN.  /
23010 2a 20 49 66 20 74 68 65 20 30 78 31 30 30 20 62  * If the 0x100 b
23020 69 74 20 6f 66 20 77 68 65 72 65 74 72 61 63 69  it of wheretraci
23030 6e 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ng is set, then 
23040 73 68 6f 77 20 61 6c 6c 20 6f 66 20 74 68 65 20  show all of the 
23050 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20  constraint.  ** 
23060 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
23070 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 61 4c 54  he WhereLoop.aLT
23080 65 72 6d 5b 5d 20 61 72 72 61 79 2e 0a 20 20 2a  erm[] array..  *
23090 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72  /.  if( p->nLTer
230a0 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65  m && (sqlite3Whe
230b0 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29  reTrace & 0x100)
230c0 21 3d 30 20 29 7b 20 20 2f 2a 20 57 48 45 52 45  !=0 ){  /* WHERE
230d0 54 52 41 43 45 20 30 78 31 30 30 20 2a 2f 0a 20  TRACE 0x100 */. 
230e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
230f0 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e  be *v = pWInfo->
23100 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
23110 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
23120 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20 20 66  nBegin(v);.    f
23130 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54  or(i=0; i<p->nLT
23140 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
23150 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
23160 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  m = p->aLTerm[i]
23170 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
23180 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
23190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
231a0 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22  plainPrintf(v, "
231b0 20 20 28 25 64 29 20 23 25 2d 32 64 20 22 2c 20    (%d) #%-2d ", 
231c0 69 2b 31 2c 20 28 69 6e 74 29 28 70 54 65 72 6d  i+1, (int)(pTerm
231d0 2d 70 57 43 2d 3e 61 29 29 3b 0a 20 20 20 20 20  -pWC->a));.     
231e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
231f0 75 73 68 28 76 29 3b 0a 20 20 20 20 20 20 77 68  ush(v);.      wh
23200 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 76  ereExplainTerm(v
23210 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
23220 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
23230 70 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p(v);.      sqli
23240 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b  te3ExplainNL(v);
23250 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23260 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68 28  e3ExplainFinish(
23270 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  v);.    sqlite3D
23280 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c  ebugPrintf("%s",
23290 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
232a0 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d  anation(v));.  }
232b0 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
232c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
232d0 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f  bulk memory into
232e0 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f   a valid WhereLo
232f0 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70  op that can be p
23300 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72  assed.** to wher
23310 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c  eLoopClear harml
23320 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  essly..*/.static
23330 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49   void whereLoopI
23340 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nit(WhereLoop *p
23350 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  ){.  p->aLTerm =
23360 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b   p->aLTermSpace;
23370 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  .  p->nLTerm = 0
23380 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20  ;.  p->nLSlot = 
23390 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54  ArraySize(p->aLT
233a0 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e  ermSpace);.  p->
233b0 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a  wsFlags = 0;.}..
233c0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
233d0 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f  WhereLoop.u unio
233e0 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c  n.  Leave WhereL
233f0 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63  oop.pLTerm intac
23400 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
23410 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
23420 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  Union(sqlite3 *d
23430 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
23440 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61  {.  if( p->wsFla
23450 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54  gs & (WHERE_VIRT
23460 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41  UALTABLE|WHERE_A
23470 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20  UTO_INDEX) ){.  
23480 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
23490 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
234a0 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d  LTABLE)!=0 && p-
234b0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
234c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
234d0 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62  3_free(p->u.vtab
234e0 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
234f0 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
23500 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ee = 0;.      p-
23510 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
23520 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
23530 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
23540 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
23550 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72  )!=0 && p->u.btr
23560 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  ee.pIndex!=0 ){.
23570 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
23580 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
23590 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  ee.pIndex->zColA
235a0 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ff);.      sqlit
235b0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
235c0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
235d0 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  ->pKeyInfo);.   
235e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
235f0 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
23600 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70  pIndex);.      p
23610 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
23620 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
23630 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
23640 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d  ate internal mem
23650 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68  ory used by a Wh
23660 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
23670 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
23680 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c  ereLoopClear(sql
23690 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
236a0 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
236b0 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
236c0 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
236d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
236e0 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65  aLTerm);.  where
236f0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
23700 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f  b, p);.  whereLo
23710 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  opInit(p);.}../*
23720 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
23730 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
23740 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c  on for pLoop->aL
23750 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20  Term[] to be at 
23760 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74  least n..*/.stat
23770 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
23780 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a  Resize(sqlite3 *
23790 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
237a0 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72  , int n){.  Wher
237b0 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20  eTerm **paNew;. 
237c0 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d   if( p->nLSlot>=
237d0 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
237e0 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37  E_OK;.  n = (n+7
237f0 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20  )&~7;.  paNew = 
23800 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
23810 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  aw(db, sizeof(p-
23820 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
23830 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
23840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23850 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  OMEM;.  memcpy(p
23860 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
23870 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
23880 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
23890 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
238a0 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
238b0 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
238c0 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
238d0 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
238e0 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
238f0 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
23900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
23910 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
23920 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
23930 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
23940 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
23950 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
23960 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
23970 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
23980 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
23990 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
239a0 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
239b0 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
239c0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
239d0 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
239e0 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
239f0 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
23a00 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
23a10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23a20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
23a30 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f  memcpy(pTo, pFro
23a40 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46  m, WHERE_LOOP_XF
23a50 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79  ER_SZ);.  memcpy
23a60 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46  (pTo->aLTerm, pF
23a70 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f  rom->aLTerm, pTo
23a80 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28  ->nLTerm*sizeof(
23a90 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29  pTo->aLTerm[0]))
23aa0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77  ;.  if( pFrom->w
23ab0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
23ac0 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
23ad0 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62     pFrom->u.vtab
23ae0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
23af0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f   }else if( (pFro
23b00 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
23b10 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
23b20 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 ){.    pFrom->
23b30 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
23b40 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
23b50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
23b60 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68  *.** Delete a Wh
23b70 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a  ereLoop object.*
23b80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
23b90 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71  ereLoopDelete(sq
23ba0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
23bb0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72  Loop *p){.  wher
23bc0 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
23bd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
23be0 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
23bf0 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
23c00 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
23c10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
23c20 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
23c30 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
23c40 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
23c50 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
23c60 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  ) ){.    whereCl
23c70 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
23c80 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
23c90 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
23ca0 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
23cb0 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
23cc0 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
23cd0 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
23ce0 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
23cf0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
23d00 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
23d10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
23d20 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
23d30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
23d40 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 62  Return TRUE if b
23d50 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  oth of the follo
23d60 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
23d70 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61  *.**   (1)  X ha
23d80 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
23d90 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a  wer cost that Y.
23da0 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61  **   (2)  X is a
23db0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
23dc0 66 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72  f Y.**.** By "pr
23dd0 6f 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20  oper subset" we 
23de0 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73  mean that X uses
23df0 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61   fewer WHERE cla
23e00 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61  use terms.** tha
23e10 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65  n Y and that eve
23e20 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
23e30 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69  term used by X i
23e40 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62  s also used.** b
23e50 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20  y Y..**.** If X 
23e60 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
23e70 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69  et of Y then Y i
23e80 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63  s a better choic
23e90 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74  e and ought.** t
23ea0 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63  o have a lower c
23eb0 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ost.  This routi
23ec0 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ne returns TRUE 
23ed0 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a  when that cost .
23ee0 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  ** relationship 
23ef0 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20  is inverted and 
23f00 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75  needs to be adju
23f10 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
23f20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  int whereLoopChe
23f30 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
23f40 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  (.  const WhereL
23f50 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f  oop *pX,       /
23f60 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f  * First WhereLoo
23f70 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  p to compare */.
23f80 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
23f90 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20  p *pY        /* 
23fa0 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  Compare against 
23fb0 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a  this WhereLoop *
23fc0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
23fd0 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72  .  if( pX->nLTer
23fe0 6d 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 20  m >= pY->nLTerm 
23ff0 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58  ) return 0; /* X
24000 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74   is not a subset
24010 20 6f 66 20 59 20 2a 2f 0a 20 20 69 66 28 20 70   of Y */.  if( p
24020 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72  X->rRun >= pY->r
24030 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Run ){.    if( p
24040 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52  X->rRun > pY->rR
24050 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  un ) return 0;  
24060 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72    /* X costs mor
24070 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20  e than Y */.    
24080 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70  if( pX->nOut > p
24090 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e  Y->nOut ) return
240a0 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74   0;    /* X cost
240b0 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f  s more than Y */
240c0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d  .  }.  for(i=pX-
240d0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  >nLTerm-1; i>=0;
240e0 20 69 2d 2d 29 7b 0a 20 20 20 20 66 6f 72 28 6a   i--){.    for(j
240f0 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  =pY->nLTerm-1; j
24100 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
24110 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b   if( pY->aLTerm[
24120 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  j]==pX->aLTerm[i
24130 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ] ) break;.    }
24140 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72  .    if( j<0 ) r
24150 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e  eturn 0;  /* X n
24160 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
24170 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d   since term X[i]
24180 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a   not used by Y *
24190 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  /.  }.  return 1
241a0 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74  ;  /* All condit
241b0 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a  ions meet */.}..
241c0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a  /*.** Try to adj
241d0 75 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ust the cost of 
241e0 57 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c  WhereLoop pTempl
241f0 61 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64  ate upwards or d
24200 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74  ownwards so.** t
24210 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  hat:.**.**   (1)
24220 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73   pTemplate costs
24230 20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f   less than any o
24240 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20  ther WhereLoops 
24250 74 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65  that are a prope
24260 72 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65  r.**       subse
24270 74 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a  t of pTemplate.*
24280 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70  *.**   (2) pTemp
24290 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20  late costs more 
242a0 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57  than any other W
242b0 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68  hereLoops for wh
242c0 69 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a  ich pTemplate.**
242d0 20 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70         is a prop
242e0 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a  er subset..**.**
242f0 20 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f   To say "WhereLo
24300 6f 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  op X is a proper
24310 20 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65   subset of Y" me
24320 61 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20  ans that X uses 
24330 66 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63  fewer.** WHERE c
24340 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e  lause terms than
24350 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72   Y and that ever
24360 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
24370 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73  erm used by X is
24380 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79  .** also used by
24390 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61   Y..**.** This a
243a0 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6f 6d 69  djustment is omi
243b0 74 74 65 64 20 66 6f 72 20 53 4b 49 50 53 43 41  tted for SKIPSCA
243c0 4e 20 6c 6f 6f 70 73 2e 20 20 49 6e 20 61 20 53  N loops.  In a S
243d0 4b 49 50 53 43 41 4e 20 6c 6f 6f 70 2c 20 74 68  KIPSCAN loop, th
243e0 65 0a 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 6e  e.** WhereLoop.n
243f0 4c 54 65 72 6d 20 66 69 65 6c 64 20 69 73 20 6e  LTerm field is n
24400 6f 74 20 61 6e 20 61 63 63 75 72 61 74 65 20 6d  ot an accurate m
24410 65 61 73 75 72 65 20 6f 66 20 74 68 65 20 6e 75  easure of the nu
24420 6d 62 65 72 20 6f 66 20 57 48 45 52 45 0a 2a 2a  mber of WHERE.**
24430 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 63 6f   clause terms co
24440 76 65 72 65 64 2c 20 73 69 6e 63 65 20 73 6f 6d  vered, since som
24450 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  e of the first n
24460 4c 54 65 72 6d 20 65 6e 74 72 69 65 73 20 69 6e  LTerm entries in
24470 20 61 4c 54 65 72 6d 5b 5d 0a 2a 2a 20 77 69 6c   aLTerm[].** wil
24480 6c 20 62 65 20 4e 55 4c 4c 20 28 62 65 63 61 75  l be NULL (becau
24490 73 65 20 74 68 65 79 20 61 72 65 20 73 6b 69 70  se they are skip
244a0 70 65 64 29 2e 20 20 54 68 61 74 20 6d 61 6b 65  ped).  That make
244b0 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
244c0 75 6c 74 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  ult.** to compar
244d0 65 20 74 68 65 20 6c 6f 6f 70 73 2e 20 20 57 65  e the loops.  We
244e0 20 63 6f 75 6c 64 20 61 64 64 20 65 78 74 72 61   could add extra
244f0 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
24500 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 61 6e 64 0a  comparison, and.
24510 2a 2a 20 70 65 72 68 61 70 73 20 77 65 20 77 69  ** perhaps we wi
24520 6c 6c 20 73 6f 6d 65 64 61 79 2e 20 20 42 75 74  ll someday.  But
24530 20 53 4b 49 50 53 43 41 4e 20 69 73 20 73 75 66   SKIPSCAN is suf
24540 66 69 63 69 65 6e 74 6c 79 20 75 6e 63 6f 6d 6d  ficiently uncomm
24550 6f 6e 2c 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  on, and this.** 
24560 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 73 75  adjustment is su
24570 66 66 69 63 69 65 6e 74 20 6d 69 6e 6f 72 2c 20  fficient minor, 
24580 74 68 61 74 20 69 74 20 69 73 20 76 65 72 79 20  that it is very 
24590 64 69 66 66 69 63 75 6c 74 20 74 6f 20 63 6f 6e  difficult to con
245a0 73 74 72 75 63 74 0a 2a 2a 20 61 20 74 65 73 74  struct.** a test
245b0 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
245c0 65 78 74 72 61 20 63 6f 64 65 20 77 6f 75 6c 64  extra code would
245d0 20 69 6d 70 72 6f 76 65 20 74 68 65 20 71 75 65   improve the que
245e0 72 79 20 70 6c 61 6e 2e 20 20 42 65 74 74 65 72  ry plan.  Better
245f0 0a 2a 2a 20 74 6f 20 61 76 6f 69 64 20 74 68 65  .** to avoid the
24600 20 61 64 64 65 64 20 63 6f 6d 70 6c 65 78 69 74   added complexit
24610 79 20 61 6e 64 20 6a 75 73 74 20 6f 6d 69 74 20  y and just omit 
24620 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 73  cost adjustments
24630 20 74 6f 20 53 4b 49 50 53 43 41 4e 0a 2a 2a 20   to SKIPSCAN.** 
24640 6c 6f 6f 70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  loops..*/.static
24650 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41   void whereLoopA
24660 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20  djustCost(const 
24670 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
24680 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
24690 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d  te){.  if( (pTem
246a0 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
246b0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
246c0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
246d0 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  f( (pTemplate->w
246e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
246f0 4b 49 50 53 43 41 4e 29 21 3d 30 20 29 20 72 65  KIPSCAN)!=0 ) re
24700 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b  turn;.  for(; p;
24710 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
24720 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
24730 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
24740 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
24750 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
24760 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
24770 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ED)==0 ) continu
24780 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  e;.    if( (p->w
24790 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
247a0 4b 49 50 53 43 41 4e 29 21 3d 30 20 29 20 63 6f  KIPSCAN)!=0 ) co
247b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
247c0 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72  whereLoopCheaper
247d0 50 72 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20  ProperSubset(p, 
247e0 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20  pTemplate) ){.  
247f0 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54      /* Adjust pT
24800 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77  emplate cost dow
24810 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20 69 74  nward so that it
24820 20 69 73 20 63 68 65 61 70 65 72 20 74 68 61 6e   is cheaper than
24830 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73   its .      ** s
24840 75 62 73 65 74 20 70 20 2a 2f 0a 20 20 20 20 20  ubset p */.     
24850 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
24860 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
24870 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
24880 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b  t = p->nOut - 1;
24890 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
248a0 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
248b0 72 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d  roperSubset(pTem
248c0 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20  plate, p) ){.   
248d0 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65     /* Adjust pTe
248e0 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61  mplate cost upwa
248f0 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
24900 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70   costlier than p
24910 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20   since.      ** 
24920 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70  pTemplate is a p
24930 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
24940 70 20 2a 2f 0a 20 20 20 20 20 20 70 54 65 6d 70  p */.      pTemp
24950 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
24960 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
24970 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
24980 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d  >nOut + 1;.    }
24990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
249a0 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66  arch the list of
249b0 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a   WhereLoops in *
249c0 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66  ppPrev looking f
249d0 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  or one that can 
249e0 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64  be.** supplanted
249f0 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a   by pTemplate..*
24a00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  *.** Return NULL
24a10 20 69 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   if the WhereLoo
24a20 70 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  p list contains 
24a30 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 61  an entry that ca
24a40 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54  n supplant.** pT
24a50 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65  emplate, in othe
24a60 72 20 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70  r words if pTemp
24a70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65  late does not be
24a80 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74  long on the list
24a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73  ..**.** If pX is
24aa0 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   a WhereLoop tha
24ab0 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  t pTemplate can 
24ac0 73 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72  supplant, then r
24ad0 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e  eturn the.** lin
24ae0 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  k that points to
24af0 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54   pX..**.** If pT
24b00 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73  emplate cannot s
24b10 75 70 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73  upplant any exis
24b20 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  ting element of 
24b30 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65  the list but nee
24b40 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65  ds.** to be adde
24b50 64 20 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74  d to the list, t
24b60 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
24b70 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c  nter to the tail
24b80 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   of the list..*/
24b90 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f  .static WhereLoo
24ba0 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e  p **whereLoopFin
24bb0 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72 65  dLesser(.  Where
24bc0 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20  Loop **ppPrev,. 
24bd0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
24be0 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20   *pTemplate.){. 
24bf0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
24c00 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29   for(p=(*ppPrev)
24c10 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e  ; p; ppPrev=&p->
24c20 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70  pNextLoop, p=*pp
24c30 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70  Prev){.    if( p
24c40 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74  ->iTab!=pTemplat
24c50 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53  e->iTab || p->iS
24c60 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74  ortIdx!=pTemplat
24c70 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20  e->iSortIdx ){. 
24c80 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65       /* If eithe
24c90 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69 53  r the iTab or iS
24ca0 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f  ortIdx values fo
24cb0 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20  r two WhereLoop 
24cc0 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  are different.  
24cd0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73      ** then thos
24ce0 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65  e WhereLoops nee
24cf0 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72  d to be consider
24d00 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
24d10 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20 20  Neither is.     
24d20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20   ** a candidate 
24d30 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f  to replace the o
24d40 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63  ther. */.      c
24d50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
24d60 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72     /* In the cur
24d70 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
24d80 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20  ion, the rSetup 
24d90 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
24da0 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74  zero.    ** or t
24db0 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64  he cost of build
24dc0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
24dd0 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61   index (NlogN) a
24de0 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20  nd the NlogN.   
24df0 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
24e00 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57  for compatible W
24e10 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20  hereLoops. */.  
24e20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
24e30 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c  tup==0 || pTempl
24e40 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a  ate->rSetup==0 .
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70   || p->rSetup==p
24e70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
24e80 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72   );..    /* wher
24e90 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20  eLoopAddBtree() 
24ea0 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 73  always generates
24eb0 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65   and inserts the
24ec0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
24ed0 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72  .    ** case fir
24ee0 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61  st.  Hence compa
24ef0 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20  tible candidate 
24f00 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72  WhereLoops never
24f10 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20   have a larger. 
24f20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61     ** rSetup. Ca
24f30 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e  ll this SETUP-IN
24f40 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61  VARIANT */.    a
24f50 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
24f60 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
24f70 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  tup );..    /* A
24f80 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e  ny loop using an
24f90 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69   appliation-defi
24fa0 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52  ned index (or PR
24fb0 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20  IMARY KEY or.   
24fc0 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   ** UNIQUE const
24fd0 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20  raint) with one 
24fe0 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74  or more == const
24ff0 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65 72  raints is better
25000 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20  .    ** than an 
25010 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
25020 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
25030 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25040 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20  AUTO_INDEX)!=0. 
25050 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
25060 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
25070 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
25080 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74      && (pTemplat
25090 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
250a0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30  RE_COLUMN_EQ)!=0
250b0 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72 65  .     && (p->pre
250c0 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
250d0 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
250e0 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ate->prereq.    
250f0 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
25100 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
25110 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
25120 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
25130 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
25140 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62 65  pTemplate can be
25150 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 65  .    ** discarde
25160 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70 20  d.  WhereLoop p 
25170 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20 20  is better if:.  
25180 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68 61    **   (1)  p ha
25190 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64  s no more depend
251a0 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65 6d  encies than pTem
251b0 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a  plate, and.    *
251c0 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20 61  *   (2)  p has a
251d0 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72  n equal or lower
251e0 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d 70   cost than pTemp
251f0 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  late.    */.    
25200 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
25210 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25220 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20  eq)==p->prereq  
25230 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20    /* (1)  */.   
25240 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d    && p->rSetup<=
25250 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
25260 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
25270 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
25280 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70     && p->rRun<=p
25290 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20  Template->rRun  
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20      /* (2b) */. 
252c0 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d      && p->nOut<=
252d0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252f0 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a       /* (2c) */.
25300 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
25310 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63 61  urn 0;  /* Disca
25320 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  rd pTemplate */.
25330 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
25340 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 6c   pTemplate is al
25350 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61 6e  ways better than
25360 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20 70   p, then cause p
25370 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
25380 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 70  en.    ** with p
25390 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d 70  Template.  pTemp
253a0 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20 74  late is better t
253b0 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a  han p if:.    **
253c0 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61 74     (1)  pTemplat
253d0 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65  e has no more de
253e0 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20 70  pendences than p
253f0 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28  , and.    **   (
25400 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61  2)  pTemplate ha
25410 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
25420 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 2e  wer cost than p.
25430 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25440 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
25450 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
25460 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
25470 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  eq   /* (1)  */.
25480 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e       && p->rRun>
25490 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
254c0 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2a) */.     && 
254d0 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61  p->nOut>=pTempla
254e0 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25500 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
25510 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
25520 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
25530 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
25540 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e  p ); /* SETUP-IN
25550 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f  VARIANT above */
25560 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 20  .      break;   
25570 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62 65  /* Cause p to be
25580 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20   overwritten by 
25590 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
255a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
255b0 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ppPrev;.}../*.**
255c0 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61   Insert or repla
255d0 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65  ce a WhereLoop e
255e0 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74  ntry using the t
255f0 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64  emplate supplied
25600 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
25610 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  ing WhereLoop en
25620 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65  try might be ove
25630 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
25640 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20  new template.** 
25650 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61  is better and ha
25660 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  s fewer dependen
25670 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65  cies.  Or the te
25680 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69  mplate will be i
25690 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f  gnored.** and no
256a0 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63   insert will occ
256b0 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ur if an existin
256c0 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66  g WhereLoop is f
256d0 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a  aster and has.**
256e0 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
256f0 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d  ies than the tem
25700 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73  plate.  Otherwis
25710 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
25720 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61  p is.** added ba
25730 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c  sed on the templ
25740 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ate..**.** If pB
25750 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
25760 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
25770 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e  we care about on
25780 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71  ly the.** prereq
25790 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e  uisites and rRun
257a0 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20   and nOut costs 
257b0 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f  of the N best lo
257c0 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e  ops.  That.** in
257d0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74  formation is gat
257e0 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75  hered in the pBu
257f0 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62  ilder->pOrSet ob
25800 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63  ject.  This spec
25810 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e  ial.** processin
25820 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f  g mode is used o
25830 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  nly for OR claus
25840 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
25850 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c  .** When accumul
25860 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c  ating multiple l
25870 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c  oops (when pBuil
25880 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e  der->pOrSet is N
25890 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c  ULL) we.** still
258a0 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65   might overwrite
258b0 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77   similar loops w
258c0 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70  ith the new temp
258d0 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  late if the.** n
258e0 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ew template is b
258f0 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
25900 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
25910 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
25920 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
25930 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
25940 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
25950 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
25960 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
25970 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
25980 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
25990 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
259a0 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
259b0 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
259c0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
259d0 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
259e0 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
259f0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
25a00 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
25a10 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
25a20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
25a30 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65  reLoopInsert(Whe
25a40 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
25a50 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f  Builder, WhereLo
25a60 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a  op *pTemplate){.
25a70 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
25a80 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72  Prev, *p;.  Wher
25a90 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
25aa0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
25ab0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
25ac0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
25ad0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ->db;..  /* If p
25ae0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
25af0 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
25b00 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
25b10 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
25b20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
25b30 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
25b40 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
25b50 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  {.#if WHERETRACE
25b60 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36  _ENABLED.    u16
25b70 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
25b80 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e  OrSet->n;.    in
25b90 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20  t x =.#endif.   
25ba0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
25bb0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
25bc0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25bd0 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
25be0 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c00 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
25c10 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
25c20 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
25c30 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
25c40 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25c50 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
25c60 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25c70 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72  gPrintf(x?"   or
25c80 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58  -%d:  ":"   or-X
25c90 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20  :  ", n);.      
25ca0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
25cb0 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
25cc0 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
25cd0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
25ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
25cf0 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..  /* Look for 
25d00 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
25d10 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65  eLoop to replace
25d20 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a   with pTemplate.
25d30 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70    */.  whereLoop
25d40 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66  AdjustCost(pWInf
25d50 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
25d60 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20  late);.  ppPrev 
25d70 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
25d80 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70  esser(&pWInfo->p
25d90 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
25da0 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76  );..  if( ppPrev
25db0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
25dc0 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
25dd0 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ts a WhereLoop o
25de0 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  n the list that 
25df0 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
25e00 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
25e10 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20   so just ignore 
25e20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66  pTemplate */.#if
25e30 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
25e40 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
25e50 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25e60 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
25e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
25e80 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e  bugPrintf("ins-n
25e90 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  oop: ");.      w
25ea0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
25eb0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
25ec0 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23  r->pWC);.    }.#
25ed0 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
25ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20   SQLITE_OK;  .  
25ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a  }else{.    p = *
25f00 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f  ppPrev;.  }..  /
25f10 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
25f20 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e  is point it mean
25f30 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b  s that either p[
25f40 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72  ] should be over
25f50 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74  written.  ** wit
25f60 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66  h pTemplate[] if
25f70 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20   p[] exists, or 
25f80 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20  if p==NULL then 
25f90 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20  allocate a new. 
25fa0 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e   ** WhereLoop an
25fb0 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a  d insert it..  *
25fc0 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
25fd0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
25fe0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
25ff0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
26000 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
26010 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26020 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
26030 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20  s-del:  ");.    
26040 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
26050 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
26060 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
26070 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26080 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a  ("ins-new:  ");.
26090 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
260a0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
260b0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
260c0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
260d0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  ==0 ){.    /* Al
260e0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
260f0 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f  reLoop to add to
26100 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
26110 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50  list */.    *ppP
26120 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65  rev = p = sqlite
26130 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
26140 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
26150 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
26160 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
26170 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65  E_NOMEM;.    whe
26180 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
26190 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20     p->pNextLoop 
261a0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
261b0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20    /* We will be 
261c0 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72  overwriting Wher
261d0 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20  eLoop p[].  But 
261e0 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69  before we do, fi
261f0 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68  rst.    ** go th
26200 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f  rough the rest o
26210 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64  f the list and d
26220 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20  elete any other 
26230 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a  entries besides.
26240 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20      ** p[] that 
26250 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74  are also supplat
26260 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  ed by pTemplate 
26270 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
26280 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e   **ppTail = &p->
26290 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57  pNextLoop;.    W
262a0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c  hereLoop *pToDel
262b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70  ;.    while( *pp
262c0 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70  Tail ){.      pp
262d0 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Tail = whereLoop
262e0 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69  FindLesser(ppTai
262f0 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  l, pTemplate);. 
26300 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d       if( ppTail=
26310 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
26320 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61    pToDel = *ppTa
26330 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  il;.      if( pT
26340 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  oDel==0 ) break;
26350 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d  .      *ppTail =
26360 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f   pToDel->pNextLo
26370 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  op;.#if WHERETRA
26380 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
26390 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  8 */.      if( s
263a0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
263b0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
263c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
263d0 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20  intf("ins-del:  
263e0 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  ");.        wher
263f0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65  eLoopPrint(pToDe
26400 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  l, pBuilder->pWC
26410 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
26420 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  f.      whereLoo
26430 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44  pDelete(db, pToD
26440 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  el);.    }.  }. 
26450 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
26460 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
26470 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
26480 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
26490 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
264a0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
264b0 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
264c0 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
264d0 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
264e0 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
264f0 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
26500 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
26510 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
26520 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26530 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65  Adjust the Where
26540 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20  Loop.nOut value 
26550 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f  downward to acco
26560 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  unt for terms of
26570 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
26580 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65  ause that refere
26590 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74  nce the loop but
265a0 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
265b0 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64  sed by an.** ind
265c0 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ex..**.** In the
265d0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
265e0 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66 69 72  ntation, the fir
265f0 73 74 20 65 78 74 72 61 20 57 48 45 52 45 20 63  st extra WHERE c
26600 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64 75 63  lause term reduc
26610 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  es.** the number
26620 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
26630 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31  by a factor of 1
26640 30 20 61 6e 64 20 65 61 63 68 20 61 64 64 69 74  0 and each addit
26650 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20 72 65  ional term.** re
26660 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
26670 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
26680 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f 0a 73  by sqrt(2)..*/.s
26690 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
266a0 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
266b0 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
266c0 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  C, WhereLoop *pL
266d0 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65 54 65 72  oop){.  WhereTer
266e0 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20  m *pTerm, *pX;. 
266f0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f   Bitmask notAllo
26700 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70  wed = ~(pLoop->p
26710 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73  rereq|pLoop->mas
26720 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c  kSelf);.  int i,
26730 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70 74 69   j;..  if( !Opti
26740 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
26750 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
26760 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
26770 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20 29 7b  AdjustOutEst) ){
26780 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
26790 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
267a0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
267b0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
267c0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
267d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
267e0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
267f0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
26800 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
26810 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
26820 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
26830 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
26840 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
26850 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
26860 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
26870 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
26880 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
26890 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
268a0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
268b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
268c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
268d0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
268e0 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
268f0 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
26900 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
26910 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
26920 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
26930 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
26940 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  ){.      pLoop->
26950 6e 4f 75 74 20 2b 3d 20 28 70 54 65 72 6d 2d 3e  nOut += (pTerm->
26960 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 3f 20 70  truthProb<=0 ? p
26970 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
26980 3a 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  : -1);.    }.  }
26990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
269a0 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74   the cost C by t
269b0 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74  he costMult fact
269c0 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79  er T.  This only
269d0 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f   occurs if.** co
269e0 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51  mpiled with -DSQ
269f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
26a00 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53  MULT.*/.#ifdef S
26a10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
26a20 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41  TMULT.# define A
26a30 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
26a40 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a  er(C,T)  C += T.
26a50 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41  #else.# define A
26a60 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
26a70 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a  er(C,T).#endif..
26a80 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
26a90 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
26aa0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
26ab0 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
26ac0 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20  f the .** index 
26ad0 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d  pIndex. Try to m
26ae0 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
26af0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
26b00 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
26b10 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  d, pBuilder->pNe
26b20 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73  w->nOut contains
26b30 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
26b40 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64  of rows expected
26b50 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62   to be visited b
26b60 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e  y filtering usin
26b70 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65  g the nEq .** te
26b80 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20  rms only. If it 
26b90 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69  is modified, thi
26ba0 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f  s value is resto
26bb0 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  red before this 
26bc0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
26bd0 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  urns..**.** If p
26be0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
26bf0 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
26c00 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
26c10 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
26c20 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
26c30 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
26c40 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
26c50 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
26c60 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
26c70 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
26c80 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
26c90 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
26ca0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
26cb0 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
26cc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
26cd0 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
26ce0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
26cf0 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
26d00 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
26d10 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f   on pSrc */.  Lo
26d20 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  gEst nInMul     
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d40 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
26d50 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
26d60 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
26d70 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
26d80 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
26d90 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
26da0 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
26db0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
26dc0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
26dd0 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
26de0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
26df0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
26e00 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
26e10 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
26e20 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
26e30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
26e40 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
26e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26e60 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
26e70 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
26e80 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
26e90 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
26ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
26eb0 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
26ec0 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
26ed0 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ef0 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
26f00 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
26f10 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
26f20 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
26f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
26f40 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
26f50 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
26f60 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
26f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
26f80 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
26f90 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
26fa0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
26fb0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
26fc0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
26fd0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
26fe0 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  erm */.  u16 sav
26ff0 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
27000 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
27010 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
27020 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
27030 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
27040 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  Skip;           
27050 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
27060 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
27070 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f  u.btree.nSkip */
27080 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46  .  u32 saved_wsF
27090 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
270a0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
270b0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73  alue of pNew->ws
270c0 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  Flags */.  LogEs
270d0 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20  t saved_nOut;   
270e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
270f0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
27100 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20  pNew->nOut */.  
27110 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
27140 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
27150 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ble */.  int rc 
27160 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
27170 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27180 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67  rn code */.  Log
27190 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
271b0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
271c0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
271d0 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
271e0 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
271f0 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
27200 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
27210 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
27220 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
27230 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
27240 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
27250 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61  LITE_NOMEM;..  a
27260 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
27270 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
27280 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
27290 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ;.  assert( (pNe
272a0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
272b0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
272c0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
272d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
272e0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
272f0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c   opMask = WO_LT|
27300 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_LE;.  }else i
27310 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
27320 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69  =0 || (pSrc->joi
27330 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
27340 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  !=0 ){.    opMas
27350 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
27360 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
27370 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
27380 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
27390 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
273a0 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  NULL|WO_GT|WO_GE
273b0 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20  |WO_LT|WO_LE;.  
273c0 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  }.  if( pProbe->
273d0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d  bUnordered ) opM
273e0 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57  ask &= ~(WO_GT|W
273f0 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
27400 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  );..  assert( pN
27410 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
27420 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
27430 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f  );.  iCol = pPro
27440 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65  be->aiColumn[pNe
27450 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b  w->u.btree.nEq];
27460 0a 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72  ..  pTerm = wher
27470 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
27480 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20   pBuilder->pWC, 
27490 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69  pSrc->iCursor, i
274a0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
274b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d               opM
274c0 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  ask, pProbe);.  
274d0 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77  saved_nEq = pNew
274e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
274f0 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
27500 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  New->u.btree.nSk
27510 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65  ip;.  saved_nLTe
27520 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  rm = pNew->nLTer
27530 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61  m;.  saved_wsFla
27540 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61  gs = pNew->wsFla
27550 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72  gs;.  saved_prer
27560 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65  eq = pNew->prere
27570 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20  q;.  saved_nOut 
27580 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
27590 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
275a0 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65  ;.  rLogSize = e
275b0 73 74 4c 6f 67 28 70 50 72 6f 62 65 2d 3e 61 69  stLog(pProbe->ai
275c0 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 0a  RowLogEst[0]);..
275d0 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73    /* Consider us
275e0 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20  ing a skip-scan 
275f0 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
27600 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
27610 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76  straints.  ** av
27620 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
27630 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20  left-most terms 
27640 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
27650 64 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65  d if the average
27660 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
27670 72 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c  repeats in the l
27680 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69  eft-most terms i
27690 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a  s at least 18. .
276a0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61    **.  ** The ma
276b0 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73  gic number 18 is
276c0 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65   selected on the
276d0 20 62 61 73 69 73 20 74 68 61 74 20 73 63 61 6e   basis that scan
276e0 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a  ning 17 rows.  *
276f0 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  * is almost alwa
27700 79 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20  ys quicker than 
27710 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65  an index seek (e
27720 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68  ven though if th
27730 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e  e index.  ** con
27740 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
27750 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73   2^17 rows we as
27760 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69  sume otherwise i
27770 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66  n other parts of
27780 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e  .  ** the code).
27790 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74   And, even if it
277a0 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75   is not, it shou
277b0 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75  ld not be too mu
277c0 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a  ch slower. .  **
277d0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
277e0 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20 73 65  nd, the extra se
277f0 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70  eks could end up
27800 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61   being significa
27810 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65  ntly.  ** more e
27820 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20  xpensive.  */.  
27830 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69  assert( 42==sqli
27840 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b  te3LogEst(18) );
27850 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 0a  .  if( pTerm==0.
27860 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d     && saved_nEq=
27870 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20  =saved_nSkip.   
27880 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70  && saved_nEq+1<p
27890 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20  Probe->nKeyCol. 
278a0 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52    && pProbe->aiR
278b0 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e  owLogEst[saved_n
278c0 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55  Eq+1]>=42  /* TU
278d0 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f  NING: Minimum fo
278e0 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20  r skip-scan */. 
278f0 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65    && (rc = where
27900 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
27910 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
27920 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  m+1))==SQLITE_OK
27930 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74  .  ){.    LogEst
27940 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77   nIter;.    pNew
27950 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
27960 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
27970 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20  ee.nSkip++;.    
27980 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
27990 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30  w->nLTerm++] = 0
279a0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
279b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49  ags |= WHERE_SKI
279c0 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72  PSCAN;.    nIter
279d0 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
279e0 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
279f0 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
27a00 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
27a10 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  q+1];.    pNew->
27a20 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20  nOut -= nIter;. 
27a30 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
27a40 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
27a50 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
27a60 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c  , nIter + nInMul
27a70 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  );.    pNew->nOu
27a80 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
27a90 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d    }.  for(; rc==
27aa0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
27ab0 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77  rm!=0; pTerm = w
27ac0 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
27ad0 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65 4f  an)){.    u16 eO
27ae0 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  p = pTerm->eOper
27af0 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74  ator;   /* Short
27b00 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e  hand for pTerm->
27b10 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
27b20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64 78   LogEst rCostIdx
27b30 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75  ;.    LogEst nOu
27b40 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20 20  tUnadjusted;    
27b50 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f      /* nOut befo
27b60 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45 52  re IN() and WHER
27b70 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f  E adjustments */
27b80 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30  .    int nIn = 0
27b90 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
27ba0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
27bb0 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e 52  STAT4.    int nR
27bc0 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64  ecValid = pBuild
27bd0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23  er->nRecValid;.#
27be0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 65  endif.    if( (e
27bf0 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c  Op==WO_ISNULL ||
27c00 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
27c10 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29  &TERM_VNULL)!=0)
27c20 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c 3c 30  .     && (iCol<0
27c30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e   || pSrc->pTab->
27c40 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
27c50 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ll).    ){.     
27c60 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
27c70 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
27c80 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
27c90 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
27ca0 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
27cb0 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
27cc0 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
27cd0 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
27ce0 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77  ue;..    pNew->w
27cf0 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
27d00 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77  sFlags;.    pNew
27d10 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
27d20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70  saved_nEq;.    p
27d30 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61  New->nLTerm = sa
27d40 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20  ved_nLTerm;.    
27d50 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
27d60 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
27d70 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
27d80 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
27d90 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72  .    pNew->aLTer
27da0 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
27db0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70  ] = pTerm;.    p
27dc0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73  New->prereq = (s
27dd0 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54  aved_prereq | pT
27de0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
27df0 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53  ) & ~pNew->maskS
27e00 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  elf;..    assert
27e10 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20  ( nInMul==0.    
27e20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
27e30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
27e40 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20  LUMN_NULL)!=0 . 
27e50 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
27e60 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27e70 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a  _COLUMN_IN)!=0 .
27e80 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77          || (pNew
27e90 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27ea0 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a  E_SKIPSCAN)!=0 .
27eb0 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20      );..    if( 
27ec0 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  eOp & WO_IN ){. 
27ed0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
27ee0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
27ef0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
27f00 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
27f10 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69  LUMN_IN;.      i
27f20 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
27f30 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
27f40 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
27f50 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c     /* "x IN (SEL
27f60 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49  ECT ...)":  TUNI
27f70 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72  NG: the SELECT r
27f80 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
27f90 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
27fa0 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  46;  assert( 46=
27fb0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
27fc0 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  5) );.      }els
27fd0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
27fe0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
27ff0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
28000 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
28010 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65   /* "x IN (value
28020 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a  , value, ...)" *
28030 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
28040 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45  sqlite3LogEst(pE
28050 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
28060 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
28070 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e      assert( nIn>
28080 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77  0 );  /* RHS alw
28090 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72  ays has 2 or mor
280a0 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20  e terms...  The 
280b0 70 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20  parser.         
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
280d0 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20  * changes "x IN 
280e0 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e  (?)" into "x=?".
280f0 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69   */..    }else i
28100 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 29  f( eOp & (WO_EQ)
28110 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
28120 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
28130 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
28140 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
28150 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 4e  (nInMul==0 && pN
28160 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  ew->u.btree.nEq=
28170 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
28180 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  -1) ){.        i
28190 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 21 49  f( iCol>=0 && !I
281a0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 50 72  sUniqueIndex(pPr
281b0 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  obe) ){.        
281c0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
281d0 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e  |= WHERE_UNQ_WAN
281e0 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  TED;.        }el
281f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
28200 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
28210 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
28220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28230 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
28240 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
28250 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
28260 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
28270 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65  UMN_NULL;.    }e
28280 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57  lse if( eOp & (W
28290 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
282a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
282b0 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20  Op & WO_GT );.  
282c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
282d0 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  p & WO_GE );.   
282e0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
282f0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
28300 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
28310 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42  _LIMIT;.      pB
28320 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
28330 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
28340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
28350 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c  ert( eOp & (WO_L
28360 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20  T|WO_LE) );.    
28370 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
28380 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20  & WO_LT );.     
28390 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
283a0 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20   WO_LE );.      
283b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
283c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
283d0 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  NGE|WHERE_TOP_LI
283e0 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  MIT;.      pTop 
283f0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
28400 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46  Btm = (pNew->wsF
28410 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
28420 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20  _LIMIT)!=0 ?.   
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
28450 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a  New->nLTerm-2] :
28460 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
28470 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
28480 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65  pNew->nOut is se
28490 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
284a0 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64  of rows expected
284b0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69   to.    ** be vi
284c0 73 69 74 65 64 20 62 79 20 74 68 65 20 69 6e 64  sited by the ind
284d0 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63  ex scan before c
284e0 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20  onsidering term 
284f0 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20  pTerm, or the.  
28500 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e    ** values of n
28510 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49  In and nInMul. I
28520 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
28530 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c  ssuming that all
28540 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e   .    ** "x IN(.
28550 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20 72  ..)" terms are r
28560 65 70 6c 61 63 65 64 20 77 69 74 68 20 22 78 20  eplaced with "x 
28570 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b  = ?". This block
28580 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20   updates.    ** 
28590 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  the value of pNe
285a0 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75  w->nOut to accou
285b0 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75  nt for pTerm (bu
285c0 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c  t not nIn/nInMul
285d0 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ).  */.    asser
285e0 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73  t( pNew->nOut==s
285f0 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20  aved_nOut );.   
28600 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
28610 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
28620 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  N_RANGE ){.     
28630 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20   /* Adjust nOut 
28640 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74  using stat3/stat
28650 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74  4 data. Or, if t
28660 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33  here is no stat3
28670 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20  /stat4.      ** 
28680 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65  data, using some
28690 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e   other estimate.
286a0 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65    */.      where
286b0 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61  RangeScanEst(pPa
286c0 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
286d0 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29  Btm, pTop, pNew)
286e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
286f0 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70     int nEq = ++p
28700 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
28710 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28720 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  eOp & (WO_ISNULL
28730 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 29 20 29 3b  |WO_EQ|WO_IN) );
28740 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
28750 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
28760 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20  d_nOut );.      
28770 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
28780 50 72 6f 62 3c 3d 30 20 26 26 20 69 43 6f 6c 3e  Prob<=0 && iCol>
28790 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
287a0 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f  sert( (eOp & WO_
287b0 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b  IN) || nIn==0 );
287c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
287d0 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  e( eOp & WO_IN )
287e0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
287f0 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nOut += pTerm->t
28800 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
28810 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
28820 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nIn;.      }else
28830 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
28840 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
28850 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74 52  STAT4.        tR
28860 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a  owcnt nOut = 0;.
28870 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d          if( nInM
28880 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ul==0 .         
28890 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  && pProbe->nSamp
288a0 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  le .         && 
288b0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
288c0 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  q<=pProbe->nSamp
288d0 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26  leCol.         &
288e0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
288f0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
28900 5f 53 74 61 74 33 29 20 0a 20 20 20 20 20 20 20  _Stat3) .       
28910 20 20 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f    && ((eOp & WO_
28920 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48  IN)==0 || !ExprH
28930 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
28940 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
28950 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20 20 20  elect)).        
28960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
28970 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
28980 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
28990 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 28 57     if( (eOp & (W
289a0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29  O_EQ|WO_ISNULL))
289b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
289c0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
289d0 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
289e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
289f0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
28a00 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  L );.           
28a10 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
28a20 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
28a30 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
28a40 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b  >pRight, &nOut);
28a50 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
28a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
28a70 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73   = whereInScanEs
28a80 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
28a90 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  er, pExpr->x.pLi
28aa0 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  st, &nOut);.    
28ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28ac0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28ad0 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
28ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28af0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28b00 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
28b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
28b20 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65  p out of the pTe
28b30 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  rm loop */.     
28b40 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b       if( nOut ){
28b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
28b60 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
28b70 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20  3LogEst(nOut);. 
28b80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
28b90 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f  New->nOut>saved_
28ba0 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75  nOut ) pNew->nOu
28bb0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
28bd0 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
28be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
28c00 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69   nOut==0 ).#endi
28c10 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
28c20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
28c30 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52   += (pProbe->aiR
28c40 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20  owLogEst[nEq] - 
28c50 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
28c60 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20  Est[nEq-1]);.   
28c70 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26         if( eOp &
28c80 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
28c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
28ca0 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73  ING: If there is
28cb0 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   no likelihood()
28cc0 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74   value, assume t
28cd0 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20  hat a .         
28ce0 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55     ** "col IS NU
28cf0 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  LL" expression m
28d00 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20  atches twice as 
28d10 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20  many rows .     
28d20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f         ** as (co
28d30 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  l=?). */.       
28d40 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
28d50 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20  += 10;.         
28d60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28d70 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
28d80 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20  /* Set rCostIdx 
28d90 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  to the cost of v
28da0 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64  isiting selected
28db0 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20   rows in index. 
28dc0 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f  Add.    ** it to
28dd0 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69   pNew->rRun, whi
28de0 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ch is currently 
28df0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20  set to the cost 
28e00 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
28e10 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54   ** seek only. T
28e20 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20  hen, if this is 
28e30 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
28e40 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f  ndex, add the co
28e50 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73  st of.    ** vis
28e60 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69  iting the rows i
28e70 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
28e80 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49  .  */.    rCostI
28e90 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  dx = pNew->nOut 
28ea0 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
28eb0 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63  ->szIdxRow)/pSrc
28ec0 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  ->pTab->szTabRow
28ed0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
28ee0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
28ef0 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43  Add(rLogSize, rC
28f00 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28  ostIdx);.    if(
28f10 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
28f20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  & (WHERE_IDX_ONL
28f30 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30  Y|WHERE_IPK))==0
28f40 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
28f50 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
28f60 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
28f70 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  un, pNew->nOut +
28f80 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   16);.    }.    
28f90 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
28fa0 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
28fb0 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e  pProbe->pTable->
28fc0 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20  costMult);..    
28fd0 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d  nOutUnadjusted =
28fe0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20   pNew->nOut;.   
28ff0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e   pNew->rRun += n
29000 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
29010 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e   pNew->nOut += n
29020 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
29030 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
29040 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d  Adjust(pBuilder-
29050 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20  >pWC, pNew);.   
29060 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
29070 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
29080 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
29090 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
290a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
290b0 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
290c0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
290d0 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
290e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
290f0 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
29100 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
29110 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
29120 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
29130 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
29140 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
29150 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
29160 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
29170 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
29180 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
29190 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
291a0 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
291b0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
291c0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
291d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
291e0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
291f0 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
29200 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
29210 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
29220 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
29230 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
29240 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
29250 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
29260 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
29270 2e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  .nSkip = saved_n
29280 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73  Skip;.  pNew->ws
29290 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
292a0 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Flags;.  pNew->n
292b0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
292c0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
292d0 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
292e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
292f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72  ./*.** Return Tr
29300 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ue if it is poss
29310 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78  ible that pIndex
29320 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c   might be useful
29330 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   in.** implement
29340 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
29350 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c   clause in pBuil
29360 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  der..**.** Retur
29370 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c  n False if pBuil
29380 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  der does not con
29390 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  tain an ORDER BY
293a0 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66   clause or.** if
293b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
293c0 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62   for pIndex to b
293d0 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c  e useful in impl
293e0 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a  ementing that.**
293f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
29400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29410 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
29420 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  thOrderBy(.  Whe
29430 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
29440 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78  Builder,.  Index
29450 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20   *pIndex,.  int 
29460 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70  iCursor.){.  Exp
29470 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e  rList *pOB;.  in
29480 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28  t ii, jj;..  if(
29490 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
294a0 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  red ) return 0;.
294b0 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75    if( (pOB = pBu
294c0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
294d0 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
294e0 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69  turn 0;.  for(ii
294f0 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70  =0; ii<pOB->nExp
29500 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78  r; ii++){.    Ex
29510 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
29520 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
29530 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45  te(pOB->a[ii].pE
29540 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45  xpr);.    if( pE
29550 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
29560 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
29570 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
29580 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b  able==iCursor ){
29590 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b  .      for(jj=0;
295a0 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   jj<pIndex->nKey
295b0 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  Col; jj++){.    
295c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
295d0 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
295e0 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72  aiColumn[jj] ) r
295f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
29600 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29610 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29620 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
29630 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
29640 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
29650 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
29660 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
29670 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
29680 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
29690 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
296a0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
296b0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
296c0 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
296d0 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
296e0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
296f0 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
29700 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
29710 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
29720 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
29730 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
29740 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
29750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
29760 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
29770 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
29780 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
29790 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
297a0 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
297b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
297c0 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
297d0 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
297e0 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
297f0 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
29800 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
29810 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
29820 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
29830 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
29840 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
29850 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
29860 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
29870 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
29880 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
29890 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
298a0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
298b0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72  rm *pTerm;.  for
298c0 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
298d0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
298e0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
298f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29900 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
29910 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57  pTerm->pExpr, pW
29920 68 65 72 65 2c 20 69 54 61 62 29 20 29 20 72 65  here, iTab) ) re
29930 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
29940 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
29950 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
29960 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
29970 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66   single table of
29980 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20   the join where 
29990 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
299a0 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
299b0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
299c0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
299d0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
299e0 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
299f0 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
29a00 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
29a10 54 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65  The costs (Where
29a20 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68  Loop.rRun) of th
29a30 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61  e b-tree loops a
29a40 64 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  dded by this fun
29a50 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c  ction.** are cal
29a60 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  culated as follo
29a70 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ws:.**.** For a 
29a80 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d  full scan, assum
29a90 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f  ing the table (o
29aa0 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e  r index) contain
29ab0 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a  s nRow rows:.**.
29ac0 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
29ad0 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20  ow * 3.0        
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66              // f
29af0 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a  ull-table scan.*
29b00 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
29b10 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20  w * K           
29b20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
29b30 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69  an of covering i
29b40 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
29b50 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30   = nRow * (K+3.0
29b60 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
29b70 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d   // scan of non-
29b80 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
29b90 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20  *.** where K is 
29ba0 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  a value between 
29bb0 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20  1.1 and 3.0 set 
29bc0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c  based on the rel
29bd0 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61  ative .** estima
29be0 74 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65  ted average size
29bf0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
29c00 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e  d table records.
29c10 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
29c20 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20  dex scan, where 
29c30 6e 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75  nVisit is the nu
29c40 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f  mber of index ro
29c50 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  ws visited.** by
29c60 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e   the scan, and n
29c70 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62  Seek is the numb
29c80 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61  er of seek opera
29c90 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f  tions required o
29ca0 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  n .** the index 
29cb0 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  b-tree:.**.**   
29cc0 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a    cost = nSeek *
29cd0 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20   (log(nRow) + K 
29ce0 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20  * nVisit)       
29cf0 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69     // covering i
29d00 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74  ndex.**     cost
29d10 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
29d20 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20  nRow) + (K+3.0) 
29d30 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20  * nVisit)    // 
29d40 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
29d50 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  ex.**.** Normall
29d60 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e  y, nSeek is 1. n
29d70 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61  Seek values grea
29d80 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20  ter than 1 come 
29d90 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a  about if the .**
29da0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
29db0 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e  cludes "x IN (..
29dc0 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20  ..)" terms used 
29dd0 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f  in place of "x=?
29de0 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69  ". Or when .** i
29df0 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53  mplicit "x IN (S
29e00 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c  ELECT x FROM tbl
29e10 29 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  )" terms are add
29e20 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e  ed for skip-scan
29e30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  s..**.** The est
29e40 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e  imated values (n
29e50 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65  Row, nVisit, nSe
29e60 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69  ek) often contai
29e70 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74  n a large amount
29e80 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e  .** of uncertain
29e90 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  ty.  For this re
29ea0 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73  ason, scoring is
29eb0 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63   designed to pic
29ec0 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20  k plans that.** 
29ed0 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61  "do the least ha
29ee0 72 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d  rm" if the estim
29ef0 61 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72  ates are inaccur
29f00 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ate.  For exampl
29f10 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77  e, a.** log(nRow
29f20 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74  ) factor is omit
29f30 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63  ted from a non-c
29f40 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
29f50 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a  an in order to.*
29f60 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69  * bias the scori
29f70 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75  ng in favor of u
29f80 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73  sing an index, s
29f90 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63  ince the worst-c
29fa0 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ase.** performan
29fb0 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  ce of using an i
29fc0 6e 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74  ndex is far bett
29fd0 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73  er than the wors
29fe0 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e  t-case performan
29ff0 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20  ce.** of a full 
2a000 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73  table scan..*/.s
2a010 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2a020 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57  oopAddBtree(.  W
2a030 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2a040 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48  *pBuilder, /* WH
2a050 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
2a060 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
2a070 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20  ask mExtra      
2a080 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2a090 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
2a0a0 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
2a0b0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ble */.){.  Wher
2a0c0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2a0d0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
2a0e0 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
2a0f0 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
2a100 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
2a110 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
2a120 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
2a130 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b   */.  Index sPk;
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a150 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65    /* A fake inde
2a160 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  x object for the
2a170 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
2a180 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73    LogEst aiRowEs
2a190 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a  tPk[2];       /*
2a1a0 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74   The aiRowLogEst
2a1b0 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
2a1c0 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
2a1d0 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d  i16 aiColumnPk =
2a1e0 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54   -1;        /* T
2a1f0 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c  he aColumn[] val
2a200 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
2a210 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ndex */.  SrcLis
2a220 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
2a230 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
2a240 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  M clause */.  st
2a250 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a260 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65  m *pSrc;  /* The
2a270 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72   FROM clause btr
2a280 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a  ee term to add *
2a290 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2a2a0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2a2b0 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
2a2c0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
2a2d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a2e0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
2a2f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a300 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d    int iSortIdx =
2a310 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
2a320 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   Index number */
2a330 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20  .  int b;       
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a350 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  * A boolean valu
2a360 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53  e */.  LogEst rS
2a370 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2a380 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20     /* number of 
2a390 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2a3a0 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
2a3b0 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
2a3c0 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
2a3d0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
2a3e0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2a3f0 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  le */.  WhereCla
2a400 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
2a410 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2a420 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  d WHERE clause *
2a430 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2a460 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70  ueried */.  .  p
2a470 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2a480 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  pNew;.  pWInfo =
2a490 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2a4a0 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  o;.  pTabList = 
2a4b0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2a4c0 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c  ;.  pSrc = pTabL
2a4d0 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2a4e0 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  Tab;.  pTab = pS
2a4f0 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20  rc->pTab;.  pWC 
2a500 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
2a510 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69  .  assert( !IsVi
2a520 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
2a530 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63  ) );..  if( pSrc
2a540 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
2a550 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
2a560 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
2a570 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
2a580 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
2a590 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
2a5a0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  ->pIndex;.  }els
2a5b0 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
2a5c0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
2a5d0 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
2a5e0 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
2a5f0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
2a600 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2a610 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
2a620 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
2a630 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
2a640 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
2a650 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
2a660 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
2a670 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
2a680 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
2a690 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
2a6a0 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
2a6b0 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
2a6c0 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
2a6d0 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
2a6e0 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
2a6f0 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a710 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
2a720 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
2a730 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
2a740 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
2a750 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
2a760 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
2a770 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
2a780 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
2a790 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
2a7a0 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
2a7b0 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77  owLogEst = aiRow
2a7c0 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
2a7d0 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
2a7e0 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
2a7f0 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  ble = pTab;.    
2a800 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  sPk.szIdxRow = p
2a810 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
2a820 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
2a830 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
2a840 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
2a850 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  tPk[1] = 0;.    
2a860 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
2a870 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
2a880 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
2a890 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
2a8a0 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
2a8b0 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
2a8c0 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
2a8d0 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
2a8e0 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
2a8f0 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
2a900 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
2a910 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2a920 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
2a930 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
2a940 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
2a950 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
2a960 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
2a970 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  t;.  rLogSize = 
2a980 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
2a990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a9a0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
2a9b0 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
2a9c0 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
2a9d0 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
2a9e0 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57 49  OrSet.   && (pWI
2a9f0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
2aa00 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2aa10 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
2aa20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78   && pSrc->pIndex
2aa30 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d  ==0.   && !pSrc-
2aa40 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20  >viaCoroutine.  
2aa50 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e   && !pSrc->notIn
2aa60 64 65 78 65 64 0a 20 20 20 26 26 20 48 61 73 52  dexed.   && HasR
2aa70 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 26 26  owid(pTab).   &&
2aa80 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c   !pSrc->isCorrel
2aa90 61 74 65 64 0a 20 20 20 26 26 20 21 70 53 72 63  ated.   && !pSrc
2aaa0 2d 3e 69 73 52 65 63 75 72 73 69 76 65 0a 20 20  ->isRecursive.  
2aab0 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
2aac0 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
2aad0 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
2aae0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2aaf0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
2ab00 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
2ab10 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
2ab20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
2ab30 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
2ab40 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
2ab50 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
2ab60 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
2ab70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
2ab80 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
2ab90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2aba0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
2abb0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
2abc0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
2abd0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2abe0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
2abf0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  ew->u.btree.nSki
2ac00 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  p = 0;.        p
2ac10 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
2ac20 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
2ac30 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2ac40 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
2ac50 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
2ac60 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  rm;.        /* T
2ac70 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20  UNING: One-time 
2ac80 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69  cost for computi
2ac90 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ng the automatic
2aca0 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20   index is.      
2acb0 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65    ** approximate
2acc0 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77  ly 7*N*log2(N) w
2acd0 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
2ace0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a  mber of rows in.
2acf0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74          ** the t
2ad00 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78  able being index
2ad10 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ed. */.        p
2ad20 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c  New->rSetup = rL
2ad30 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b  ogSize + rSize +
2ad40 20 32 38 3b 20 20 61 73 73 65 72 74 28 20 32 38   28;  assert( 28
2ad50 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2ad60 37 29 20 29 3b 0a 20 20 20 20 20 20 20 20 41 70  7) );.        Ap
2ad70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
2ad80 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20  r(pNew->rSetup, 
2ad90 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
2ada0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2adb0 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
2adc0 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20  ookup yields 20 
2add0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2ade0 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20  e.  This.       
2adf0 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e   ** is more than
2ae00 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73   the usual guess
2ae10 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e   of 10 rows, sin
2ae20 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61  ce we have no wa
2ae30 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  y.        ** of 
2ae40 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20 73 65 6c  knowning how sel
2ae50 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  ective the index
2ae60 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
2ae70 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20   be.  It would. 
2ae80 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65         ** not be
2ae90 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f   unreasonable to
2aea0 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65   make this value
2aeb0 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f   much larger. */
2aec0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2aed0 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72  Out = 43;  asser
2aee0 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 43==sqlite3Lo
2aef0 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20  gEst(20) );.    
2af00 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2af10 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
2af20 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d  d(rLogSize,pNew-
2af30 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  >nOut);.        
2af40 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2af50 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
2af60 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2af70 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20  prereq = mExtra 
2af80 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  | pTerm->prereqR
2af90 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
2afa0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
2afb0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
2afc0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
2afd0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
2afe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2aff0 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
2b000 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
2b010 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a  ll indices.  */.
2b020 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
2b030 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b  TE_OK && pProbe;
2b040 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e   pProbe=pProbe->
2b050 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b  pNext, iSortIdx+
2b060 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f  +){.    if( pPro
2b070 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
2b080 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68  e!=0.     && !wh
2b090 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
2b0a0 49 6e 64 65 78 28 70 4e 65 77 2d 3e 69 54 61 62  Index(pNew->iTab
2b0b0 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70  , pWC, pProbe->p
2b0c0 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b  PartIdxWhere) ){
2b0d0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2b0e0 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64    /* Partial ind
2b0f0 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ex inappropriate
2b100 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
2b110 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69  */.    }.    rSi
2b120 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
2b130 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20  owLogEst[0];.   
2b140 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2b150 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
2b160 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20  ->u.btree.nSkip 
2b170 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
2b180 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70  LTerm = 0;.    p
2b190 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2b1a0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  0;.    pNew->rSe
2b1b0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  tup = 0;.    pNe
2b1c0 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
2b1d0 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ra;.    pNew->nO
2b1e0 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
2b1f0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
2b200 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20  ndex = pProbe;. 
2b210 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68     b = indexMigh
2b220 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
2b230 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62  (pBuilder, pProb
2b240 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
2b250 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e  );.    /* The ON
2b260 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c  EPASS_DESIRED fl
2b270 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73  ags never occurs
2b280 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f   together with O
2b290 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61  RDER BY */.    a
2b2a0 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e  ssert( (pWInfo->
2b2b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2b2c0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2b2d0 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29  ED)==0 || b==0 )
2b2e0 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  ;.    if( pProbe
2b2f0 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20  ->tnum<=0 ){.   
2b300 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72     /* Integer pr
2b310 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
2b320 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  */.      pNew->w
2b330 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
2b340 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75  PK;..      /* Fu
2b350 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f  ll table scan */
2b360 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  .      pNew->iSo
2b370 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
2b380 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20  tIdx : 0;.      
2b390 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
2b3a0 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63  of full table sc
2b3b0 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a  an is (N*3.0). *
2b3c0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  /.      pNew->rR
2b3d0 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b  un = rSize + 16;
2b3e0 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74  .      ApplyCost
2b3f0 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
2b400 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73  >rRun, pTab->cos
2b410 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68  tMult);.      wh
2b420 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
2b430 75 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b 0a  ust(pWC, pNew);.
2b440 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2b450 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2b460 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2b470 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
2b480 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
2b490 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
2b4a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
2b4b0 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66  mask m;.      if
2b4c0 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65  ( pProbe->isCove
2b4d0 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ring ){.        
2b4e0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2b4f0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
2b500 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a   WHERE_INDEXED;.
2b510 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20          m = 0;. 
2b520 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b530 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f      m = pSrc->co
2b540 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
2b550 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b  InIndex(pProbe);
2b560 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
2b570 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20  sFlags = (m==0) 
2b580 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ? (WHERE_IDX_ONL
2b590 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  Y|WHERE_INDEXED)
2b5a0 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   : WHERE_INDEXED
2b5b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2b5c0 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69   /* Full scan vi
2b5d0 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  a index */.     
2b5e0 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c   if( b.       ||
2b5f0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
2b600 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d  .       || ( m==
2b610 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  0.         && pP
2b620 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
2b630 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2b640 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  (pProbe->szIdxRo
2b650 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
2b660 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
2b670 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2b680 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2b690 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20  S_DESIRED)==0.  
2b6a0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
2b6b0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55  3GlobalConfig.bU
2b6c0 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26  seCis.         &
2b6d0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2b6e0 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50  abled(pWInfo->pP
2b6f0 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
2b700 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20  _CoverIdxScan). 
2b710 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
2b720 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
2b730 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
2b740 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a   iSortIdx : 0;..
2b750 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2b760 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
2b770 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69  the index rows i
2b780 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69  s N*K, where K i
2b790 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74  s.        ** bet
2b7a0 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
2b7b0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
2b7c0 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65  he relative size
2b7d0 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  s of the.       
2b7e0 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61   ** index and ta
2b7f0 62 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69  ble rows. If thi
2b800 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
2b810 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a  ing index scan,.
2b820 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20          ** also 
2b830 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20  add the cost of 
2b840 76 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72  visiting table r
2b850 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f  ows (N*3.0).  */
2b860 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2b870 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20  Run = rSize + 1 
2b880 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a  + (15*pProbe->sz
2b890 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a  IdxRow)/pTab->sz
2b8a0 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  TabRow;.        
2b8b0 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20  if( m!=0 ){.    
2b8c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2b8d0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2b8e0 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  Add(pNew->rRun, 
2b8f0 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20  rSize+16);.     
2b900 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
2b910 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
2b920 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61  (pNew->rRun, pTa
2b930 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
2b940 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f        whereLoopO
2b950 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c  utputAdjust(pWC,
2b960 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
2b970 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2b980 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2b990 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
2b9a0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
2b9b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2b9c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2b9d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
2b9e0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
2b9f0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
2ba00 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
2ba10 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
2ba20 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
2ba30 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  OR_STAT4.    sql
2ba40 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
2ba50 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
2ba60 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
2ba70 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
2ba80 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
2ba90 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
2baa0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2bab0 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
2bac0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2bad0 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
2bae0 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
2baf0 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
2bb00 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
2bb10 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  x ) break;.  }. 
2bb20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2bb30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2bb40 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2bb50 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
2bb60 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2bb70 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74  for a table of t
2bb80 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69  he join identifi
2bb90 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65  ed by.** pBuilde
2bba0 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
2bbb0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
2bbc0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
2bbd0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
2bbe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2bbf0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
2bc00 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
2bc10 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
2bc20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
2bc30 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
2bc40 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
2bc50 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  a.){.  WhereInfo
2bc60 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
2bc70 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
2bc80 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
2bc90 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2bca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bcb0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
2bcc0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
2bcd0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
2bce0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bcf0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2bd00 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2bd10 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
2bd20 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
2bd30 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
2bd40 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2bd50 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
2bd60 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
2bd70 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
2bd80 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
2bd90 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
2bda0 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
2bdb0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2bdc0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2bdd0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
2bde0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2bdf0 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
2be00 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54    int iTerm, mxT
2be10 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  erm;.  int nCons
2be20 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65  traint;.  int se
2be30 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  enIn = 0;       
2be40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2be50 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
2be60 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
2be70 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20  t seenVar = 0;  
2be80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2be90 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73  ue if a non-cons
2bea0 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  tant constraint 
2beb0 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
2bec0 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20   iPhase;        
2bed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
2bee0 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a  const w/o IN, 1:
2bef0 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e   const, 2: no IN
2bf00 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68  ,  2: IN */.  Wh
2bf10 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
2bf20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2bf30 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d  _OK;..  pWInfo =
2bf40 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2bf50 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
2bf60 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
2bf70 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2bf80 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
2bf90 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d  r->pWC;.  pNew =
2bfa0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2bfb0 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66  .  pSrc = &pWInf
2bfc0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2bfd0 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54  New->iTab];.  pT
2bfe0 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
2bff0 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
2c000 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20  tual(pTab) );.  
2c010 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
2c020 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
2c030 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
2c040 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72  pBuilder->pOrder
2c050 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  By);.  if( pIdxI
2c060 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  nfo==0 ) return 
2c070 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c080 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
2c090 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
2c0a0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
2c0b0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
2c0c0 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
2c0d0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
2c0e0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
2c0f0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70  eedFree = 0;.  p
2c100 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
2c110 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
2c120 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e  ge;.  nConstrain
2c130 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
2c140 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
2c150 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
2c160 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73  (db, pNew, nCons
2c170 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73  traint) ){.    s
2c180 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2c190 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
2c1a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2c1b0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  MEM;.  }..  for(
2c1c0 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65  iPhase=0; iPhase
2c1d0 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a  <=3; iPhase++){.
2c1e0 20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20      if( !seenIn 
2c1f0 26 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30  && (iPhase&1)!=0
2c200 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65   ){.      iPhase
2c210 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ++;.      if( iP
2c220 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a  hase>3 ) break;.
2c230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
2c240 65 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65  eenVar && iPhase
2c250 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >1 ) break;.    
2c260 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
2c270 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
2c280 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
2c290 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
2c2a0 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69  raint;.    for(i
2c2b0 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
2c2c0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2c2d0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2c2e0 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
2c2f0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
2c300 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
2c310 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
2c320 73 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29  switch( iPhase )
2c330 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30  {.        case 0
2c340 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
2c350 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65  s without IN ope
2c360 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
2c370 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
2c380 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ble = 0;.       
2c390 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2c3a0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
2c3b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2c3c0 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a      seenIn = 1;.
2c3d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c3e0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
2c3f0 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20  >prereqRight!=0 
2c400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2c410 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20  eenVar = 1;.    
2c420 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2c430 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2c440 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b  r & WO_IN)==0 ){
2c450 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
2c460 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2c470 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2c480 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c490 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
2c4a0 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
2c4b0 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72  with IN operator
2c4c0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  s */.          a
2c4d0 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b  ssert( seenIn );
2c4e0 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
2c4f0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
2c500 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2c510 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t==0);.         
2c520 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2c530 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61  case 2:    /* Va
2c540 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20  riables without 
2c550 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
2c560 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
2c570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
2c580 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2c590 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2c5a0 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20  r & WO_IN)==0;. 
2c5b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c5c0 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
2c5d0 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20     /* Variables 
2c5e0 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20  with IN */.     
2c5f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2c600 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29  nVar && seenIn )
2c610 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2c620 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
2c630 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2c640 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2c650 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61  .    memset(pUsa
2c660 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
2c670 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
2c680 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
2c690 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
2c6a0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2c6b0 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
2c6c0 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
2c6d0 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e  Str);.    pIdxIn
2c6e0 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
2c6f0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
2c700 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49  xNum = 0;.    pI
2c710 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2c720 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
2c730 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
2c740 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
2c750 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
2c760 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
2c770 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
2c780 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 70  (double)2;.    p
2c790 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
2c7a0 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20  edRows = 25;.   
2c7b0 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e   rc = vtabBestIn
2c7c0 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62  dex(pParse, pTab
2c7d0 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20  , pIdxInfo);.   
2c7e0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
2c7f0 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f  hereLoopAddVtab_
2c800 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f  exit;.    pIdxCo
2c810 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
2c820 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2c830 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
2c840 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
2c850 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
2c860 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
2c870 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20  mxTerm = -1;.   
2c880 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
2c890 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69  LSlot>=nConstrai
2c8a0 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt );.    for(i=
2c8b0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
2c8c0 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54  ; i++) pNew->aLT
2c8d0 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  erm[i] = 0;.    
2c8e0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
2c8f0 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66  tMask = 0;.    f
2c900 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
2c910 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
2c920 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Cons++){.      i
2c930 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61  f( (iTerm = pUsa
2c940 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
2c950 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  - 1)>=0 ){.     
2c960 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
2c970 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
2c980 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
2c990 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  =nConstraint.   
2c9a0 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20        || j<0.   
2c9b0 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d        || j>=pWC-
2c9c0 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  >nTerm.         
2c9d0 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  || pNew->aLTerm[
2c9e0 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20  iTerm]!=0.      
2c9f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
2ca00 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2ca10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2ca20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2ca30 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e 64  se, "%s.xBestInd
2ca40 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ex() malfunction
2ca50 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
2ca60 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2ca70 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
2ca80 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
2ca90 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2caa0 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74  e( iTerm==nConst
2cab0 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20  raint-1 );.     
2cac0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
2cad0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
2cae0 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e  tcase( j==pWC->n
2caf0 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20  Term-1 );.      
2cb00 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
2cb10 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e  a[j];.        pN
2cb20 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54  ew->prereq |= pT
2cb30 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2cb40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2cb50 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c  ( iTerm<pNew->nL
2cb60 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Slot );.        
2cb70 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
2cb80 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  rm] = pTerm;.   
2cb90 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
2cba0 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
2cbb0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
2cbc0 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
2cbd0 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20 74  =15 );.        t
2cbe0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2cbf0 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  16 );.        if
2cc00 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55  ( iTerm<16 && pU
2cc10 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70  sage[i].omit ) p
2cc20 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
2cc30 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d  Mask |= 1<<iTerm
2cc40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
2cc50 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2cc60 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
2cc70 20 20 20 20 20 20 20 20 20 69 66 28 20 70 55 73           if( pUs
2cc80 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29  age[i].omit==0 )
2cc90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2cca0 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
2ccb0 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e  to use an IN con
2ccc0 73 74 72 61 69 6e 74 20 69 66 20 74 68 65 20 76  straint if the v
2ccd0 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20  irtual table.   
2cce0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79 73           ** says
2ccf0 20 74 68 61 74 20 74 68 65 20 65 71 75 69 76 61   that the equiva
2cd00 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61 69  lent EQ constrai
2cd10 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 66  nt cannot be saf
2cd20 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20  ely omitted..   
2cd30 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77           ** If w
2cd40 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e do attempt to 
2cd50 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73 74  use such a const
2cd60 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73  raint, some rows
2cd70 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20   might be.      
2cd80 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 65        ** repeate
2cd90 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 2e  d in the output.
2cda0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2cdb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2cdc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
2cdd0 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
2cde0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69  that is constrai
2cdf0 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61  ned by an IN cla
2ce00 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20  use may not.    
2ce10 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65        ** consume
2ce20 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2ce30 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29  ause because (1)
2ce40 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
2ce50 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 20   terms.         
2ce60 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   ** is not neces
2ce70 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  sarily related t
2ce80 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f  o the order of o
2ce90 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a  utput terms and.
2cea0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29            ** (2)
2ceb0 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74   Multiple output
2cec0 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
2ced0 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f  IN value will no
2cee0 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20  t merge.        
2cef0 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20    ** together.  
2cf00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
2cf10 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
2cf20 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
2cf30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2cf40 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e    }.    if( i>=n
2cf50 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
2cf60 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
2cf70 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20   = mxTerm+1;.   
2cf80 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2cf90 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e  >nLTerm<=pNew->n
2cfa0 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70  LSlot );.      p
2cfb0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  New->u.vtab.idxN
2cfc0 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  um = pIdxInfo->i
2cfd0 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65  dxNum;.      pNe
2cfe0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2cff0 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  ee = pIdxInfo->n
2d000 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b  eedToFreeIdxStr;
2d010 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
2d020 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2d030 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  r = 0;.      pNe
2d040 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
2d050 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
2d060 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Str;.      pNew-
2d070 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
2d080 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66  d = (i8)(pIdxInf
2d090 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
2d0a0 65 64 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ed ?.           
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0c0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49             pIdxI
2d0d0 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20  nfo->nOrderBy : 
2d0e0 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
2d0f0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
2d100 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
2d110 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d  qlite3LogEstFrom
2d120 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d  Double(pIdxInfo-
2d130 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
2d140 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
2d150 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
2d160 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  t(pIdxInfo->esti
2d170 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20 20  matedRows);.    
2d180 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72    whereLoopInser
2d190 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2d1a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2d1b0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2d1c0 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ee ){.        sq
2d1d0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
2d1e0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
2d1f0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
2d200 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
2d210 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2d220 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f  }.  }  ..whereLo
2d230 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a  opAddVtab_exit:.
2d240 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
2d250 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2d260 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2d270 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2d280 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2d290 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
2d2a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2d2b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2d2c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2d2d0 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  BLE */../*.** Ad
2d2e0 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  d WhereLoop entr
2d2f0 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52  ies to handle OR
2d300 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f   terms.  This wo
2d310 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a  rks for either.*
2d320 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74  * btrees or virt
2d330 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  ual tables..*/.s
2d340 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2d350 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f  oopAddOr(WhereLo
2d360 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
2d370 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78  der, Bitmask mEx
2d380 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  tra){.  WhereInf
2d390 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
2d3a0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2d3b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2d3c0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2d3d0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
2d3e0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
2d3f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2d400 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
2d410 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
2d420 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
2d430 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
2d440 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
2d450 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b  rSet sSum, sCur;
2d460 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2d470 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2d480 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
2d490 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70  er->pWC;.  if( p
2d4a0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2d4b0 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  s & WHERE_AND_ON
2d4c0 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  LY ) return SQLI
2d4d0 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20  TE_OK;.  pWCEnd 
2d4e0 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
2d4f0 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20  nTerm;.  pNew = 
2d500 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2d510 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20    memset(&sSum, 
2d520 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29  0, sizeof(sSum))
2d530 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
2d540 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
2d550 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
2d560 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
2d570 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54  ursor;..  for(pT
2d580 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
2d590 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d  m<pWCEnd && rc==
2d5a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d  SQLITE_OK; pTerm
2d5b0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
2d5c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2d5d0 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
2d5e0 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
2d5f0 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
2d600 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
2d610 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
2d620 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
2d630 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
2d640 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2d650 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
2d660 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
2d670 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
2d680 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
2d690 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2d6a0 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
2d6b0 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a    int once = 1;.
2d6c0 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
2d6d0 20 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42      .      sSubB
2d6e0 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72  uild = *pBuilder
2d6f0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2d700 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  d.pOrderBy = 0;.
2d710 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2d720 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a  pOrSet = &sCur;.
2d730 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65  .      for(pOrTe
2d740 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72  rm=pOrWC->a; pOr
2d750 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70  Term<pOrWCEnd; p
2d760 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
2d770 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
2d780 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2d790 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
2d7a0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2d7b0 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
2d7c0 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
2d7d0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2d7e0 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
2d7f0 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
2d800 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
2d810 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
2d820 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74  nfo;.          t
2d830 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
2d840 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  WC;.          te
2d850 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
2d860 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2d870 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20  WC.nTerm = 1;.  
2d880 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
2d890 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
2d8a0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2d8b0 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20  pWC = &tempWC;. 
2d8c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d8d0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2d8e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d8f0 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a      sCur.n = 0;.
2d900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d910 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2d920 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
2d930 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
2d940 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
2d950 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2d960 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42  ddVirtual(&sSubB
2d970 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
2d980 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
2d990 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
2d9a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2d9b0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
2d9c0 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
2d9d0 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
2d9e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2d9f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
2da00 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
2da10 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
2da20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
2da30 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
2da40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2da50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
2da60 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
2da70 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
2da80 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
2da90 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
2daa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2dab0 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53          WhereOrS
2dac0 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20  et sPrev;.      
2dad0 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
2dae0 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
2daf0 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
2db00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2db10 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
2db20 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
2db30 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2db40 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
2db50 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2db60 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
2db70 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
2db80 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
2db90 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
2dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbb0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
2dbc0 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
2dbd0 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
2dbe0 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  rRun),.         
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc00 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
2dc10 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e  Add(sPrev.a[i].n
2dc20 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e  Out, sCur.a[j].n
2dc30 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Out));.         
2dc40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2dc50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2dc60 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
2dc70 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
2dc80 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
2dc90 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2dca0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
2dcb0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
2dcc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
2dcd0 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
2dce0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
2dcf0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
2dd00 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  pNew->u, 0, size
2dd10 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20  of(pNew->u));.  
2dd20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
2dd30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
2dd40 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  sSum.n; i++){.  
2dd50 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2dd60 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e   Currently sSum.
2dd70 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74  a[i].rRun is set
2dd80 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74   to the sum of t
2dd90 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20  he costs.       
2dda0 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73   ** of all sub-s
2ddb0 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79  cans required by
2ddc0 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f   the OR-scan. Ho
2ddd0 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f  wever, due to ro
2dde0 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  unding.        *
2ddf0 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79  * errors, it may
2de00 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73   be that the cos
2de10 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e  t of the OR-scan
2de20 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73   is equal to its
2de30 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74  .        ** most
2de40 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73   expensive sub-s
2de50 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61  can. Add the sma
2de60 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70  llest possible p
2de70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20  enalty .        
2de80 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74  ** (equivalent t
2de90 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68  o multiplying th
2dea0 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20  e cost by 1.07) 
2deb0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a  to ensure that .
2dec0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2ded0 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e  does not happen.
2dee0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
2def0 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75  WHERE clauses su
2df00 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ch as the.      
2df10 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
2df20 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
2df30 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20   index on "y":. 
2df40 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2df50 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c    **     WHERE l
2df60 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30  ikelihood(x=?, 0
2df70 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20  .99) OR y=?.    
2df80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2df90 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61  * the planner ma
2dfa0 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20  y elect to "OR" 
2dfb0 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d  together a full-
2dfc0 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61  table scan and a
2dfd0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  n.        ** ind
2dfe0 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f  ex lookup. And o
2dff0 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f  ther similarly o
2e000 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a  dd results.  */.
2e010 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2e020 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
2e030 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  Run + 1;.       
2e040 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
2e050 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
2e060 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
2e070 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
2e080 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
2e090 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2e0a0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2e0b0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2e0c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2e0d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
2e0e0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2e0f0 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74  bjects for all t
2e100 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63  ables .*/.static
2e110 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2e120 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75  dAll(WhereLoopBu
2e130 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
2e140 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2e150 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2e160 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d  ->pWInfo;.  Bitm
2e170 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a  ask mExtra = 0;.
2e180 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
2e190 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
2e1a0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2e1b0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2e1c0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
2e1d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2e1e0 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
2e1f0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2e200 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
2e210 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49  t nTabList = pWI
2e220 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69  nfo->nLevel;.  i
2e230 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e240 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  K;.  u8 priorJoi
2e250 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65  nType = 0;.  Whe
2e260 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20  reLoop *pNew;.. 
2e270 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
2e280 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2e290 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
2e2a0 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
2e2b0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2e2c0 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
2e2d0 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
2e2e0 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
2e2f0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61  pTabList->a; iTa
2e300 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62  b<nTabList; iTab
2e310 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2e320 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
2e330 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
2e340 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
2e350 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
2e360 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
2e370 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
2e380 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c  pItem->jointype|
2e390 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26  priorJoinType) &
2e3a0 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
2e3b0 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
2e3c0 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
2e3d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
2e3e0 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65  rJoinType = pIte
2e3f0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
2e400 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2e410 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2e420 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2e430 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
2e440 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2e450 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e460 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2e470 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65  AddBtree(pBuilde
2e480 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
2e490 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2e4a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e4b0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2e4c0 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d  ddOr(pBuilder, m
2e4d0 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
2e4e0 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77    mPrior |= pNew
2e4f0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2e500 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61  if( rc || db->ma
2e510 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
2e520 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c  ak;.  }.  whereL
2e530 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
2e540 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
2e550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
2e560 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
2e570 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
2e580 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
2e590 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
2e5a0 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
2e5b0 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
2e5c0 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
2e5d0 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
2e5e0 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
2e5f0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
2e600 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
2e610 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
2e620 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
2e630 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
2e640 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
2e650 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
2e660 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
2e670 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
2e680 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
2e690 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
2e6a0 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
2e6b0 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
2e6c0 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
2e6d0 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
2e6e0 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
2e6f0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2e700 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
2e710 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
2e720 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2e730 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
2e740 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
2e750 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
2e760 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
2e770 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
2e780 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
2e790 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
2e7a0 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
2e7b0 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
2e7c0 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
2e7d0 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
2e7e0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
2e7f0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
2e800 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
2e810 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
2e820 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivelent rows are
2e830 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2e840 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
2e850 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
2e860 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
2e870 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
2e880 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
2e890 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
2e8a0 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
2e8b0 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
2e8c0 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
2e8d0 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
2e8e0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
2e8f0 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
2e900 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
2e910 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
2e920 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
2e930 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2e940 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2e950 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
2e960 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
2e970 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
2e980 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
2e990 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
2e9a0 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
2e9b0 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
2e9c0 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
2e9d0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
2e9e0 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
2e9f0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
2ea00 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2ea10 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
2ea20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2ea30 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
2ea40 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
2ea50 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
2ea60 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
2ea70 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
2ea80 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
2ea90 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
2eaa0 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
2eab0 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
2eac0 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
2ead0 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
2eae0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
2eaf0 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
2eb00 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2eb10 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
2eb20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
2eb30 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2eb40 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
2eb50 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
2eb60 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
2eb70 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
2eb80 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
2eb90 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
2eba0 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
2ebb0 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
2ebc0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
2ebd0 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
2ebe0 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
2ebf0 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
2ec00 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
2ec10 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
2ec20 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
2ec30 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
2ec40 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
2ec50 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2ec60 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  ause */.  u16 nK
2ec70 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
2ec80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
2ec90 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
2eca0 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
2ecb0 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
2ecc0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2ecd0 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
2ece0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
2ecf0 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
2ed00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ed10 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
2ed20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2ed30 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
2ed40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2ed50 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
2ed60 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
2ed70 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
2ed80 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2ed90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2eda0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
2edb0 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
2edc0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2edd0 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
2ede0 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
2edf0 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
2ee00 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
2ee10 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
2ee20 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
2ee30 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
2ee40 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
2ee50 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
2ee60 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
2ee70 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
2ee80 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
2ee90 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
2eea0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2eeb0 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
2eec0 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
2eed0 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
2eee0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2eef0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
2ef00 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
2ef10 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
2ef20 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
2ef30 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
2ef40 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
2ef50 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2ef60 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
2ef70 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
2ef80 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
2ef90 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
2efa0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2efb0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
2efc0 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
2efd0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
2efe0 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
2eff0 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
2f000 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
2f010 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
2f020 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
2f030 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
2f040 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
2f050 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
2f060 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
2f070 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
2f080 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
2f090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
2f0a0 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
2f0b0 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
2f0c0 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
2f0d0 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
2f0e0 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
2f0f0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
2f100 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
2f110 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
2f120 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
2f130 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
2f140 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
2f150 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
2f160 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
2f170 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
2f180 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
2f190 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
2f1a0 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
2f1b0 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
2f1c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2f1d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
2f1e0 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
2f1f0 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
2f200 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
2f210 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
2f220 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
2f230 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
2f240 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
2f250 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
2f260 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
2f270 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
2f280 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
2f290 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
2f2a0 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
2f2b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2f2c0 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
2f2d0 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
2f2e0 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
2f2f0 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
2f300 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
2f310 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
2f320 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
2f330 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
2f340 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
2f350 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
2f360 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
2f370 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
2f380 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
2f390 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
2f3a0 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
2f3b0 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
2f3c0 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
2f3d0 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
2f3e0 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
2f3f0 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
2f400 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
2f410 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
2f420 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
2f430 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
2f440 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
2f450 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
2f460 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
2f470 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
2f480 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
2f490 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
2f4a0 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
2f4b0 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
2f4c0 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
2f4d0 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
2f4e0 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
2f4f0 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
2f500 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2f510 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
2f520 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
2f530 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
2f540 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
2f550 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
2f560 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
2f570 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
2f580 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
2f590 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
2f5a0 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
2f5b0 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
2f5c0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
2f5d0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
2f5e0 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
2f5f0 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
2f600 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
2f610 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
2f620 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
2f630 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
2f640 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
2f650 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2f660 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
2f670 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
2f680 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
2f690 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
2f6a0 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ady = 0;.  for(i
2f6b0 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
2f6c0 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
2f6d0 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
2f6e0 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
2f6f0 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
2f700 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
2f710 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2f720 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70     pLoop = iLoop
2f730 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e  <nLoop ? pPath->
2f740 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70  aLoop[iLoop] : p
2f750 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  Last;.    if( pL
2f760 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2f770 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2f780 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
2f790 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
2f7a0 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
2f7b0 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
2f7c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2f7d0 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
2f7e0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
2f7f0 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
2f800 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
2f810 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
2f820 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
2f830 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
2f840 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
2f850 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
2f860 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
2f870 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
2f880 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
2f890 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
2f8a0 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
2f8b0 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
2f8c0 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
2f8d0 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
2f8e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
2f8f0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2f900 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
2f910 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2f920 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
2f930 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2f940 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
2f950 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2f960 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
2f970 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
2f980 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
2f990 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
2f9a0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2f9b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f9c0 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
2f9d0 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
2f9e0 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
2f9f0 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
2fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa10 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57   ~ready, WO_EQ|W
2fa20 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  O_ISNULL, 0);.  
2fa30 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
2fa40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2fa50 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2fa60 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21  Operator&WO_EQ)!
2fa70 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69  =0 && pOBExpr->i
2fa80 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
2fa90 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2faa0 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20  *z1, *z2;.      
2fab0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2fac0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2fad0 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
2fae0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2faf0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2fb00 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2fb10 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2fb20 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f          z1 = pCo
2fb30 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
2fb40 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2fb50 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2fb60 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54  Info->pParse, pT
2fb70 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
2fb80 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2fb90 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
2fba0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
2fbb0 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   z2 = pColl->zNa
2fbc0 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
2fbd0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2fbe0 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74  1, z2)!=0 ) cont
2fbf0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2fc00 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2fc10 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
2fc20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2fc30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2fc40 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
2fc50 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
2fc60 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2fc70 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
2fc80 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
2fc90 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
2fca0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
2fcb0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
2fcc0 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
2fcd0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2fce0 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
2fcf0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
2fd00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fd10 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2fd20 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
2fd30 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
2fd40 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
2fd50 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
2fd60 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
2fd70 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
2fd80 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
2fd90 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
2fda0 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
2fdb0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
2fdc0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
2fdd0 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48  n-1]==(-1) || !H
2fde0 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
2fdf0 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  pTable));.      
2fe00 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2fe10 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65  t = IsUniqueInde
2fe20 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  x(pIndex);.     
2fe30 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f   }..      /* Loo
2fe40 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f  p through all co
2fe50 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
2fe60 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68  ex and deal with
2fe70 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20   the ones.      
2fe80 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2fe90 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
2fea0 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a  = or IN..      *
2feb0 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65  /.      rev = re
2fec0 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vSet = 0;.      
2fed0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
2fee0 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
2fef0 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a  =0; j<nColumn; j
2ff00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ++){.        u8 
2ff10 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65  bOnce;   /* True
2ff20 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
2ff30 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
2ff40 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
2ff50 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64  Skip over == and
2ff60 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a   IS NULL terms *
2ff70 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  /.        if( j<
2ff80 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
2ff90 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
2ffa0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53  Loop->u.btree.nS
2ffb0 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  kip==0.         
2ffc0 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
2ffd0 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
2ffe0 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57  ator) & (WO_EQ|W
2fff0 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20  O_ISNULL))!=0.  
30000 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30010 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53     if( i & WO_IS
30020 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
30030 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
30040 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
30050 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
30060 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
30070 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30080 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
30090 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;  .        }.. 
300a0 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
300b0 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
300c0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
300d0 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
300e0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
300f0 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
30100 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
30110 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
30120 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
30130 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
30140 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
30150 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
30160 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
30170 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
30180 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
30190 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
301a0 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
301b0 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
301c0 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
301d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
301e0 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
301f0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  -1;.          re
30200 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
30210 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
30220 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
30230 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
30240 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
30250 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
30260 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
30270 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
30280 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  red.        */. 
30290 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
302a0 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20  erDistinct.     
302b0 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d      && iColumn>=
302c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e  0.         && j>
302d0 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
302e0 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
302f0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
30300 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  aCol[iColumn].no
30310 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20  tNull==0.       
30320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
30330 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
30340 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
30350 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68        /* Find th
30360 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
30370 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
30380 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c   to the j-th col
30390 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  umn.        ** o
303a0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
303b0 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20  mark that ORDER 
303c0 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20  BY term off .   
303d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
303e0 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  bOnce = 1;.     
303f0 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
30400 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
30410 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
30420 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
30430 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
30440 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
30450 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
30460 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
30470 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
30480 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
30490 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
304a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
304b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
304c0 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20  E_GROUPBY );.   
304d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
304e0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
304f0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
30500 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30510 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57  (wctrlFlags & (W
30520 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45  HERE_GROUPBY|WHE
30530 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d  RE_DISTINCTBY))=
30540 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a  =0 ) bOnce = 0;.
30550 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
30560 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
30570 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
30580 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
30590 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
305a0 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
305b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
305c0 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21  OBExpr->iColumn!
305d0 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  =iColumn ) conti
305e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
305f0 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  f( iColumn>=0 ){
30600 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
30610 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
30620 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
30630 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
30640 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
30650 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
30660 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
30670 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
30680 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
30690 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
306a0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
306b0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
306c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
306d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
306e0 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
306f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
30700 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30710 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
30720 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
30730 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
30740 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20  ROUPBY)==0 ){.  
30750 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
30760 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72  sure the sort or
30770 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c  der is compatibl
30780 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  e in an ORDER BY
30790 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20   clause..       
307a0 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72     ** Sort order
307b0 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66   is irrelevant f
307c0 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
307d0 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ause. */.       
307e0 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b     if( revSet ){
307f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30800 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21   (rev ^ revIdx)!
30810 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  =pOrderBy->a[i].
30820 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61  sortOrder ) isMa
30830 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
30840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30850 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49        rev = revI
30860 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61  dx ^ pOrderBy->a
30870 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
30880 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
30890 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c  ev ) *pRevMask |
308a0 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29  = MASKBIT(iLoop)
308b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
308c0 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vSet = 1;.      
308d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
308e0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
308f0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
30900 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29   if( iColumn<0 )
30910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
30920 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74  stcase( distinct
30930 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20  Columns==0 );.  
30940 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e            distin
30950 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20  ctColumns = 1;. 
30960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30970 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
30980 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
30990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
309a0 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66     /* No match f
309b0 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
309c0 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c    if( j==0 || j<
309d0 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
309e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
309f0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
30a00 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
30a10 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
30a20 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
30a30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
30a40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
30a50 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f       } /* end Lo
30a60 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65  op over all inde
30a70 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  x columns */.   
30a80 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43     if( distinctC
30a90 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20  olumns ){.      
30aa0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
30ab0 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29  derDistinct==0 )
30ac0 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
30ad0 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
30ae0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20       }.    } /* 
30af0 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72  end-if not one-r
30b00 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  ow */..    /* Ma
30b10 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72  rk off any other
30b20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
30b30 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70  that reference p
30b40 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  Loop */.    if( 
30b50 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
30b60 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69  ){.      orderDi
30b70 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c  stinctMask |= pL
30b80 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
30b90 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
30ba0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
30bb0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b          Expr *p;
30bc0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
30bd0 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   mTerm;.        
30be0 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
30bf0 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
30c00 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e;.        p = p
30c10 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
30c20 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65  xpr;.        mTe
30c30 72 6d 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  rm = exprTableUs
30c40 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  age(&pWInfo->sMa
30c50 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20  skSet,p);.      
30c60 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26    if( mTerm==0 &
30c70 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
30c80 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f  Constant(p) ) co
30c90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
30ca0 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65  if( (mTerm&~orde
30cb0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d  rDistinctMask)==
30cc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 ){.          o
30cd0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
30ce0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
30cf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
30d00 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20  /* End the loop 
30d10 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f  over all WhereLo
30d20 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d  ops from outer-m
30d30 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65  ost down to inne
30d40 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20  r-most */.  if( 
30d50 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20  obSat==obDone ) 
30d60 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65  return (i8)nOrde
30d70 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72  rBy;.  if( !isOr
30d80 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
30d90 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42     for(i=nOrderB
30da0 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  y-1; i>0; i--){.
30db0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
30dc0 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31  = MASKBIT(i) - 1
30dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 53  ;.      if( (obS
30de0 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72  at&m)==m ) retur
30df0 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n i;.    }.    r
30e00 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
30e10 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a  eturn -1;.}.../*
30e20 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
30e30 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73  _GROUPBY flag is
30e40 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b   set in the mask
30e50 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
30e60 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a  e3WhereBegin(),.
30e70 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61  ** the planner a
30e80 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
30e90 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65 72  specified pOrder
30ea0 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75 61  By list is actua
30eb0 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42  lly a GROUP.** B
30ec0 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73  Y clause - and s
30ed0 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74  o any order that
30ee0 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20   groups rows as 
30ef0 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66 69  required satisfi
30f00 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  es the.** reques
30f10 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  t..**.** Normall
30f20 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  y, in this case 
30f30 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
30f40 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65  le for the calle
30f50 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a  r to determine.*
30f60 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
30f70 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72 65   the rows are re
30f80 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76  ally being deliv
30f90 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f  ered in sorted o
30fa0 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74  rder, or.** just
30fb0 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f   in some other o
30fc0 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69 64  rder that provid
30fd0 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20  es the required 
30fe0 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65  grouping. Howeve
30ff0 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  r,.** if the WHE
31000 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66  RE_SORTBYGROUP f
31010 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73  lag is also pass
31020 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
31030 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a  reBegin(), then.
31040 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
31050 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f   may be called o
31060 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57  n the returned W
31070 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  hereInfo object.
31080 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74   It returns.** t
31090 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73 20  rue if the rows 
310a0 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73  really will be s
310b0 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70 65  orted in the spe
310c0 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72  cified order, or
310d0 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77   false.** otherw
310e0 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ise..**.** For e
310f0 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
31100 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
31110 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
31120 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  x, Y);.**.** the
31130 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  n.**.**   SELECT
31140 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50   * FROM t1 GROUP
31150 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59   BY x,y ORDER BY
31160 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72   x,y;   -- IsSor
31170 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45  ted()==1.**   SE
31180 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47  LECT * FROM t1 G
31190 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45  ROUP BY y,x ORDE
311a0 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49  R BY y,x;   -- I
311b0 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a  sSorted()==0.*/.
311c0 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
311d0 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e  IsSorted(WhereIn
311e0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61  fo *pWInfo){.  a
311f0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77  ssert( pWInfo->w
31200 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
31210 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61  E_GROUPBY );.  a
31220 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77  ssert( pWInfo->w
31230 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
31240 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b  E_SORTBYGROUP );
31250 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
31260 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66  ->sorted;.}..#if
31270 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
31280 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65  NABLED./* For de
31290 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
312a0 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  : */.static cons
312b0 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74  t char *wherePat
312c0 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20  hName(WherePath 
312d0 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f  *pPath, int nLoo
312e0 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  p, WhereLoop *pL
312f0 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ast){.  static c
31300 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20  har zName[65];. 
31310 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
31320 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29  0; i<nLoop; i++)
31330 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61  { zName[i] = pPa
31340 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49  th->aLoop[i]->cI
31350 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74  d; }.  if( pLast
31360 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20   ) zName[i++] = 
31370 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e  pLast->cId;.  zN
31380 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  ame[i] = 0;.  re
31390 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
313a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
313b0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  n the list of Wh
313c0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
313d0 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  at pWInfo->pLoop
313e0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  s, this routine.
313f0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ** attempts to f
31400 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
31410 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69  ost path that vi
31420 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c  sits each WhereL
31430 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68  oop.** once.  Th
31440 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20  is path is then 
31450 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
31460 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f  pWInfo->a[].pWLo
31470 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a  op fields..**.**
31480 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   Assume that the
31490 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
314a0 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61   output rows tha
314b0 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
314c0 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c  e sorted.** will
314d0 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20   be nRowEst (in 
314e0 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72  the 10*log2 repr
314f0 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72  esentation).  Or
31500 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67  , ignore sorting
31510 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f  .** costs if nRo
31520 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52  wEst==0..**.** R
31530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
31540 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51  on success or SQ
31550 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20  LITE_NOMEM of a 
31560 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
31570 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  n.** error occur
31580 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
31590 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
315a0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
315b0 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45  fo, LogEst nRowE
315c0 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f  st){.  int mxCho
315d0 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ice;            
315e0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
315f0 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f  er of simultaneo
31600 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64  us paths tracked
31610 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b   */.  int nLoop;
31620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31630 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
31640 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a  ms in the join *
31650 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
31660 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
31670 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
31680 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
31690 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
316a0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
316b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
316c0 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
316d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
316e0 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74  p counter over t
316f0 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
31700 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  join */.  int ii
31710 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20  , jj;           
31720 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
31730 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ters */.  int mx
31740 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  I = 0;          
31750 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
31760 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65  next entry to re
31770 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  place */.  int n
31780 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
31790 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
317a0 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  f ORDER BY claus
317b0 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67  e terms */.  Log
317c0 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20  Est rCost;      
317d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
317e0 66 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 4c 6f  f a path */.  Lo
317f0 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20  gEst nOut;      
31800 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
31810 72 20 6f 66 20 6f 75 74 70 75 74 73 20 2a 2f 0a  r of outputs */.
31820 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20    LogEst mxCost 
31830 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 0;        /* M
31840 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61  aximum cost of a
31850 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
31860 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
31870 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
31880 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
31890 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
318a0 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
318b0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
318c0 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
318d0 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
318e0 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
318f0 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
31900 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
31910 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
31920 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
31930 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
31940 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
31950 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
31960 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
31970 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
31980 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
31990 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
319a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
319b0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
319c0 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
319d0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
319e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
319f0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
31a00 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
31a10 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
31a20 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
31a30 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
31a40 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
31a50 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
31a60 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
31a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31a80 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
31a90 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
31aa0 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72  utine */..  pPar
31ab0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
31ac0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
31ad0 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
31ae0 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
31af0 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46  ;.  /* TUNING: F
31b00 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65  or simple querie
31b10 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74  s, only the best
31b20 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64   path is tracked
31b30 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79  ..  ** For 2-way
31b40 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65   joins, the 5 be
31b50 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c  st paths are fol
31b60 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  lowed..  ** For 
31b70 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f  joins of 3 or mo
31b80 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b  re tables, track
31b90 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74   the 10 best pat
31ba0 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65  hs */.  mxChoice
31bb0 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20   = (nLoop<=1) ? 
31bc0 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20  1 : (nLoop==2 ? 
31bd0 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72  5 : 10);.  asser
31be0 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
31bf0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
31c00 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45   );.  WHERETRACE
31c10 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62  (0x002, ("---- b
31c20 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29  egin solver\n"))
31c30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
31c40 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
31c50 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e  space for aTo an
31c60 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20  d aFrom */.  ii 
31c70 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
31c80 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
31c90 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
31ca0 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70  xChoice*2;.  pSp
31cb0 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
31cc0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29  allocRaw(db, ii)
31cd0 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d  ;.  if( pSpace==
31ce0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
31cf0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d  E_NOMEM;.  aTo =
31d00 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70   (WherePath*)pSp
31d10 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61  ace;.  aFrom = a
31d20 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d  To+mxChoice;.  m
31d30 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20  emset(aFrom, 0, 
31d40 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29  sizeof(aFrom[0])
31d50 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65  );.  pX = (Where
31d60 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78  Loop**)(aFrom+mx
31d70 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69  Choice);.  for(i
31d80 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46  i=mxChoice*2, pF
31d90 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69  rom=aTo; ii>0; i
31da0 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58  i--, pFrom++, pX
31db0 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20   += nLoop){.    
31dc0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70  pFrom->aLoop = p
31dd0 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  X;.  }..  /* See
31de0 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
31df0 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
31e00 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
31e10 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
31e20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
31e30 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
31e40 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
31e50 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
31e60 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  25.  If the cost
31e70 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
31e80 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
31e90 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
31ea0 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
31eb0 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20  e first 25.  ** 
31ec0 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
31ed0 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
31ee0 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
31ef0 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
31f00 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
31f10 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73  ryLoop, 46);  as
31f20 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
31f30 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20  3LogEst(25) );. 
31f40 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f   nFrom = 1;..  /
31f50 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65  * Precompute the
31f60 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
31f70 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
31f80 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61  t set, if the ca
31f90 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  ller.  ** to sql
31fa0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
31fb0 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61   was concerned a
31fc0 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a  bout sorting */.
31fd0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
31fe0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
31ff0 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  wEst==0 ){.    a
32000 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
32010 64 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 72 64 65  d = 0;.    nOrde
32020 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
32030 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  {.    aFrom[0].i
32040 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70  sOrdered = nLoop
32050 3e 30 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20  >0 ? -1 : 1;.   
32060 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e   nOrderBy = pWIn
32070 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
32080 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  xpr;.  }..  /* C
32090 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76  ompute successiv
320a0 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65  ely longer Where
320b0 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20  Paths using the 
320c0 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74  previous generat
320d0 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72  ion.  ** of Wher
320e0 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61  ePaths as the ba
320f0 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sis for the next
32100 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  .  Keep track of
32110 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
32120 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74  ** best paths at
32130 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e   each generation
32140 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
32150 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
32160 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54  iLoop++){.    nT
32170 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  o = 0;.    for(i
32180 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d  i=0, pFrom=aFrom
32190 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
321a0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
321b0 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49    for(pWLoop=pWI
321c0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c  nfo->pLoops; pWL
321d0 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f  oop; pWLoop=pWLo
321e0 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  op->pNextLoop){.
321f0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
32200 6d 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20  maskNew;.       
32210 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
32220 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 38   = 0;.        i8
32230 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72   isOrdered = pFr
32240 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
32250 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
32260 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
32270 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
32280 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
32290 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
322a0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
322b0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
322c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
322d0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
322e0 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
322f0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
32300 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
32310 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
32320 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
32330 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74  */.        rCost
32340 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
32350 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74  Add(pWLoop->rSet
32360 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20  up,pWLoop->rRun 
32370 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a  + pFrom->nRow);.
32380 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
32390 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
323a0 28 72 43 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72  (rCost, pFrom->r
323b0 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 6e  Cost);.        n
323c0 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
323d0 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74  w + pWLoop->nOut
323e0 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65  ;.        maskNe
323f0 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  w = pFrom->maskL
32400 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
32410 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
32420 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20  if( isOrdered<0 
32430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f  ){.          isO
32440 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61  rdered = wherePa
32450 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
32460 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20  By(pWInfo,.     
32470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32480 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
32490 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66  By, pFrom, pWInf
324a0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20  o->wctrlFlags,. 
324b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324c0 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c        iLoop, pWL
324d0 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a  oop, &revMask);.
324e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
324f0 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73  Ordered>=0 && is
32500 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79  Ordered<nOrderBy
32510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32520 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d  /* TUNING: Estim
32530 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66  ated cost of a f
32540 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72  ull external sor
32550 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20  t, where N is . 
32560 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
32570 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
32580 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 20   to sort is:.   
32590 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
325a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 63 6f 73          **   cos
325b0 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
325c0 6f 67 28 4e 29 29 2e 0a 20 20 20 20 20 20 20 20  og(N))..        
325d0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
325e0 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68      ** Or, if th
325f0 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73  e order-by claus
32600 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75  e has X terms bu
32610 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20  t only the last 
32620 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  Y .            *
32630 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20  * terms are out 
32640 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62  of order, then b
32650 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c  lock-sorting wil
32660 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20  l reduce the .  
32670 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 72            ** sor
32680 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20  ting cost to:.  
32690 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
326a0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 63 6f           **   co
326b0 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
326c0 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a  log(N)) * (Y/X).
326d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
326e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
326f0 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20  e (Y/X) term is 
32700 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
32710 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  g stack variable
32720 20 72 53 63 61 6c 65 0a 20 20 20 20 20 20 20 20   rScale.        
32730 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a      ** below.  *
32740 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f  /.            Lo
32750 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f  gEst rScale, rSo
32760 72 74 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  rtCost;.        
32770 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64      assert( nOrd
32780 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71  erBy>0 && 66==sq
32790 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
327a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
327b0 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33  rScale = sqlite3
327c0 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79  LogEst((nOrderBy
327d0 2d 69 73 4f 72 64 65 72 65 64 29 2a 31 30 30 2f  -isOrdered)*100/
327e0 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a  nOrderBy) - 66;.
327f0 20 20 20 20 20 20 20 20 20 20 20 20 72 53 6f 72              rSor
32800 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20  tCost = nRowEst 
32810 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74  + estLog(nRowEst
32820 29 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b  ) + rScale + 16;
32830 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
32840 20 54 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73   TUNING: The cos
32850 74 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  t of implementin
32860 67 20 44 49 53 54 49 4e 43 54 20 75 73 69 6e 67  g DISTINCT using
32870 20 61 20 42 2d 54 52 45 45 20 69 73 0a 20 20 20   a B-TREE is.   
32880 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6d 69           ** simi
32890 6c 61 72 20 62 75 74 20 77 69 74 68 20 61 20 6c  lar but with a l
328a0 61 72 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f  arger constant o
328b0 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74  f proportionalit
328c0 79 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  y. .            
328d0 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79 20 61  ** Multiply by a
328e0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 61 63  n additional fac
328f0 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a 2f 0a  tor of 3.0.  */.
32900 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32910 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
32920 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
32930 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
32940 20 20 20 20 20 20 20 20 20 20 72 53 6f 72 74 43            rSortC
32950 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20  ost += 16;.     
32960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32970 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
32980 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20  0x002,.         
32990 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72        ("---- sor
329a0 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f  t cost=%-3d (%d/
329b0 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f  %d) increases co
329c0 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e  st %3d to %-3d\n
329d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
329e0 20 20 20 72 53 6f 72 74 43 6f 73 74 2c 20 28 6e     rSortCost, (n
329f0 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65  OrderBy-isOrdere
32a00 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 72 43  d), nOrderBy, rC
32a10 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ost,.           
32a20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
32a30 73 74 41 64 64 28 72 43 6f 73 74 2c 72 53 6f 72  stAdd(rCost,rSor
32a40 74 43 6f 73 74 29 29 29 3b 0a 20 20 20 20 20 20  tCost)));.      
32a50 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71        rCost = sq
32a60 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
32a70 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29  Cost, rSortCost)
32a80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32a90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32aa0 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d         revMask =
32ab0 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
32ac0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32ad0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
32ae0 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f  ee if pWLoop sho
32af0 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20  uld be added to 
32b00 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62 65 73  the mxChoice bes
32b10 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  t so far */.    
32b20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54      for(jj=0, pT
32b30 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a  o=aTo; jj<nTo; j
32b40 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
32b50 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
32b60 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65  maskLoop==maskNe
32b70 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
32b80 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
32b90 5e 69 73 4f 72 64 65 72 65 64 29 26 38 30 29 3d  ^isOrdered)&80)=
32ba0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
32bb0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
32bc0 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20  case( jj==nTo-1 
32bd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
32be0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
32bf0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32c00 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
32c10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
32c20 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26   nTo>=mxChoice &
32c30 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20  & rCost>=mxCost 
32c40 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ){.#ifdef WHERET
32c50 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
32c60 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
32c70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
32c80 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
32c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
32ca0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32cb0 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74  ("Skip   %s cost
32cc0 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
32cd0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
32ce0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
32cf0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
32d00 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
32d10 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
32d20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
32d30 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
32d40 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
32d50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
32d60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
32d70 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
32d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32d90 20 20 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20     /* Add a new 
32da0 50 61 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b  Path to the aTo[
32db0 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20  ] set */.       
32dc0 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
32dd0 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
32de0 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
32df0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
32e00 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
32e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
32e20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
32e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32e40 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
32e50 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
32e60 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
32e70 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
32e80 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
32e90 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
32ea0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32eb0 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
32ec0 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
32ed0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
32ee0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
32ef0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
32f00 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
32f10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
32f20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32f30 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
32f40 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
32f50 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
32f60 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
32f70 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
32f80 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
32f90 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
32fa0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
32fb0 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
32fc0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
32fd0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
32fe0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
32ff0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
33000 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20  o->rCost<=rCost 
33010 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ){.#ifdef WHERET
33020 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
33030 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
33040 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
33050 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
33060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
33070 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
33080 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
33090 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63      "Skip   %s c
330a0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
330b0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
330c0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
330d0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
330e0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
330f0 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
33100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
33110 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
33120 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
33130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
33140 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
33150 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f  ntf("   vs %s co
33160 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72  st=%-3d,%d order
33170 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
33180 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
33190 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
331a0 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
331b0 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
331c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
331d0 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
331e0 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72  d>=0 ? pTo->isOr
331f0 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
33200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
33210 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
33220 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
33230 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29  ->rCost==rCost )
33240 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
33250 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
33260 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
33270 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
33280 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20  st==rCost+1 );. 
33290 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65           /* A ne
332a0 77 20 61 6e 64 20 62 65 74 74 65 72 20 73 63 6f  w and better sco
332b0 72 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75  re for a previou
332c0 73 6c 79 20 63 72 65 61 74 65 64 20 65 71 75 69  sly created equi
332d0 76 61 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23  valent path */.#
332e0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
332f0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
33300 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
33310 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
33320 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
33330 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
33340 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
33350 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74            "Updat
33360 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  e %s cost=%-3d,%
33370 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
33390 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
333a0 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
333b0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
333c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333d0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
333e0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
333f0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
33400 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
33410 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f  ntf("  was %s co
33420 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
33430 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
33440 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
33450 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
33460 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
33470 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
33480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33490 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d  pTo->isOrdered>=
334a0 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  0 ? pTo->isOrder
334b0 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
334c0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
334d0 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  f.        }.    
334e0 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73      /* pWLoop is
334f0 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20   a winner.  Add 
33500 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  it to the set of
33510 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a   best so far */.
33520 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73          pTo->mas
33530 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d  kLoop = pFrom->m
33540 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
33550 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
33560 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70      pTo->revLoop
33570 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20   = revMask;.    
33580 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20      pTo->nRow = 
33590 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54  nOut;.        pT
335a0 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74  o->rCost = rCost
335b0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69  ;.        pTo->i
335c0 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64  sOrdered = isOrd
335d0 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65  ered;.        me
335e0 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c  mcpy(pTo->aLoop,
335f0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73   pFrom->aLoop, s
33600 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
33610 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  )*iLoop);.      
33620 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f    pTo->aLoop[iLo
33630 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20  op] = pWLoop;.  
33640 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
33650 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
33660 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20       mxI = 0;.  
33670 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
33680 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20   aTo[0].rCost;. 
33690 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
336a0 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
336b0 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
336c0 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
336d0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
336e0 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 29 7b 0a  rCost>mxCost ){.
336f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
33700 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73  Cost = pTo->rCos
33710 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
33720 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
33730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
33750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
33760 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
33770 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
33780 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
33790 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20  e3WhereTrace>=2 
337a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
337b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
337c0 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64  - after round %d
337d0 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29   ----\n", iLoop)
337e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
337f0 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54  , pTo=aTo; ii<nT
33800 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; ii++, pTo++){
33810 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33820 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73  DebugPrintf(" %s
33830 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d   cost=%-3d nrow=
33840 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
33850 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
33860 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
33870 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
33880 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
33890 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  ,.           pTo
338a0 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
338b0 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
338c0 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20  +'0') : '?');.  
338d0 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69        if( pTo->i
338e0 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20 20  sOrdered>0 ){.  
338f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
33900 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76  ebugPrintf(" rev
33910 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d  =0x%llx\n", pTo-
33920 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  >revLoop);.     
33930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33940 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
33950 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
33960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33970 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
33980 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f    /* Swap the ro
33990 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64  les of aFrom and
339a0 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78   aTo for the nex
339b0 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  t generation */.
339c0 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b      pFrom = aTo;
339d0 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d  .    aTo = aFrom
339e0 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46  ;.    aFrom = pF
339f0 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d  rom;.    nFrom =
33a00 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   nTo;.  }..  if(
33a10 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20   nFrom==0 ){.   
33a20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
33a30 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65  (pParse, "no que
33a40 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20  ry solution");. 
33a50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
33a60 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
33a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33a80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20  ERROR;.  }.  .  
33a90 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65  /* Find the lowe
33aa0 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70  st cost path.  p
33ab0 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66  From will be lef
33ac0 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
33ad0 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72  at path */.  pFr
33ae0 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f  om = aFrom;.  fo
33af0 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d  r(ii=1; ii<nFrom
33b00 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
33b10 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46   pFrom->rCost>aF
33b20 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20  rom[ii].rCost ) 
33b30 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69  pFrom = &aFrom[i
33b40 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
33b50 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
33b60 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20  ==nLoop );.  /* 
33b70 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Load the lowest 
33b80 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70  cost path into p
33b90 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69  WInfo */.  for(i
33ba0 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
33bb0 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
33bc0 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70     WhereLevel *p
33bd0 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
33be0 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70  a + iLoop;.    p
33bf0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20  Level->pWLoop = 
33c00 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  pWLoop = pFrom->
33c10 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
33c20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
33c30 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a  = pWLoop->iTab;.
33c40 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
33c50 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
33c60 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
33c70 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72  ->iFrom].iCursor
33c80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49  ;.  }.  if( (pWI
33c90 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
33ca0 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
33cb0 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20  TINCT)!=0.   && 
33cc0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
33cd0 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
33ce0 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26  INCTBY)==0.   &&
33cf0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
33d00 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  ct==WHERE_DISTIN
33d10 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52  CT_NOOP.   && nR
33d20 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42  owEst.  ){.    B
33d30 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a  itmask notUsed;.
33d40 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65      int rc = whe
33d50 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
33d60 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
33d70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65  WInfo->pResultSe
33d80 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20  t, pFrom,.      
33d90 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
33da0 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f  _DISTINCTBY, nLo
33db0 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
33dc0 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f  op[nLoop-1], &no
33dd0 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20  tUsed);.    if( 
33de0 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73  rc==pWInfo->pRes
33df0 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b  ultSet->nExpr ){
33e00 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
33e10 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
33e20 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
33e30 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  D;.    }.  }.  i
33e40 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
33e50 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  rBy ){.    if( p
33e60 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
33e70 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
33e80 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66  CTBY ){.      if
33e90 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  ( pFrom->isOrder
33ea0 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ed==pWInfo->pOrd
33eb0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
33ec0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65         pWInfo->e
33ed0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
33ee0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
33ef0 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
33f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e  else{.      pWIn
33f10 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72  fo->nOBSat = pFr
33f20 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
33f30 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
33f40 3e 6e 4f 42 53 61 74 3c 30 20 29 20 70 57 49 6e  >nOBSat<0 ) pWIn
33f50 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a  fo->nOBSat = 0;.
33f60 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
33f70 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
33f80 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  evLoop;.    }.  
33f90 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
33fa0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
33fb0 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a 20  E_SORTBYGROUP). 
33fc0 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f         && pWInfo
33fd0 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f  ->nOBSat==pWInfo
33fe0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
33ff0 72 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42  r.    ){.      B
34000 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 20 3d  itmask notUsed =
34010 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   0;.      int nO
34020 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68  rder = wherePath
34030 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
34040 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
34050 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20  >pOrderBy, .    
34060 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20        pFrom, 0, 
34070 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e  nLoop-1, pFrom->
34080 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20  aLoop[nLoop-1], 
34090 26 6e 6f 74 55 73 65 64 0a 20 20 20 20 20 20 29  &notUsed.      )
340a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
340b0 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d  pWInfo->sorted==
340c0 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
340d0 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 28 6e 4f 72  o->sorted = (nOr
340e0 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  der==pWInfo->pOr
340f0 64 65 72 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  derBy->nExpr);. 
34100 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49     }.  }...  pWI
34110 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
34120 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
34130 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
34140 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
34150 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
34160 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
34170 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
34180 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34190 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
341a0 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
341b0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
341c0 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
341d0 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
341e0 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
341f0 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
34200 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
34210 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
34220 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
34230 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
34240 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
34250 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
34260 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
34270 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
34280 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
34290 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
342a0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
342b0 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
342c0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
342d0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
342e0 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
342f0 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
34300 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
34310 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
34320 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
34330 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
34340 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
34350 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
34360 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
34370 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
34380 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
34390 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
343a0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
343b0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
343c0 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
343d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
343e0 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
343f0 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
34400 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
34410 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
34420 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
34430 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
34440 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
34450 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20  dx;.  .  pWInfo 
34460 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
34470 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
34480 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
34490 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
344a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
344b0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
344c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
344d0 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
344e0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
344f0 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
34500 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
34510 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
34520 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
34530 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29   pItem->zIndex )
34540 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75   return 0;.  iCu
34550 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
34560 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  or;.  pWC = &pWI
34570 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f  nfo->sWC;.  pLoo
34580 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
34590 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ew;.  pLoop->wsF
345a0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f  lags = 0;.  pLoo
345b0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
345c0 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20   = 0;.  pTerm = 
345d0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
345e0 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51  ur, -1, 0, WO_EQ
345f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
34600 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  m ){.    pLoop->
34610 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
34620 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
34630 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  IPK|WHERE_ONEROW
34640 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ;.    pLoop->aLT
34650 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
34660 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
34670 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70  m = 1;.    pLoop
34680 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
34690 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  1;.    /* TUNING
346a0 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69  : Cost of a rowi
346b0 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a  d lookup is 10 *
346c0 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75  /.    pLoop->rRu
346d0 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d  n = 33;  /* 33==
346e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
346f0 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) */.  }else{.  
34700 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
34710 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
34720 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
34730 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
34740 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
34750 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ce==pLoop->aLTer
34760 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m );.      asser
34770 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  t( ArraySize(pLo
34780 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
34790 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==4 );.      if(
347a0 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
347b0 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20  pIdx).       || 
347c0 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
347d0 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c  ere!=0 .       |
347e0 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e  | pIdx->nKeyCol>
347f0 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d  ArraySize(pLoop-
34800 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20  >aLTermSpace) . 
34810 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b       ) continue;
34820 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
34830 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j<pIdx->nKeyCol;
34840 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   j++){.        p
34850 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
34860 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d  pWC, iCur, pIdx-
34870 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c  >aiColumn[j], 0,
34880 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20   WO_EQ, pIdx);. 
34890 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
348a0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
348b0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65       pLoop->aLTe
348c0 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[j] = pTerm;. 
348d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
348e0 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   j!=pIdx->nKeyCo
348f0 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
34900 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
34910 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
34920 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  N_EQ|WHERE_ONERO
34930 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  W|WHERE_INDEXED;
34940 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
34950 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28  >isCovering || (
34960 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  pItem->colUsed &
34970 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
34980 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20  (pIdx))==0 ){.  
34990 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
349a0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
349b0 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  X_ONLY;.      }.
349c0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54        pLoop->nLT
349d0 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  erm = j;.      p
349e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
349f0 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  q = j;.      pLo
34a00 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
34a10 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  ex = pIdx;.     
34a20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
34a30 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64   of a unique ind
34a40 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20  ex lookup is 15 
34a50 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  */.      pLoop->
34a60 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33  rRun = 39;  /* 3
34a70 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  9==sqlite3LogEst
34a80 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72  (15) */.      br
34a90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
34aa0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
34ab0 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  ags ){.    pLoop
34ac0 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
34ad0 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  )1;.    pWInfo->
34ae0 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c  a[0].pWLoop = pL
34af0 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  oop;.    pLoop->
34b00 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61  maskSelf = getMa
34b10 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
34b20 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20  kSet, iCur);.   
34b30 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54   pWInfo->a[0].iT
34b40 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  abCur = iCur;.  
34b50 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
34b60 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  t = 1;.    if( p
34b70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
34b80 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ) pWInfo->nOBSat
34b90 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64   =  pWInfo->pOrd
34ba0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
34bb0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
34bc0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
34bd0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
34be0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
34bf0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
34c00 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
34c10 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
34c20 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
34c30 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27  pLoop->cId = '0'
34c40 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
34c50 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
34c60 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
34c70 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
34c80 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
34c90 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
34ca0 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
34cb0 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
34cc0 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
34cd0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
34ce0 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
34cf0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
34d00 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
34d10 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
34d20 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
34d30 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
34d40 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
34d50 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
34d60 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
34d70 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
34d80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
34d90 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
34da0 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
34db0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
34dc0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
34dd0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
34de0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
34df0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
34e00 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
34e10 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
34e20 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
34e30 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
34e40 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
34e50 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
34e60 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
34e70 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
34e80 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
34e90 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
34ea0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
34eb0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
34ec0 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
34ed0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
34ee0 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
34ef0 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
34f00 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
34f10 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
34f20 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
34f30 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
34f40 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
34f50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
34f60 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
34f70 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
34f80 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
34f90 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
34fa0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
34fb0 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
34fc0 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
34fd0 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
34fe0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
34ff0 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
35000 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
35010 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
35020 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
35030 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
35040 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
35050 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
35060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35070 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
35080 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
35090 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
350a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
350b0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
350c0 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
350d0 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
350e0 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
350f0 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
35100 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
35110 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
35120 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
35130 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
35140 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
35150 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
35160 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
35170 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
35180 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
35190 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
351a0 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
351b0 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
351c0 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
351d0 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
351e0 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
351f0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
35200 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
35210 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
35220 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
35230 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
35240 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
35250 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
35260 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
35270 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
35280 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
35290 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
352a0 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
352b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
352c0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
352d0 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
352e0 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
352f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
35300 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
35310 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
35320 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
35330 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
35340 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
35350 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
35360 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
35370 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
35380 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
35390 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
353a0 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
353b0 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
353c0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
353d0 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
353e0 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
353f0 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
35400 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
35410 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
35420 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
35430 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
35440 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
35450 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
35460 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
35470 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
35480 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
35490 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
354a0 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
354b0 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
354c0 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
354d0 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
354e0 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
354f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
35500 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
35510 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
35520 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
35530 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
35540 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
35550 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
35560 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
35570 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
35580 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
35590 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
355a0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
355b0 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
355c0 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
355d0 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
355e0 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
355f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
35600 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
35610 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
35620 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
35630 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
35640 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
35650 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
35660 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
35670 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
35680 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
35690 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
356a0 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
356b0 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
356c0 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
356d0 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
356e0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
356f0 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
35700 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
35710 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
35720 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
35730 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
35740 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
35750 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
35760 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
35770 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
35780 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
35790 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
357a0 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
357b0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
357c0 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
357d0 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
357e0 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
357f0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
35800 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
35810 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
35820 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
35830 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
35840 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
35850 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
35860 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
35870 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
35880 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
35890 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
358a0 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
358b0 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
358c0 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
358d0 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72  ESSING.**.** pOr
358e0 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
358f0 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
35900 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68  BY clause (or th
35910 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
35920 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52  e.** if the WHER
35930 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
35940 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c  s set in wctrlFl
35950 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54  ags) of a SELECT
35960 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66   statement.** if
35970 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
35980 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
35990 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
359a0 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  r if this routin
359b0 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66  e.** is called f
359c0 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72  rom an UPDATE or
359d0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
359e0 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79  t, then pOrderBy
359f0 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
35a00 54 68 65 20 69 49 64 78 43 75 72 20 70 61 72 61  The iIdxCur para
35a10 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75 72  meter is the cur
35a20 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  sor number of an
35a30 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20   index.  If .** 
35a40 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
35a50 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64 78  NLY is set, iIdx
35a60 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  Cur is the curso
35a70 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69  r number of an i
35a80 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66  ndex.** to use f
35a90 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f  or OR clause pro
35aa0 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48  cessing.  The WH
35ab0 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  ERE clause shoul
35ac0 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70  d use this.** sp
35ad0 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20  ecific cursor.  
35ae0 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53  If WHERE_ONEPASS
35af0 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74 2c  _DESIRED is set,
35b00 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69 73   then iIdxCur is
35b10 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 75  .** the first cu
35b20 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79  rsor in an array
35b30 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20   of cursors for 
35b40 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49  all indices.  iI
35b50 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20  dxCur should.** 
35b60 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  be used to compu
35b70 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
35b80 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64  te cursor depend
35b90 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64  ing on which ind
35ba0 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a  ex is.** used..*
35bb0 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
35bc0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
35bd0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
35be0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
35bf0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
35c00 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
35c10 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d  List,    /* FROM
35c20 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20   clause: A list 
35c30 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
35c40 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
35c50 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
35c60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
35c70 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
35c80 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
35c90 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45  By,   /* An ORDE
35ca0 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42  R BY (or GROUP B
35cb0 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  Y) clause, or NU
35cc0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
35cd0 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a   *pResultSet, /*
35ce0 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   Result set of t
35cf0 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31  he query */.  u1
35d00 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
35d10 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
35d20 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
35d30 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
35d40 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20  eInt.h */.  int 
35d50 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20  iIdxCur         
35d60 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e    /* If WHERE_ON
35d70 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73  ETABLE_ONLY is s
35d80 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72  et, index cursor
35d90 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
35da0 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20  int nByteWInfo; 
35db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
35dc0 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  m. bytes allocat
35dd0 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f  ed for WhereInfo
35de0 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74   struct */.  int
35df0 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20   nTabList;      
35e00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35e10 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
35e20 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
35e30 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
35e40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
35e50 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
35e60 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
35e70 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
35e80 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
35e90 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
35ea0 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
35eb0 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
35ec0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
35ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
35ee0 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
35ef0 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
35f00 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
35f10 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20  uilder sWLB;    
35f20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
35f30 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57  p builder */.  W
35f40 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
35f50 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65  skSet;    /* The
35f60 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
35f70 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c   set */.  WhereL
35f80 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
35f90 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
35fa0 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f   level in pWInfo
35fb0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  ->a[] */.  Where
35fc0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
35fd0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
35fe0 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65   to a single Whe
35ff0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
36000 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
36010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36020 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
36030 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
36040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36050 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
36060 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
36070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36080 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
36090 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61  ode */...  /* Va
360a0 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
360b0 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20  ation */.  db = 
360c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65  pParse->db;.  me
360d0 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73  mset(&sWLB, 0, s
360e0 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20  izeof(sWLB));.. 
360f0 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f   /* An ORDER/GRO
36100 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  UP BY clause of 
36110 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72  more than 63 ter
36120 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74  ms cannot be opt
36130 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74  imized */.  test
36140 63 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26  case( pOrderBy &
36150 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  & pOrderBy->nExp
36160 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  r==BMS-1 );.  if
36170 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
36180 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42  rderBy->nExpr>=B
36190 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20  MS ) pOrderBy = 
361a0 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72  0;.  sWLB.pOrder
361b0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
361c0 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65    /* Disable the
361d0 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69   DISTINCT optimi
361e0 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  zation if SQLITE
361f0 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20  _DistinctOpt is 
36200 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c  set via.  ** sql
36210 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53  ite3_test_ctrl(S
36220 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
36230 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e  PTIMIZATIONS,...
36240 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  ) */.  if( Optim
36250 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
36260 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69  db, SQLITE_Disti
36270 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77  nctOpt) ){.    w
36280 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48  ctrlFlags &= ~WH
36290 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
362a0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  T;.  }..  /* The
362b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
362c0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
362d0 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
362e0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
362f0 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20  .  ** bits in a 
36300 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20  Bitmask .  */.  
36310 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69  testcase( pTabLi
36320 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b  st->nSrc==BMS );
36330 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
36340 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
36350 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
36360 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
36370 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
36380 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
36390 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
363a0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
363b0 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e  ion normally gen
363c0 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20  erates a nested 
363d0 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62  loop for all tab
363e0 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61  les in .  ** pTa
363f0 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74  bList.  But if t
36400 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  he WHERE_ONETABL
36410 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
36420 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75  et, then we shou
36430 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e  ld.  ** only gen
36440 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
36450 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69  he first table i
36460 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  n pTabList and a
36470 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20  ssume that.  ** 
36480 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f  any cursors asso
36490 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73  ciated with subs
364a0 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72  equent tables ar
364b0 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
364c0 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74  .  */.  nTabList
364d0 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26   = (wctrlFlags &
364e0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
364f0 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62  ONLY) ? 1 : pTab
36500 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f  List->nSrc;..  /
36510 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
36520 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68  nitialize the Wh
36530 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
36540 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
36550 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75  me the.  ** retu
36560 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67  rn value. A sing
36570 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  le allocation is
36580 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
36590 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a  he WhereInfo.  *
365a0 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f  * struct, the co
365b0 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49  ntents of WhereI
365c0 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65  nfo.a[], the Whe
365d0 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
365e0 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  re.  ** and the 
365f0 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72  WhereMaskSet str
36600 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68  ucture. Since Wh
36610 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69  ereClause contai
36620 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a  ns an 8-byte.  *
36630 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69  * field (type Bi
36640 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62  tmask) it must b
36650 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20  e aligned on an 
36660 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20  8-byte boundary 
36670 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63  on.  ** some arc
36680 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63  hitectures. Henc
36690 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62  e the ROUND8() b
366a0 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79  elow..  */.  nBy
366b0 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38  teWInfo = ROUND8
366c0 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66  (sizeof(WhereInf
366d0 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a  o)+(nTabList-1)*
366e0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
366f0 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  l));.  pWInfo = 
36700 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
36710 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e  ero(db, nByteWIn
36720 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72  fo + sizeof(Wher
36730 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64  eLoop));.  if( d
36740 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
36750 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
36760 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
36770 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30  ;.    pWInfo = 0
36780 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  ;.    goto where
36790 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
367a0 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
367b0 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e  nePass[0] = pWIn
367c0 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
367d0 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e  [1] = -1;.  pWIn
367e0 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61  fo->nLevel = nTa
367f0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
36800 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  >pParse = pParse
36810 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  ;.  pWInfo->pTab
36820 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
36830 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  .  pWInfo->pOrde
36840 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
36850 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c    pWInfo->pResul
36860 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65  tSet = pResultSe
36870 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
36880 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43  eak = pWInfo->iC
36890 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
368a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
368b0 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74  );.  pWInfo->wct
368c0 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46  rlFlags = wctrlF
368d0 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  lags;.  pWInfo->
368e0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
368f0 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
36900 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74  Loop;.  pMaskSet
36910 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73   = &pWInfo->sMas
36920 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49  kSet;.  sWLB.pWI
36930 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20  nfo = pWInfo;.  
36940 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e  sWLB.pWC = &pWIn
36950 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e  fo->sWC;.  sWLB.
36960 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f  pNew = (WhereLoo
36970 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e  p*)(((char*)pWIn
36980 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b  fo)+nByteWInfo);
36990 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
369a0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
369b0 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20  sWLB.pNew) );.  
369c0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57  whereLoopInit(sW
369d0 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66  LB.pNew);.#ifdef
369e0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
369f0 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d  sWLB.pNew->cId =
36a00 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   '*';.#endif..  
36a10 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
36a20 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
36a30 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
36a40 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
36a50 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
36a60 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
36a70 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
36a80 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
36a90 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
36aa0 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  t);.  whereClaus
36ab0 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
36ac0 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77  WC, pWInfo);.  w
36ad0 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66  hereSplit(&pWInf
36ae0 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20  o->sWC, pWhere, 
36af0 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
36b00 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
36b10 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
36b20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
36b30 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
36b40 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
36b50 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
36b60 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
36b70 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
36b80 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  u..  */.  for(ii
36b90 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d  =0; ii<sWLB.pWC-
36ba0 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
36bb0 20 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d     if( nTabList=
36bc0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
36bd0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
36be0 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  in(sWLB.pWC->a[i
36bf0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
36c00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
36c10 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57  False(pParse, sW
36c20 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45  LB.pWC->a[ii].pE
36c30 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  xpr, pWInfo->iBr
36c40 65 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eak,.           
36c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
36c60 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
36c70 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43  ;.      sWLB.pWC
36c80 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20  ->a[ii].wtFlags 
36c90 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
36ca0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
36cb0 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20  pecial case: No 
36cc0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
36cd0 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d  .  if( nTabList=
36ce0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  =0 ){.    if( pO
36cf0 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
36d00 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72  >nOBSat = pOrder
36d10 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
36d20 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
36d30 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
36d40 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
36d50 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
36d60 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
36d70 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20  UNIQUE;.    }.  
36d80 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  }..  /* Assign a
36d90 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69   bit from the bi
36da0 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74  tmask to every t
36db0 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
36dc0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
36dd0 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67  * When assigning
36de0 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
36df0 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63  to FROM clause c
36e00 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20  ursors, it must 
36e10 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65  be.  ** the case
36e20 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68   that if X is th
36e30 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68  e bitmask for th
36e40 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75  e N-th FROM clau
36e50 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a  se term then.  *
36e60 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  * the bitmask fo
36e70 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  r all FROM claus
36e80 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c  e terms to the l
36e90 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  eft of the N-th 
36ea0 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d  term.  ** is (X-
36eb0 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73  1).   An express
36ec0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ion from the ON 
36ed0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
36ee0 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20   JOIN can use.  
36ef0 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67  ** its Expr.iRig
36f00 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75  htJoinTable valu
36f10 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69  e to find the bi
36f20 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67  tmask of the rig
36f30 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66  ht table.  ** of
36f40 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74   the join.  Subt
36f50 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d  racting one from
36f60 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
36f70 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61   bitmask gives a
36f80 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f  .  ** bitmask fo
36f90 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
36fa0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
36fb0 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74  join.  Knowing t
36fc0 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20  he bitmask.  ** 
36fd0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
36fe0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
36ff0 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70  left join is imp
37000 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
37010 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3015..  **.  **
37020 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61   Note that bitma
37030 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20  sks are created 
37040 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74  for all pTabList
37050 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e  ->nSrc tables in
37060 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20  .  ** pTabList, 
37070 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72  not just the fir
37080 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c  st nTabList tabl
37090 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73  es.  nTabList is
370a0 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65   normally.  ** e
370b0 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74  qual to pTabList
370c0 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74  ->nSrc but might
370d0 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f   be shortened to
370e0 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57   1 if the.  ** W
370f0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
37100 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  LY flag is set..
37110 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
37120 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
37130 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63  rc; ii++){.    c
37140 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
37150 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
37160 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
37170 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
37180 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  .  {.    Bitmask
37190 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a   toTheLeft = 0;.
371a0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
371b0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
371c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69   ii++){.      Bi
371d0 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73  tmask m = getMas
371e0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
371f0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
37200 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sor);.      asse
37210 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65  rt( (m-1)==toThe
37220 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f  Left );.      to
37230 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20  TheLeft |= m;.  
37240 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
37250 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
37260 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
37270 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68  ssions.  Note th
37280 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29  at exprAnalyze()
37290 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20   might.  ** add 
372a0 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
372b0 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  s onto the end o
372c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
372d0 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20  se.  We do not. 
372e0 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c   ** want to anal
372f0 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61  yze these virtua
37300 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72  l terms, so star
37310 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74  t analyzing at t
37320 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20  he end.  ** and 
37330 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20  work forward so 
37340 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76  that the added v
37350 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
37360 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
37370 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61  ..  */.  exprAna
37380 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74  lyzeAll(pTabList
37390 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b  , &pWInfo->sWC);
373a0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
373b0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
373c0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
373d0 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ror;.  }..  if( 
373e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
373f0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
37400 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69   ){.    if( isDi
37410 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
37420 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
37430 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  , &pWInfo->sWC, 
37440 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20  pResultSet) ){. 
37450 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54       /* The DIST
37460 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20  INCT marking is 
37470 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f  pointless.  Igno
37480 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  re it. */.      
37490 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
374a0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
374b0 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
374c0 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42  else if( pOrderB
374d0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y==0 ){.      /*
374e0 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59   Try to ORDER BY
374f0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
37500 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74  to make distinct
37510 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69   processing easi
37520 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  er */.      pWIn
37530 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c  fo->wctrlFlags |
37540 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
37550 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  BY;.      pWInfo
37560 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65  ->pOrderBy = pRe
37570 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20  sultSet;.    }. 
37580 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
37590 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ct the WhereLoop
375a0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48   objects */.  WH
375b0 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
375c0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
375d0 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
375e0 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c    /* Display all
375f0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
37600 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69  ERE clause */.#i
37610 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  f defined(WHERET
37620 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 20 26 26  RACE_ENABLED) &&
37630 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
37640 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
37650 41 49 4e 29 0a 20 20 69 66 28 20 73 71 6c 69 74  AIN).  if( sqlit
37660 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
37670 78 31 30 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  x100 ){.    int 
37680 69 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  i;.    Vdbe *v =
37690 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
376a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
376b0 69 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20 20  inBegin(v);.    
376c0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e  for(i=0; i<sWLB.
376d0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  pWC->nTerm; i++)
376e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
376f0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20  xplainPrintf(v, 
37700 22 23 25 2d 32 64 20 22 2c 20 69 29 3b 0a 20 20  "#%-2d ", i);.  
37710 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
37720 69 6e 50 75 73 68 28 76 29 3b 0a 20 20 20 20 20  inPush(v);.     
37730 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72   whereExplainTer
37740 6d 28 76 2c 20 26 73 57 4c 42 2e 70 57 43 2d 3e  m(v, &sWLB.pWC->
37750 61 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  a[i]);.      sql
37760 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 76  ite3ExplainPop(v
37770 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
37780 45 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20  ExplainNL(v);.  
37790 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
377a0 78 70 6c 61 69 6e 46 69 6e 69 73 68 28 76 29 3b  xplainFinish(v);
377b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
377c0 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  gPrintf("%s", sq
377d0 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61  lite3VdbeExplana
377e0 74 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65  tion(v));.  }.#e
377f0 6e 64 69 66 0a 20 20 69 66 28 20 6e 54 61 62 4c  ndif.  if( nTabL
37800 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53  ist!=1 || whereS
37810 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d  hortCut(&sWLB)==
37820 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68  0 ){.    rc = wh
37830 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73  ereLoopAddAll(&s
37840 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63  WLB);.    if( rc
37850 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
37860 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20  inError;.  .    
37870 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f  /* Display all o
37880 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
37890 6f 62 6a 65 63 74 73 20 69 66 20 77 68 65 72 65  objects if where
378a0 74 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64  trace is enabled
378b0 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
378c0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
378d0 20 21 3d 30 20 2a 2f 0a 20 20 20 20 69 66 28 20   !=0 */.    if( 
378e0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
378f0 65 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  e ){.      Where
37900 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69  Loop *p;.      i
37910 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74  nt i;.      stat
37920 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d  ic char zLabel[]
37930 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
37940 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
37950 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20  stuvwyxz".      
37960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37980 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
37990 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
379a0 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
379b0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
379c0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
379d0 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
379e0 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
379f0 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  [i%sizeof(zLabel
37a00 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
37a10 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57  eLoopPrint(p, sW
37a20 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  LB.pWC);.      }
37a30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
37a40 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
37a50 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
37a60 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
37a70 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
37a80 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
37a90 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
37aa0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
37ab0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
37ac0 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
37ad0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
37ae0 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
37af0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
37b00 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
37b10 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
37b20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
37b30 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
37b40 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
37b50 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
37b60 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
37b70 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d  >revMask = (Bitm
37b80 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20  ask)(-1);.  }.  
37b90 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
37ba0 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61   || NEVER(db->ma
37bb0 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
37bc0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
37bd0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66  inError;.  }.#if
37be0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
37bf0 4e 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f  NABLED /* !=0 */
37c00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
37c10 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
37c20 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69  int ii;.    sqli
37c30 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
37c40 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52  ---- Solution nR
37c50 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e  ow=%d", pWInfo->
37c60 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66  nRowOut);.    if
37c70 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
37c80 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
37c90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
37ca0 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25 6c   ORDERBY=%d,0x%l
37cb0 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  lx", pWInfo->nOB
37cc0 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76  Sat, pWInfo->rev
37cd0 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
37ce0 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d   switch( pWInfo-
37cf0 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  >eDistinct ){.  
37d00 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
37d10 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
37d20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37d30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
37d40 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22  DISTINCT=unique"
37d50 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
37d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37d70 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
37d80 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
37d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
37da0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
37db0 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b  TINCT=ordered");
37dc0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
37dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
37de0 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
37df0 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20  T_UNORDERED: {. 
37e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
37e10 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
37e20 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22  TINCT=unordered"
37e30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
37e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37e50 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
37e60 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
37e70 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
37e80 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
37e90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
37ea0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66  eLoopPrint(pWInf
37eb0 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c  o->a[ii].pWLoop,
37ec0 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
37ed0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  }.  }.#endif.  /
37ee0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69  * Attempt to omi
37ef0 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68  t tables from th
37f00 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e  e join that do n
37f10 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65  ot effect the re
37f20 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57  sult */.  if( pW
37f30 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a  Info->nLevel>=2.
37f40 20 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74     && pResultSet
37f50 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  !=0.   && Optimi
37f60 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
37f70 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f  , SQLITE_OmitNoo
37f80 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20  pJoin).  ){.    
37f90 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20  Bitmask tabUsed 
37fa0 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
37fb0 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
37fc0 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20  ResultSet);.    
37fd0 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  if( sWLB.pOrderB
37fe0 79 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20 65  y ) tabUsed |= e
37ff0 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
38000 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42  e(pMaskSet, sWLB
38010 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
38020 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e  while( pWInfo->n
38030 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20  Level>=2 ){.    
38040 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
38050 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20  rm, *pEnd;.     
38060 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   pLoop = pWInfo-
38070 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  >a[pWInfo->nLeve
38080 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  l-1].pWLoop;.   
38090 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
380a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
380b0 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70  p->iTab].jointyp
380c0 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
380d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
380e0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
380f0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
38100 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20  INCT)==0.       
38110 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
38120 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
38130 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  W)==0.      ){. 
38140 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
38150 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
38160 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70  (tabUsed & pLoop
38170 2d 3e 6d 61 73