/ Hex Artifact Content
Login

Artifact 1f448161f1d9ec8cb68e2a8eb2e4a9756a877f69:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
2c90: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
2ca0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
2cb0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
2cc0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
2cd0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
2ce0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
2cf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d00: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
2d10: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
2d20: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
2d30: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
2d40: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
2d50: 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65 6e  t/right preceden
2d60: 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e  ce rules come in
2d70: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74  to play when det
2d80: 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ermining the.** 
2d90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2da0: 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45  ce, then COLLATE
2db0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 61   operators are a
2dc0: 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72  djusted to ensur
2dd0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  e.** that the co
2de0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2df0: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2e00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e10: 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "Y collate NO
2e20: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
2e30: 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63 61  es "X op Y" beca
2e40: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
2e50: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
2e60: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
2e70: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
2e80: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
2e90: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2ea0: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
2eb0: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
2ec0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
2ed0: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
2ee0: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
2ef0: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
2f00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
2f10: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
2f20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2f30: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
2f40: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
2f50: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2f60: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
2f70: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
2f80: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
2f90: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2fa0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
2fb0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2fc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
2fd0: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
2fe0: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
2ff0: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
3000: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
3010: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3020: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
3030: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
3040: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
3050: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
3060: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3070: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
3080: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
3090: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
30a0: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
30b0: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
30c0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
30d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
30e0: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
3100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3110: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
3120: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
3130: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
3140: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
3150: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
3160: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
3170: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
3180: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
3190: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
31a0: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
31b0: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
31c0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
31d0: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
31e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
31f0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
3200: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3210: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
3220: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3230: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3240: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3250: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3260: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3270: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
3280: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3290: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
32a0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
32b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32c0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
32d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
32e0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
32f0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3300: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3310: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3320: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3340: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3350: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3360: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3370: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
3380: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
3390: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
33a0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
33b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
33c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
33d0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
33e0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
33f0: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3400: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3410: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3420: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3430: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3440: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3450: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3460: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
3470: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
3480: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
3490: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34a0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34b0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34c0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
34d0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34e0: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
34f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3500: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3510: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3520: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3530: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3540: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3550: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3560: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
3570: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3580: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
3590: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35a0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35b0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35c0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
35d0: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
35e0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
35f0: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3600: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3610: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3620: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3630: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3640: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3650: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3660: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
3670: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
3680: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
3690: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36a0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36b0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
36d0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
36e0: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
36f0: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3700: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3710: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3720: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3740: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3750: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3760: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
3770: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
3780: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
3790: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37a0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37c0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
37d0: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
37e0: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
37f0: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3800: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3810: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3820: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3830: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3840: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3850: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3860: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
3870: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
3880: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
3890: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38a0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38b0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38c0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
38d0: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
38e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
38f0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3900: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3910: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3920: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3930: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3940: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3950: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3960: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3970: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
3990: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39a0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39b0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
39d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
39e0: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
39f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a10: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a20: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a40: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a50: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a60: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3a70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3a80: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3a90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ab0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3ac0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b40: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b50: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b60: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3b70: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3b80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3b90: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3ba0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3bd0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3be0: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3bf0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c00: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c10: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c30: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c50: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c60: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c70: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3c90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3ca0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3cb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3cc0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3cd0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3ce0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3cf0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d00: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d10: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d20: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d30: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d40: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3d70: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3d90: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3da0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3db0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3df0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e10: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e20: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e30: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e40: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e60: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3e70: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3e80: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3e90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3ed0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3ee0: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3ef0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f10: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f20: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f30: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f40: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f50: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f60: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3f70: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3f80: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fc0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
3fd0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
3fe0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
3ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4010: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4020: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4030: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4040: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4050: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4060: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
4070: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
4080: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
4090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40c0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
40d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
40e0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
40f0: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4100: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4110: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4120: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4130: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4140: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4150: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4160: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
4170: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4180: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
4190: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41a0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41b0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41c0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
41d0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
41e0: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
41f0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4200: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4210: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4220: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4230: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4240: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4250: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4260: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
4270: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
4280: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
4290: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42a0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42b0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42c0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
42d0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
42e0: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
42f0: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4300: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4310: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4320: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4330: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4340: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4350: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4360: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4370: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
4380: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
4390: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43a0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43b0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43c0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
43d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
43e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
43f0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4400: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4410: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4430: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4440: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4460: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
4470: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
4490: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44a0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44b0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
44d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
44e0: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
44f0: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4500: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4510: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4520: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4530: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4540: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4550: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4560: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
4570: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
4580: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
4590: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45a0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45c0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
45d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
45e0: 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  ER(j>=pIdx->nKey
45f0: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Col) ) return 0;
4600: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e  .    }.    pScan
4610: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
4620: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
4630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61   }else{.    pSca
4640: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
4650: 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e     pScan->zCollN
4660: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ame = 0;.  }.  p
4670: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f  Scan->opMask = o
4680: 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e  pMask;.  pScan->
4690: 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  k = 0;.  pScan->
46a0: 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72  aEquiv[0] = iCur
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  ;.  pScan->aEqui
46c0: 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  v[1] = iColumn;.
46d0: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20    pScan->nEquiv 
46e0: 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45  = 2;.  pScan->iE
46f0: 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75  quiv = 2;.  retu
4700: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
4710: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
4720: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
4730: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
4740: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
4750: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4760: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
4770: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
4780: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
4790: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
47a0: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
47b0: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
47c0: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
47d0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
47e0: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
47f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
4800: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
4810: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
4820: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
4830: 54 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65  The term returne
4840: 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78  d might by Y=<ex
4850: 70 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20  pr> if there is 
4860: 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69  another constrai
4870: 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  nt in.** the WHE
4880: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73  RE clause that s
4890: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d  pecifies that X=
48a0: 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e  Y.  Any such con
48b0: 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65  straints will be
48c0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62  .** identified b
48d0: 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62  y the WO_EQUIV b
48e0: 69 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d  it in the pTerm-
48f0: 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64  >eOperator field
4900: 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76  .  The.** aEquiv
4910: 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58  [] array holds X
4920: 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75   and all its equ
4930: 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65  ivalents, with e
4940: 61 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ach SQL variable
4950: 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77  .** taking up tw
4960: 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  o slots in aEqui
4970: 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20  v[].  The first 
4980: 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20  slot is for the 
4990: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a  cursor number.**
49a0: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
49b0: 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  is for the colum
49c0: 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65  n number.  There
49d0: 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e   are 22 slots in
49e0: 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20   aEquiv[].** so 
49f0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
4a00: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
4a10: 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72  s up to 10 other
4a20: 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75   equivalent valu
4a30: 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73  es..** Hence a s
4a40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
4a50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
4a60: 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32  f X=A1 and A1=A2
4a70: 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e   and A2=A3.** an
4a80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
4a90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
4aa0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
4ab0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
4ac0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
4ad0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
4ae0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
4af0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
4b00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
4b10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
4b20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
4b30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
4b40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
4b50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
4b60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
4b70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
4b80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
4b90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
4ba0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
4bb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
4bc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
4bd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
4be0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
4bf0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
4c00: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
4c10: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
4c20: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
4c30: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
4c40: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
4c50: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74   WO_EQUIV..*/.st
4c60: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
4c70: 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  findTerm(.  Wher
4c80: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4c90: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
4ca0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
4cb0: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
4cc0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
4cd0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
4ce0: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
4cf0: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
4d00: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
4d10: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
4d20: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
4d30: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
4d40: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
4d50: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
4d60: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
4d70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
4d80: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
4d90: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
4da0: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
4db0: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
4dc0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
4dd0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
4de0: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
4df0: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
4e00: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
4e10: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
4e20: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
4e30: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
4e40: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
4e50: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
4e60: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
4e70: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
4e80: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
4e90: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
4eb0: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
4ec0: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
4ed0: 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b  tor&WO_EQ)!=0 ){
4ee0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4ef0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
4f00: 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20   if( pResult==0 
4f10: 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20  ) pResult = p;. 
4f20: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65     }.    p = whe
4f30: 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
4f40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4f50: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46  pResult;.}../* F
4f60: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
4f70: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
4f80: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
4f90: 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  ist*, WhereClaus
4fa0: 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  e*, int);../*.**
4fb0: 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a   Call exprAnalyz
4fc0: 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69  e on all terms i
4fd0: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
4fe0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .  .*/.static vo
4ff0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
5000: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
5010: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
5020: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
5030: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
5040: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
5050: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
5060: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
5070: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
5080: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
5090: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
50a0: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
50b0: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
50c0: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
50d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
50e0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
50f0: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
5100: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
5110: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
5120: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
5130: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
5140: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
5150: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
5160: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
5170: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5180: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
5190: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
51a0: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
51b0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
51c0: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
51d0: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
51e0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
51f0: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
5200: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
5210: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
5220: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
5230: 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20  OrGlob(.  Parse 
5240: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
5250: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5260: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5270: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
5280: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
5290: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
52a0: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
52b0: 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e  Prefix,  /* Poin
52c0: 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47  ter to TK_STRING
52d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
52e0: 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20   pattern prefix 
52f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d  */.  int *pisCom
5300: 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69  plete, /* True i
5310: 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63  f the only wildc
5320: 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20  ard is % in the 
5330: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a  last character *
5340: 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65  /.  int *pnoCase
5350: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5360: 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71   uppercase is eq
5370: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
5380: 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rcase */.){.  co
5390: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
53b0: 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b  ng on RHS of LIK
53c0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
53d0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
53e0: 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69  Left;      /* Ri
53f0: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a  ght and left siz
5400: 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  e of LIKE operat
5410: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  or */.  ExprList
5420: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
5430: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70     /* List of op
5440: 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49  erands to the LI
5450: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
5460: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
5470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5480: 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ne character in 
5490: 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  z[] */.  int cnt
54a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
54c0: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
54d0: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
54e0: 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  */.  char wc[3];
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72  /* Wildcard char
5510: 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  acters */.  sqli
5520: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5530: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
5540: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
5550: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5560: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pVal = 0;.  in
5570: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
5580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
5590: 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a  de of pRight */.
55a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
55b0: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
55c0: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
55d0: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
55e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  urn 0;.  }.#ifde
55f0: 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a  f SQLITE_EBCDIC.
5600: 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29    if( *pnoCase )
5610: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
5620: 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  f.  pList = pExp
5630: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c  r->x.pList;.  pL
5640: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
5650: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
5660: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
5670: 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  UMN .   || sqlit
5680: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
5690: 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46  Left)!=SQLITE_AF
56a0: 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73  F_TEXT .   || Is
56b0: 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70  Virtual(pLeft->p
56c0: 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  Tab).  ){.    /*
56d0: 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39   IMP: R-02065-49
56e0: 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  465 The left-han
56f0: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49  d side of the LI
5700: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
5710: 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  tor must.    ** 
5720: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
5730: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
5740: 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e   with TEXT affin
5750: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
5760: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
5770: 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  rt( pLeft->iColu
5780: 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42  mn!=(-1) ); /* B
5790: 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72  ecause IPK never
57a0: 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f   has AFF_TEXT */
57b0: 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c  ..  pRight = sql
57c0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
57d0: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ate(pList->a[0].
57e0: 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70  pExpr);.  op = p
57f0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
5800: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
5810: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52   ){.    Vdbe *pR
5820: 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73  eprepare = pPars
5830: 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20  e->pReprepare;. 
5840: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52     int iCol = pR
5850: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  ight->iColumn;. 
5860: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
5870: 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
5880: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
5890: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
58a0: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70  NONE);.    if( p
58b0: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
58c0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
58d0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
58e0: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
58f0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5900: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
5910: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5920: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
5930: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
5940: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
5950: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
5960: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
5970: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
5980: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5990: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
59a0: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
59b0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
59c0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
59d0: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
59e0: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
59f0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
5a00: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
5a10: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
5a20: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
5a30: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
5a40: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
5a50: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
5a60: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
5a70: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
5a80: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
5a90: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
5aa0: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
5ab0: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
5ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
5ad0: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
5ae0: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
5af0: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
5b00: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
5b10: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
5b20: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
5b30: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
5b40: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
5b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5b60: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
5b70: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
5b80: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
5b90: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
5ba0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
5bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
5bc0: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
5bd0: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
5be0: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
5bf0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
5c00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
5c10: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
5c20: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
5c30: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
5c40: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
5c50: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
5c60: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
5c70: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
5c80: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
5c90: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
5ca0: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
5cb0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
5cc0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
5cd0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
5ce0: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
5cf0: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround th
5d00: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
5d10: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
5d20: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
5d30: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
5d40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5d50: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5d60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5d70: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
5d80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5da0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
5db0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
5dc0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
5dd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
5de0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5df0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5e00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5e10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5e20: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
5e30: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
5e40: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
5e50: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
5e60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5e70: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5e80: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
5e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5ea0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5eb0: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
5ec0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5ed0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5ee0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
5ef0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
5f00: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
5f10: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
5f20: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
5f30: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
5f40: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
5f50: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
5f60: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
5f70: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
5f80: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
5f90: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
5fa0: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
5fb0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
5fc0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
5fd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
5fe0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5ff0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
6000: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
6010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6020: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
6030: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
6040: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
6050: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6060: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
6070: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
6080: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
60a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
60b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
60c0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
60d0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
60e0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
60f0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
6100: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
6110: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
6120: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
6130: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
6140: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
6150: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
6160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6170: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
6180: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
6190: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
61a0: 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65  ){.  if( pDerive
61b0: 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65  d ){.    pDerive
61c0: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
61d0: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
61e0: 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72  omJoin;.    pDer
61f0: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6200: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6210: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6220: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
6230: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6240: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
6250: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6260: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6270: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
6280: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
6290: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
62a0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
62b0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
62c0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
62d0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
62e0: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
62f0: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
6300: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
6340: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
6350: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
6360: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
6370: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
6380: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
6390: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
63a0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
63b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
63c0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
63d0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
63e0: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
63f0: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
6400: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
6410: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
6420: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
6430: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
6440: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6450: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
6460: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
6470: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
6480: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
6490: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
64a0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
64b0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
64c0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
64d0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
64e0: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
64f0: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
6500: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
6510: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
6520: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
6530: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
6540: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
6550: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
6560: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
6570: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
6580: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
6590: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
65a0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
65b0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
65c0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
65d0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
65e0: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
65f0: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
6600: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
6610: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
6620: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
6630: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
6640: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
6650: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
6660: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
6670: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6680: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
6690: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
66a0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
66b0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
66c0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
66d0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
66e0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
66f0: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
6700: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
6710: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
6720: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
6730: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
6740: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
6750: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
6760: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
6770: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
6780: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
6790: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
67a0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
67b0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
67c0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
67d0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
67e0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
67f0: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
6800: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6810: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
6820: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
6830: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
6840: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
6850: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
6860: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
6870: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
6880: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6890: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
68a0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
68b0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
68c0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
68d0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
68e0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
68f0: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
6900: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
6910: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
6920: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
6930: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
6940: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
6950: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
6960: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
6970: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
6980: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
6990: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
69a0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
69b0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
69c0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
69d0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
69e0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
69f0: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
6a00: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
6a10: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
6a20: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
6a30: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
6a40: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
6a50: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6a60: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
6a70: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
6a80: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
6a90: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
6aa0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
6ab0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
6ac0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
6ad0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
6ae0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
6af0: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
6b00: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
6b10: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
6b20: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
6b30: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
6b40: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
6b50: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
6b60: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
6b70: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
6b80: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
6b90: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
6ba0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
6bb0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
6bc0: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
6bd0: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
6be0: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
6bf0: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
6c00: 73 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20  statisfies case 
6c10: 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65  1 (such as B) we
6c20: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
6c30: 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a  ptimizer will.**
6c40: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63   always prefer c
6c50: 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61  ase 1, so in tha
6c60: 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e  t case we preten
6c70: 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73  d that case 2 is
6c80: 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65   not.** satisfie
6c90: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68  d..**.** It migh
6ca0: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
6cb0: 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  at multiple tabl
6cc0: 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  es are indexable
6cd0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  .  For example,.
6ce0: 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20  ** (E) above is 
6cf0: 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62  indexable on tab
6d00: 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e  les P, Q, and R.
6d10: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61  .**.** Terms tha
6d20: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
6d30: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
6d40: 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73  for lookup by us
6d50: 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ing.** separate 
6d60: 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20  indices to find 
6d70: 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20  rowids for each 
6d80: 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70  subterm and comp
6d90: 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69  osing.** the uni
6da0: 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73  on of all rowids
6db0: 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20   using a RowSet 
6dc0: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73  object.  This is
6dd0: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22   similar.** to "
6de0: 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20  bitmap indices" 
6df0: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
6e00: 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a  e engines..**.**
6e10: 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a   OTHERWISE:.**.*
6e20: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73  * If neither cas
6e30: 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61  e 1 nor case 2 a
6e40: 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65  pply, then leave
6e50: 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73   the eOperator s
6e60: 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20  et to.** zero.  
6e70: 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  This term is not
6e80: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72   useful for sear
6e90: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
6ea0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  id exprAnalyzeOr
6eb0: 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
6ec0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
6ed0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
6ee0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
6ef0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
6f00: 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c      /* the compl
6f10: 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ete WHERE clause
6f20: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
6f30: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
6f40: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
6f50: 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  OR-term to be an
6f60: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
6f70: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
6f80: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
6f90: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
6fa0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
6fb0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  g context */.  P
6fc0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
6fd0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
6fe0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
6ff0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
7000: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7010: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
7020: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7030: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
7040: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7050: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7060: 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65  Term];    /* The
7070: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
7080: 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  yzed */.  Expr *
7090: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
70a0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
70b0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
70c0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ion of the term 
70d0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7100: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
7110: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7120: 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20  pOrWc;       /* 
7130: 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d  Breakup of pTerm
7140: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
7150: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
7160: 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a  OrTerm;       /*
7170: 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68   A Sub-term with
7180: 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a  in the pOrWc */.
7190: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
71a0: 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41  OrInfo;     /* A
71b0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
71c0: 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ation associated
71d0: 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20   with pTerm */. 
71e0: 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49   Bitmask chngToI
71f0: 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  N;         /* Ta
7200: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
7210: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a  satisfy case 1 *
7220: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
7230: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  xable;        /*
7240: 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   Tables that are
7250: 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69   indexable, sati
7260: 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f  sfying case 2 */
7270: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61  ..  /*.  ** Brea
7280: 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  k the OR clause 
7290: 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74  into its separat
72a0: 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65  e subterms.  The
72b0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20   subterms are.  
72c0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57  ** stored in a W
72d0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
72e0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
72f0: 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65  within the Where
7300: 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65  OrInfo.  ** obje
7310: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
7320: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
7330: 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65  nal OR clause te
7340: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rm..  */.  asser
7350: 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
7360: 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d  gs & (TERM_DYNAM
7370: 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54  IC|TERM_ORINFO|T
7380: 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30  ERM_ANDINFO))==0
7390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
73a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
73b0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  ;.  pTerm->u.pOr
73c0: 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d  Info = pOrInfo =
73d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
73e0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
73f0: 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66  *pOrInfo));.  if
7400: 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72  ( pOrInfo==0 ) r
7410: 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e  eturn;.  pTerm->
7420: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7430: 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20  ORINFO;.  pOrWc 
7440: 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  = &pOrInfo->wc;.
7450: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
7460: 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29  t(pOrWc, pWInfo)
7470: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
7480: 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f  OrWc, pExpr, TK_
7490: 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79  OR);.  exprAnaly
74a0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57  zeAll(pSrc, pOrW
74b0: 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
74c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
74d0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
74e0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29  OrWc->nTerm>=2 )
74f0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d  ;..  /*.  ** Com
7500: 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20  pute the set of 
7510: 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  tables that migh
7520: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20  t satisfy cases 
7530: 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  1 or 2..  */.  i
7540: 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74  ndexable = ~(Bit
7550: 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f  mask)0;.  chngTo
7560: 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  IN = ~(Bitmask)0
7570: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
7580: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
7590: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
75a0: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
75b0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
75c0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
75d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
75e0: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
75f0: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
7600: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
7610: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54     assert( (pOrT
7620: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7630: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52  TERM_ANDINFO|TER
7640: 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  M_ORINFO))==0 );
7650: 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20  .      chngToIN 
7660: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49  = 0;.      pAndI
7670: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7680: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
7690: 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b  eof(*pAndInfo));
76a0: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49  .      if( pAndI
76b0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57  nfo ){.        W
76c0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
76d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  WC;.        Wher
76e0: 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b  eTerm *pAndTerm;
76f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7700: 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
7710: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
7720: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
7730: 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20  fo = pAndInfo;. 
7740: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
7750: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7760: 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20  ANDINFO;.       
7770: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
7780: 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20  tor = WO_AND;.  
7790: 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26        pAndWC = &
77a0: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
77b0: 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73        whereClaus
77c0: 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57  eInit(pAndWC, pW
77d0: 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  C->pWInfo);.    
77e0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
77f0: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
7800: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
7810: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
7820: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
7830: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
7840: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
7850: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
7860: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
7870: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
7880: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
7890: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
78a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
78b0: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
78c0: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
78d0: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
78e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
78f0: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
7900: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
7910: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
7920: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
7930: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
7940: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
7950: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7960: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  ->sMaskSet, pAnd
7970: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
7990: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
79a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
79b0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
79c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
79d0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
79e0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
79f0: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
7a00: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
7a10: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
7a20: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
7a30: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
7a40: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
7a50: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
7a60: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
7a70: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
7a80: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
7a90: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
7aa0: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
7ab0: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
7ac0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
7ad0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
7ae0: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
7af0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
7b00: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
7b10: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
7b20: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
7b30: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7b40: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68  ->sMaskSet, pOth
7b50: 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  er->leftCursor);
7b60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7b70: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
7b80: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
7b90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ba0: 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_EQ)==0 ){.    
7bb0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
7bc0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7bd0: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
7be0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
7bf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
7c00: 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65  ** Record the se
7c10: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7c20: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
7c30: 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20    The set might 
7c40: 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20  be.  ** empty.. 
7c50: 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69   */.  pOrInfo->i
7c60: 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78  ndexable = index
7c70: 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  able;.  pTerm->e
7c80: 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78  Operator = index
7c90: 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f  able==0 ? 0 : WO
7ca0: 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _OR;..  /*.  ** 
7cb0: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
7cc0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
7cd0: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
7ce0: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
7cf0: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
7d00: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
7d10: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
7d20: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
7d30: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
7d40: 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  isfied..  **.  *
7d50: 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20  * chngToIN will 
7d60: 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31  hold either 0, 1
7d70: 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68  , or 2 bits.  Th
7d80: 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61  e 0-bit case mea
7d90: 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ns.  ** that the
7da0: 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69  re is no possibi
7db0: 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72  lity of transfor
7dc0: 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75  ming the OR clau
7dd0: 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20  se into an.  ** 
7de0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  IN operator beca
7df0: 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  use one or more 
7e00: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20  terms in the OR 
7e10: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20  clause contain. 
7e20: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   ** something ot
7e30: 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61  her than == on a
7e40: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73   column in the s
7e50: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
7e60: 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73  e 1-bit.  ** cas
7e70: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65  e means that eve
7e80: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
7e90: 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  R clause is of t
7ea0: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61  he form.  ** "ta
7eb0: 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22  ble.column=expr"
7ec0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
7ed0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65   table.  The one
7ee0: 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
7ef0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65  .  ** will corre
7f00: 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d  spond to the com
7f10: 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73  mon table.  We s
7f20: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65  till need to che
7f30: 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ck to make.  ** 
7f40: 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f  sure the same co
7f50: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20  lumn is used on 
7f60: 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20  all terms.  The 
7f70: 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68  2-bit case is wh
7f80: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20  en.  ** the all 
7f90: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
7fa0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f   form "table1.co
7fb0: 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75  lumn=table2.colu
7fc0: 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69  mn".  It.  ** mi
7fd0: 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  ght be possible 
7fe0: 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70  to form an IN op
7ff0: 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68  erator with eith
8000: 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  er table1.column
8010: 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e  .  ** or table2.
8020: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48  column as the LH
8030: 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63  S if either is c
8040: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
8050: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  erm of.  ** the 
8060: 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OR clause..  **.
8070: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
8080: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
8090: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d   "table.column1=
80a0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28  table.column2" (
80b0: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
80c0: 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65  ble on both size
80d0: 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e  s of the ==) can
80e0: 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
80f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ..  */.  if( chn
8100: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74  gToIN ){.    int
8110: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8120: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8130: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
8140: 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20   to IN is valid 
8150: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
8160: 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  mn = -1;        
8170: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78   /* Column index
8180: 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70   on lhs of IN op
8190: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  erator */.    in
81a0: 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20  t iCursor = -1; 
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
81c0: 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74   cursor common t
81d0: 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20  o all terms */. 
81e0: 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20     int j = 0;   
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8200: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8210: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
8220: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63  or a table and c
8230: 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61  olumn that appea
8240: 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f  rs on one side o
8250: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  r the.    ** oth
8260: 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65  er of the == ope
8270: 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73  rator in every s
8280: 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61  ubterm.  That ta
8290: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20  ble and column. 
82a0: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
82b0: 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f  corded in iCurso
82c0: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20  r and iColumn.  
82d0: 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20  There might not 
82e0: 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  be any.    ** su
82f0: 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ch table and col
8300: 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68  umn.  Set okToCh
8310: 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70  ngToIN if an app
8320: 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20  ropriate table. 
8330: 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e     ** and column
8340: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65   is found but le
8350: 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  ave okToChngToIN
8360: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f   false if not fo
8370: 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  und..    */.    
8380: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20  for(j=0; j<2 && 
8390: 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a  !okToChngToIN; j
83a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65  ++){.      pOrTe
83b0: 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20  rm = pOrWc->a;. 
83c0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
83d0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
83e0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
83f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8400: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8410: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8420: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8430: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8440: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8450: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8460: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8470: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
8480: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
8490: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
84a0: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
84b0: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
84c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
84d0: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
84e0: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
84f0: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
8500: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
8510: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8520: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8530: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8550: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
8560: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
8570: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
8580: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
8590: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
85a0: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
85b0: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
85c0: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
85d0: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
85e0: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
85f0: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
8600: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
8610: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
8620: 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20   preceeded.     
8630: 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77       ** or follw
8640: 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65  ed by an inverte
8650: 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31  d copy (t2.b==t1
8660: 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20  .a).  Skip this 
8670: 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20  term .          
8680: 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69  ** and use its i
8690: 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  nversion. */.   
86a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
86b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
86c0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
86d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
86e0: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
86f0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
8700: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
8710: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
8720: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
8730: 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d  TERM_COPIED|TERM
8740: 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20  _VIRTUAL) );.   
8750: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8760: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8770: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72     iColumn = pOr
8780: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
8790: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72  mn;.        iCur
87a0: 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c  sor = pOrTerm->l
87b0: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
87c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
87d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20  }.      if( i<0 
87e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
87f0: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
8800: 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e  +column was foun
8810: 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  d.  This can onl
8820: 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20  y occur.        
8830: 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** on the second
8840: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
8850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
8860: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
8870: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
8880: 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a  wo(chngToIN) );.
8890: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
88a0: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
88b0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
88c0: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
88d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
88e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
88f0: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
8900: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
8910: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
8920: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
8930: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
8940: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
8950: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
8960: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
8970: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
8980: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
8990: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
89a0: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
89b0: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
89c0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
89d0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
89e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
89f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8a00: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
8a10: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
8a20: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
8a30: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
8a40: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8a50: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
8a60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
8a70: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
8a80: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
8a90: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
8aa0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8ab0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
8ad0: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
8ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
8af0: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
8b00: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
8b10: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
8b20: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
8b30: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
8b40: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
8b50: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
8b60: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
8b70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
8b80: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
8b90: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
8ba0: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
8bb0: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
8bc0: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
8bd0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
8be0: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
8bf0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
8c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
8c10: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
8c20: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
8c30: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
8c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8c50: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
8c60: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
8c70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
8c80: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8c90: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
8ca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8cb0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8cc0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
8cd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8cf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
8d00: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
8d10: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
8d20: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
8d30: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
8d40: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
8d50: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
8d60: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
8d70: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
8d80: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
8d90: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
8da0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
8db0: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
8dc0: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
8dd0: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
8de0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
8df0: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
8e00: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
8e10: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8e20: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
8e30: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
8e40: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8e50: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
8e60: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
8e70: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
8e80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
8e90: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
8ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8eb0: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
8ec0: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
8ed0: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
8ee0: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
8ef0: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
8f00: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
8f10: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
8f20: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8f30: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
8f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8f50: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8f60: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8f70: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
8f80: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
8f90: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
8fa0: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
8fb0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
8fc0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
8fd0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
8fe0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
8ff0: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9000: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9010: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9020: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9030: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e  rListAppend(pWIn
9040: 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  fo->pParse, pLis
9050: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
9060: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
9070: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
9080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
9090: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
90a0: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
90b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
90c0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
90d0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
90e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
90f0: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
9100: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
9110: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
9120: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
9130: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
9140: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
9150: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
9160: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9170: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
9180: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
9190: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
91a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
91b0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
91c0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
91d0: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
91e0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
91f0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
9200: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
9210: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
9220: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
9230: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
9240: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
9250: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9260: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
9270: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
9280: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
9290: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
92a0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
92b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
92c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
92d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
92e0: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
92f0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
9300: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
9310: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
9320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
9330: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9340: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
9350: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
9360: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
9370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
9380: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
9390: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
93a0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
93b0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
93c0: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
93d0: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
93e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
93f0: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
9400: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
9410: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
9420: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
9430: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
9440: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
9450: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9460: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
9470: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
9480: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
9490: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
94a0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
94b0: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
94c0: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
94d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
94e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
94f0: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
9500: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
9510: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
9520: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
9530: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
9540: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
9550: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
9560: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
9570: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
9580: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
9590: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
95a0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
95b0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
95c0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
95d0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
95e0: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
95f0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
9600: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
9610: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
9620: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
9630: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
9640: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
9650: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
9660: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
9670: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
9680: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
9690: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
96a0: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
96b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
96c0: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
96d0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
96e0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
96f0: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
9700: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
9710: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
9720: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
9730: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9740: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
9750: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
9760: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
9770: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
9780: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
9790: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
97a0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
97b0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
97c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
97d0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
97e0: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
97f0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
9800: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
9810: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
9820: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9830: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
9840: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
9850: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
9860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
9870: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
9880: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
9890: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
98b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
98c0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
98d0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
98e0: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
98f0: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
9900: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
9910: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
9920: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9940: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
9950: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
9960: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
9970: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
9980: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
9990: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
99a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
99b0: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
99c0: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
99d0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
99e0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
99f0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
9a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
9a10: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
9a20: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
9a30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
9a40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9a50: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
9a60: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
9a70: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
9a80: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9aa0: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
9ab0: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
9ac0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
9ad0: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
9ae0: 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se;  /* Parsing 
9af0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
9b00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9b10: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
9b20: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9b30: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
9b40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9b50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9b60: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
9b70: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9b80: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
9b90: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
9ba0: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
9bb0: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
9bc0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
9bd0: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
9be0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
9bf0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
9c00: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
9c10: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
9c20: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
9c30: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
9c40: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
9c50: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
9c60: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
9c70: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9c80: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9c90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
9ca0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9cb0: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
9cc0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9cd0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
9ce0: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
9cf0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9d00: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9d10: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
9d20: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9d30: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
9d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
9d50: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
9d60: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9d70: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
9d80: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
9d90: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9da0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9db0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
9dc0: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
9dd0: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
9de0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9df0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
9e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
9e10: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
9e20: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
9e30: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
9e40: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
9e50: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
9e60: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
9e70: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
9e80: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
9e90: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
9ea0: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
9eb0: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
9ee0: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
9ef0: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
9f00: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
9f10: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
9f20: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
9f30: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
9f40: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
9f50: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
9f60: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
9f70: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
9f80: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
9f90: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
9fa0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
9fb0: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
9fc0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
9fd0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
9fe0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
9ff0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
a000: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
a010: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
a020: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
a030: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
a040: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
a050: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
a060: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
a070: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
a080: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
a090: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
a0a0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a0b0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a0c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a0d0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
a0e0: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
a0f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
a100: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
a110: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a120: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
a130: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
a140: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
a150: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
a160: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
a170: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
a180: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
a190: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a1a0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
a1b0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
a1c0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
a1d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a1e0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
a1f0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
a200: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a210: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a220: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a230: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
a240: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a250: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
a260: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
a270: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
a280: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a290: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a2a0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
a2b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a2c0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
a2d0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
a2e0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
a2f0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
a300: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
a310: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
a320: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
a330: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
a340: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
a350: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
a360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
a370: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20  xpr->op==TK_EQ. 
a380: 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
a390: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a3a0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
a3b0: 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
a3c0: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
a3d0: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
a3e0: 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29  itive).        )
a3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
a400: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20  m->eOperator |= 
a410: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
a420: 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57      eExtraOp = W
a430: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
a440: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
a450: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
a460: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
a470: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
a480: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
a490: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
a4a0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
a4b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
a4c0: 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e  ipCollate(pDup->
a4d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
a4e0: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
a4f0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
a500: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
a510: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a520: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a530: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
a540: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
a550: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
a560: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
a570: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
a580: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
a590: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
a5a0: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
a5b0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
a5c0: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
a5d0: 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73  r = (operatorMas
a5e0: 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45  k(pDup->op) + eE
a5f0: 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b  xtraOp) & opMask
a600: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
a610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a620: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
a630: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
a640: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
a650: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
a660: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
a670: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
a680: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
a690: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
a6a0: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
a6b0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
a6c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
a6d0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
a6e0: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
a6f0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
a700: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
a710: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
a720: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
a730: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
a740: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
a750: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
a760: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
a770: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
a780: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
a790: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
a7a0: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
a7b0: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
a7c0: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
a7d0: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
a7e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
a7f0: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
a800: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
a810: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
a820: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
a830: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
a840: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
a850: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
a860: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
a870: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
a880: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
a890: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
a8a0: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
a8b0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
a8c0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
a8d0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
a8e0: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
a8f0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
a900: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
a910: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
a920: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
a930: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a940: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
a950: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
a960: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
a970: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
a980: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
a990: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
a9a0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
a9b0: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
a9c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a9f0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
aa00: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
aa30: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
aa40: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
aa50: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
aa60: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
aa70: 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  xpr, pExpr);.   
aa80: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
aa90: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
aaa0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
aab0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
aac0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
aad0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
aae0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
aaf0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
ab00: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
ab10: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
ab20: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
ab30: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
ab40: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
ab50: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
ab60: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
ab70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
ab80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
ab90: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
aba0: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
abb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
abc0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
abd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
abe0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
abf0: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
ac00: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
ac10: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
ac20: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
ac30: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
ac40: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
ac50: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
ac60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
ac70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ac80: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
ac90: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
aca0: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
acb0: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
acc0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
acd0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
ace0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
acf0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ad00: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
ad10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
ad20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
ad30: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
ad40: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
ad50: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
ad60: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
ad70: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
ad80: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
ad90: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
ada0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
adb0: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
adc0: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
add0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
ade0: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
adf0: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
ae00: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
ae10: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
ae20: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
ae30: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
ae40: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
ae50: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
ae60: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
ae70: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
ae80: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
ae90: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
aea0: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
aeb0: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
aec0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
aed0: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
aee0: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
aef0: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
af00: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
af10: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
af20: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
af30: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
af40: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
af50: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
af60: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
af70: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
af80: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
af90: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
afa0: 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
afb0: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
afc0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
afd0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
afe0: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
aff0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b000: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b010: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b020: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b030: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b040: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b050: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b060: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
b070: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b080: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
b090: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
b0a0: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
b0b0: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
b0c0: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
b0d0: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
b0e0: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
b0f0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
b100: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
b110: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
b120: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
b130: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b140: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
b150: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
b160: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
b170: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
b180: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
b190: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
b1a0: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
b1b0: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
b1c0: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
b1d0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
b1e0: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
b1f0: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
b200: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
b210: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
b220: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
b230: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
b240: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
b250: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
b260: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
b270: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
b280: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
b290: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lete = 0;.      
b2a0: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
b2b0: 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
b2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20      }.      *pC 
b2d0: 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  = c + 1;.    }. 
b2e0: 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
b2f0: 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  z = noCase ? "NO
b300: 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
b310: 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  ;.    sCollSeqNa
b320: 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e  me.n = 6;.    pN
b330: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b340: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
b350: 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
b360: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
b370: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b380: 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  GE, .           
b390: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b3a0: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b3b0: 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f  e,pNewExpr1,&sCo
b3c0: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b3d0: 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
b3e0: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b3f0: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b400: 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr1, pExpr);.  
b410: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
b420: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b430: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
b440: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b450: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b460: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
b470: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b480: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b490: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
b4a0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b4b0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b4c0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
b4d0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
b4e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b4f0: 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
b500: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b510: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b520: 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f  e,pNewExpr2,&sCo
b530: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b540: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
b550: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b560: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b570: 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr2, pExpr);.  
b580: 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72    idxNew2 = wher
b590: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b5a0: 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45  C, pNewExpr2, TE
b5b0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b5c0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b5d0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d  stcase( idxNew2=
b5e0: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b5f0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b600: 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
b610: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b620: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
b630: 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
b640: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
b650: 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew1].iParent = i
b660: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57  dxTerm;.      pW
b670: 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50  C->a[idxNew2].iP
b680: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
b690: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
b6a0: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  hild = 2;.    }.
b6b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
b6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
b6d0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
b6e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b700: 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d  .  /* Add a WO_M
b710: 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74  ATCH auxiliary t
b720: 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74  erm to the const
b730: 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65  raint set if the
b740: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78  .  ** current ex
b750: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
b760: 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e  he form:  column
b770: 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a   MATCH expr..  *
b780: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
b790: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
b7a0: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
b7b0: 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72  hods of.  ** vir
b7c0: 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68  tual tables.  Th
b7d0: 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f  e native query o
b7e0: 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f  ptimizer does no
b7f0: 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74  t attempt.  ** t
b800: 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69  o do anything wi
b810: 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f  th MATCH functio
b820: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ns..  */.  if( i
b830: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70  sMatchOfColumn(p
b840: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
b850: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70   idxNew;.    Exp
b860: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
b870: 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  t;.    WhereTerm
b880: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20   *pNewTerm;.    
b890: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f  Bitmask prereqCo
b8a0: 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72  lumn, prereqExpr
b8b0: 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ;..    pRight = 
b8c0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b8d0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
b8e0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
b8f0: 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
b900: 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78  pr;.    prereqEx
b910: 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  pr = exprTableUs
b920: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
b930: 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65  ight);.    prere
b940: 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61  qColumn = exprTa
b950: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
b960: 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  t, pLeft);.    i
b970: 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26  f( (prereqExpr &
b980: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d   prereqColumn)==
b990: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
b9a0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
b9b0: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
b9c0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b9d0: 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20   TK_MATCH, .    
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c            0, sql
ba00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ba10: 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a  pRight, 0), 0);.
ba20: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
ba30: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
ba40: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
ba50: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
ba60: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
ba70: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
ba80: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew==0 );.      p
ba90: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
baa0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
bab0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
bac0: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45  qRight = prereqE
bad0: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  xpr;.      pNewT
bae0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
baf0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
bb00: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
bb10: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
bb20: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
bb30: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb40: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
bb50: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
bb60: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
bb70: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
bb80: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
bb90: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
bba0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
bbb0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
bbc0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
bbd0: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
bbe0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
bbf0: 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
bc00: 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
bc10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
bc20: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
bc30: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
bc40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
bc50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57  _OR_STAT4.  /* W
bc60: 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33  hen sqlite_stat3
bc70: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
bc80: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20  is available an 
bc90: 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a  operator of the.
bca0: 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20    ** form "x IS 
bcb0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f  NOT NULL" can so
bcc0: 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75  metimes be evalu
bcd0: 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69  ated more effici
bce0: 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78  ently.  ** as "x
bcf0: 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e  >NULL" if x is n
bd00: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
bd10: 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63  IMARY KEY.  So c
bd20: 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20  onstruct a.  ** 
bd30: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20  virtual term of 
bd40: 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a  that form..  **.
bd50: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
bd60: 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
bd70: 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77  must be tagged w
bd80: 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20  ith TERM_VNULL. 
bd90: 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f   This.  ** TERM_
bda0: 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73  VNULL tag will s
bdb0: 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d  uppress the not-
bdc0: 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68  null check at th
bdd0: 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
bde0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57   of the loop.  W
bdf0: 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f  ithout the TERM_
be00: 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20  VNULL flag, the 
be10: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
be20: 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  t.  ** the start
be30: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
be40: 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65  l prevent any re
be50: 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  sults from being
be60: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
be70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
be80: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
be90: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
bea0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
beb0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
bec0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  ->iColumn>=0.   
bed0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
bee0: 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
bef0: 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20  E_Stat3).  ){.  
bf00: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
bf10: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
bf20: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
bf30: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
bf40: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
bf50: 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20  *pNewTerm;..    
bf60: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
bf70: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bf80: 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_GT,.         
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
bfb0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c  p(db, pLeft, 0),
bfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
bfe0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bff0: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
c000: 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64   0), 0);..    id
c010: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c020: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
c030: 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  ewExpr,.        
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55        TERM_VIRTU
c060: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  AL|TERM_DYNAMIC|
c070: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20  TERM_VNULL);.   
c080: 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20   if( idxNew ){. 
c090: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20       pNewTerm = 
c0a0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
c0b0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c0c0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
c0d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c0e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
c0f0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
c100: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
c110: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
c120: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
c130: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
c140: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a  erator = WO_GT;.
c150: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c160: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
c170: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
c180: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c190: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
c1a0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
c1b0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
c1c0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
c1d0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c1e0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
c1f0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
c200: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
c210: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
c220: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
c230: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
c240: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
c250: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
c260: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
c270: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
c280: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
c290: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
c2a0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
c2b0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
c2c0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
c2d0: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ht;.}../*.** Thi
c2e0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
c2f0: 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20  hes pList for a 
c300: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
c310: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
c320: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
c330: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
c340: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
c350: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
c360: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
c370: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
c380: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
c390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
c3a0: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
c3b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c3c0: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
c3d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3f0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
c400: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c410: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
c420: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
c430: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
c440: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
c450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c460: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
c470: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
c480: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
c490: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
c4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c4b0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
c4c0: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
c4d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
c500: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
c510: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
c520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c530: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
c540: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
c550: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
c560: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c570: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
c580: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
c590: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
c5a0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
c5b0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
c5c0: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
c5d0: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
c5e0: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
c5f0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
c600: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
c610: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
c620: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
c630: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
c640: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
c650: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
c660: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
c670: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
c680: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
c690: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c6a0: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
c6b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c6c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
c6d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
c6e0: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
c6f0: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
c700: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
c710: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
c720: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
c730: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
c740: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68   redundant if th
c750: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
c760: 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20  ins some subset 
c770: 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  of.** columns th
c780: 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e  at are unique an
c790: 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  d non-null..*/.s
c7a0: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
c7b0: 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
c7c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
c7e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c7f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
c800: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
c810: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
c820: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
c830: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
c840: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
c850: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
c860: 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
c870: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
c880: 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
c890: 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
c8a0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
c8b0: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
c8c0: 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
c8f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
c900: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
c910: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
c920: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
c930: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
c940: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
c950: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
c960: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
c970: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
c980: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
c990: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
c9a0: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
c9b0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
c9c0: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
c9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
c9e0: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
c9f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
ca00: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
ca10: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
ca20: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
ca30: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
ca40: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
ca50: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
ca60: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
ca70: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
ca80: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
ca90: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
caa0: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
cab0: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
cac0: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
cad0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
cae0: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
caf0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
cb00: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
cb10: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
cb20: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
cb30: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
cb40: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
cb50: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
cb60: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
cb70: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
cb80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
cb90: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
cba0: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
cbb0: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
cbc0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
cbd0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
cbe0: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
cbf0: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
cc00: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
cc10: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
cc20: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
cc30: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
cc40: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
cc50: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
cc60: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
cc70: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
cc80: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
cc90: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
cca0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
ccb0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
ccc0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
ccd0: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
cce0: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
ccf0: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
cd00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
cd10: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
cd20: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
cd30: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
cd40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
cd50: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
cd60: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
cd70: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
cd80: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
cd90: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
cda0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
cdb0: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
cdc0: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
cdd0: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
cde0: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
cdf0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
ce00: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
ce10: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ce20: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ce30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
ce40: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
ce50: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
ce60: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
ce70: 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  i<pIdx->nKeyCol;
ce80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   i++){.      i16
ce90: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
cea0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
ceb0: 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d   if( 0==findTerm
cec0: 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f  (pWC, iBase, iCo
ced0: 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  l, ~(Bitmask)0, 
cee0: 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a  WO_EQ, pIdx) ){.
cef0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
cf00: 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43  Col = findIndexC
cf10: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
cf20: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
cf30: 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  x, i);.        i
cf40: 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
cf50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cf60: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
cf70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
cf80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
cfa0: 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  i==pIdx->nKeyCol
cfb0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
cfc0: 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20  s index implies 
cfd0: 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
cfe0: 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72  T qualifier is r
cff0: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20  edundant. */.   
d000: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d010: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d020: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73   0;.}.../*.** Es
d030: 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
d040: 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
d050: 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
d060: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  2..*/.static Log
d070: 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73  Est estLog(LogEs
d080: 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 4e  t N){.  return N
d090: 3c 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c 69 74  <=10 ? 0 : sqlit
d0a0: 65 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20 33 33  e3LogEst(N) - 33
d0b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
d0c0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
d0d0: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
d0e0: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
d0f0: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
d100: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
d110: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
d120: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
d130: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
d140: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
d150: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
d160: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
d170: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
d180: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
d190: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d1a0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d1b0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48  E) && defined(WH
d1c0: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
d1d0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  ).static void TR
d1e0: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73  ACE_IDX_INPUTS(s
d1f0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d200: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
d210: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
d220: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
d230: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
d240: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
d250: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
d260: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d270: 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20  constraint[%d]: 
d280: 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64  col=%d termid=%d
d290: 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25   op=%d usabled=%
d2a0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
d2b0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
d2c0: 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
d2d0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
d2e0: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
d2f0: 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70  Offset,.       p
d300: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
d310: 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  .op,.       p->a
d320: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
d330: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  able);.  }.  for
d340: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65  (i=0; i<p->nOrde
d350: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rBy; i++){.    s
d360: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d370: 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d  f("  orderby[%d]
d380: 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64  : col=%d desc=%d
d390: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
d3a0: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
d3b0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  y[i].iColumn,.  
d3c0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
d3d0: 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d  [i].desc);.  }.}
d3e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
d3f0: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73  CE_IDX_OUTPUTS(s
d400: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d410: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
d420: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
d430: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
d440: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
d450: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
d460: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
d470: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d480: 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
d490: 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
d4a0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
d4b0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d4c0: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
d4d0: 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
d4e0: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
d4f0: 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
d500: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d510: 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
d520: 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
d530: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
d540: 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
d550: 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
d560: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
d570: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
d580: 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
d590: 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
d5a0: 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
d5b0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
d5c0: 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
d5d0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
d5e0: 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ost);.  sqlite3D
d5f0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
d600: 74 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64  timatedRows=%lld
d610: 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
d620: 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dRows);.}.#else.
d630: 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
d640: 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
d650: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
d660: 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
d670: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d680: 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
d690: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NDEX./*.** Retur
d6a0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48  n TRUE if the WH
d6b0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
d6c0: 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f  pTerm is of a fo
d6d0: 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63  rm where it.** c
d6e0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74  ould be used wit
d6f0: 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63  h an index to ac
d700: 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d  cess pSrc, assum
d710: 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ing an appropria
d720: 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73  te.** index exis
d730: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
d740: 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  nt termCanDriveI
d750: 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72  ndex(.  WhereTer
d760: 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20  m *pTerm,       
d770: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
d780: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63  clause term to c
d790: 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74  heck */.  struct
d7a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
d7b0: 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  Src,     /* Tabl
d7c0: 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  e we are trying 
d7d0: 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42  to access */.  B
d7e0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d800: 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72   Tables in outer
d810: 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f   loops of the jo
d820: 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  in */.){.  char 
d830: 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  aff;.  if( pTerm
d840: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53  ->leftCursor!=pS
d850: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65  rc->iCursor ) re
d860: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
d870: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
d880: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65  & WO_EQ)==0 ) re
d890: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
d8a0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
d8b0: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
d8c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d8d0: 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  f( pTerm->u.left
d8e0: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
d8f0: 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
d900: 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
d910: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
d920: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
d930: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
d940: 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
d950: 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
d960: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
d970: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
d980: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d990: 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
d9a0: 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  NDEX./*.** Gener
d9b0: 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73  ate code to cons
d9c0: 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
d9d0: 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75  object for an au
d9e0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a  tomatic index.**
d9f0: 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
da00: 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62  he WhereLevel ob
da10: 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74  ject pLevel so t
da20: 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hat the code gen
da30: 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20  erator.** makes 
da40: 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d  use of the autom
da50: 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  atic index..*/.s
da60: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74  tatic void const
da70: 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
da80: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
da90: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
daa0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
dab0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
dac0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
dad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dae0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
daf0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
db00: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
db10: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
db20: 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68  e term to get th
db30: 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a  e next index */.
db40: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
db50: 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
db60: 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
db70: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
db80: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  ailable */.  Whe
db90: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
dba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
dbb0: 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65  e new index here
dbc0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65   */.){.  int nKe
dbd0: 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
dbe0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dbf0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
dc00: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64   constructed ind
dc10: 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
dc20: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
dc30: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
dc40: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
dc50: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
dc60: 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b  ereTerm *pWCEnd;
dc70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
dc80: 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
dc90: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcb0: 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   Object describi
dcc0: 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
dcd0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
dce0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
dcf0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
dd00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
dd10: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
dd20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
dd30: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
dd40: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
dd50: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
dd60: 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a  on bypass jump *
dd70: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  /.  Table *pTabl
dd80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
dd90: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
dda0: 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ng indexed */.  
ddb0: 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ddd0: 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  op of the index 
dde0: 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  fill loop */.  i
ddf0: 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
de00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
de10: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
de20: 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  n index record *
de30: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65  /* Column counte
de60: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  r */.  int i;   
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
de90: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69  er */.  int mxBi
dea0: 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tCol;           
deb0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
dec0: 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63  olumn in pSrc->c
ded0: 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c  olUsed */.  Coll
dee0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
def0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
df00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
df10: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   on a column */.
df20: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
df30: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
df40: 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74   The Loop object
df50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74   */.  char *zNot
df60: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
df70: 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65    /* Extra space
df80: 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70   on the end of p
df90: 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  Idx */.  Bitmask
dfa0: 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20   idxCols;       
dfb0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
dfc0: 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66  f columns used f
dfd0: 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20  or indexing */. 
dfe0: 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f   Bitmask extraCo
dff0: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ls;          /* 
e000: 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69  Bitmap of additi
e010: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  onal columns */.
e020: 20 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67    u8 sentWarning
e030: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
e040: 20 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e   True if a warnn
e050: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73  ing has been iss
e060: 75 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e  ued */..  /* Gen
e070: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b  erate code to sk
e080: 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61  ip over the crea
e090: 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  tion and initial
e0a0: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ization of the. 
e0b0: 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   ** transient in
e0c0: 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73  dex on 2nd and s
e0d0: 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
e0e0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ions of the loop
e0f0: 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  . */.  v = pPars
e100: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
e110: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64  rt( v!=0 );.  ad
e120: 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
e130: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
e140: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
e150: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
e160: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
e170: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
e180: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
e190: 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
e1a0: 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
e1b0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
e1c0: 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f  ints */.  nKeyCo
e1d0: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  l = 0;.  pTable 
e1e0: 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
e1f0: 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
e200: 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
e210: 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
e220: 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c  pWLoop;.  idxCol
e230: 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
e240: 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
e250: 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
e260: 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
e270: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
e280: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
e290: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
e2a0: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
e2b0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
e2c0: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
e2d0: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
e2e0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
e2f0: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
e300: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
e310: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
e320: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
e330: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
e340: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
e350: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
e360: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e370: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
e380: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
e390: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
e3a0: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
e3b0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
e3c0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
e3d0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
e3e0: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
e3f0: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
e400: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
e410: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
e420: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
e430: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
e440: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
e450: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
e460: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
e470: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
e480: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
e490: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
e4a0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
e4b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e4c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
e4d0: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
e4e0: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
e4f0: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
e500: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
e510: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
e520: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
e530: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
e540: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e560: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
e570: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
e580: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
e590: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
e5a0: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
e5b0: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
e5c0: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
e5d0: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
e5e0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
e5f0: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
e600: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
e610: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
e620: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
e630: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
e640: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
e650: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
e660: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
e670: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
e680: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
e690: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
e6a0: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
e6b0: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
e6c0: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
e6d0: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
e6e0: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
e6f0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
e700: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
e710: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
e720: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
e730: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
e740: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
e750: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
e760: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
e770: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
e780: 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e   (pTable->nCol >
e790: 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31  = BMS-1) ? BMS-1
e7a0: 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   : pTable->nCol;
e7b0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
e7c0: 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
e7d0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
e7e0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
e7f0: 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
e800: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
e810: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
e820: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
e830: 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a  i) ) nKeyCol++;.
e840: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
e850: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
e860: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
e870: 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c  nKeyCol += pTabl
e880: 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
e890: 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e  1;.  }.  pLoop->
e8a0: 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
e8b0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
e8c0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20  RE_IDX_ONLY;..  
e8d0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
e8e0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
e8f0: 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
e900: 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d  ndex */.  pIdx =
e910: 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
e920: 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72  IndexObject(pPar
e930: 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b  se->db, nKeyCol+
e940: 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29  1, 0, &zNotUsed)
e950: 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  ;.  if( pIdx==0 
e960: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f  ) return;.  pLoo
e970: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
e980: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
e990: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
e9a0: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
e9b0: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
e9c0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
e9d0: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
e9e0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
e9f0: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
ea00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
ea10: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
ea20: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
ea30: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
ea40: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
ea50: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
ea60: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
ea70: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
ea80: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
ea90: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
eaa0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
eab0: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
eac0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ead0: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
eae0: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
eaf0: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
eb00: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
eb10: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
eb20: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
eb30: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
eb40: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
eb50: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
eb60: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
eb70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
eb80: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
eb90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
eba0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
ebb0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
ebc0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
ebd0: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f   ALWAYS(pColl) ?
ebe0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
ebf0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
ec00: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
ec10: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
ec20: 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70  t( (u32)n==pLoop
ec30: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
ec40: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
ec50: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
ec60: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
ec70: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
ec80: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
ec90: 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
eca0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
ecb0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
ecc0: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
ecd0: 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20  MASKBIT(i) ){.  
ece0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
ecf0: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
ed00: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
ed10: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
ed20: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
ed30: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
ed40: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
ed50: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f  BMS-1) ){.    fo
ed60: 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61  r(i=BMS-1; i<pTa
ed70: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
ed80: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
ed90: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
eda0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
edb0: 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
edc0: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
edd0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
ede0: 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70  ==nKeyCol );.  p
edf0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
ee00: 20 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61   = -1;.  pIdx->a
ee10: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
ee20: 52 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  RY";..  /* Creat
ee30: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
ee40: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
ee50: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
ee60: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
ee70: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
ee80: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
ee90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
eea0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
eeb0: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
eec0: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
eed0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
eee0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
eef0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
ef00: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
ef10: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
ef20: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
ef30: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
ef40: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
ef50: 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f  tent */.  addrTo
ef60: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
ef70: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
ef80: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
ef90: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
efa0: 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f  ge(v);.  regReco
efb0: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
efc0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
efd0: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
efe0: 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
eff0: 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
f000: 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
f010: 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  rd, 0, 0, 0, 0);
f020: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f030: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
f040: 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  sert, pLevel->iI
f050: 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  dxCur, regRecord
f060: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f070: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
f080: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
f090: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f0a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f0b0: 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  t, pLevel->iTabC
f0c0: 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20  ur, addrTop+1); 
f0d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f0e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
f0f0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
f100: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
f110: 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
f120: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f130: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
f140: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
f150: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
f160: 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
f170: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
f180: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
f190: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
f1a0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f1b0: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
f1c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f1d0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
f1e0: 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
f1f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f200: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
f210: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
f220: 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
f230: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f240: 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
f250: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
f260: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
f270: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
f280: 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
f290: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
f2a0: 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
f2b0: 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
f2c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
f2d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
f2e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
f2f0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
f300: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
f310: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f320: 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
f330: 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
f340: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
f350: 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
f360: 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
f370: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
f380: 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
f390: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
f3a0: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
f3b0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
f3c0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
f3d0: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
f3e0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
f3f0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
f400: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
f410: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f420: 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
f430: 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
f440: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
f450: 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
f460: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
f470: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
f480: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
f490: 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
f4a0: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
f4b0: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
f4c0: 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
f4d0: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
f4e0: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
f4f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
f500: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
f510: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
f520: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
f530: 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
f540: 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
f550: 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
f560: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
f570: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
f580: 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
f590: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
f5a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
f5b0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
f5c0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
f5d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f5e0: 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  _ALL );.    if( 
f5f0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
f600: 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c  r & ~(WO_ISNULL|
f610: 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20  WO_EQUIV))==0 ) 
f620: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
f630: 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
f640: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
f650: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
f660: 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
f670: 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
f680: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
f690: 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
f6a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
f6b0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
f6c0: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
f6d0: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
f6e0: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
f6f0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
f700: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
f710: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
f720: 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
f730: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
f740: 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
f750: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
f760: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
f770: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
f780: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
f790: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
f7a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
f7b0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
f7c0: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
f7d0: 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
f7e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f7f0: 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
f800: 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
f810: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
f820: 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
f830: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
f840: 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
f850: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
f860: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
f870: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
f880: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
f8b0: 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
f8c0: 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
f8d0: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
f8f0: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
f900: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
f910: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
f920: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
f930: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f940: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
f950: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
f960: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
f970: 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
f980: 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
f990: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
f9a0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
f9b0: 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64  .  ** many field
f9c0: 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
f9d0: 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
f9e0: 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
f9f0: 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e  x from.  ** chan
fa00: 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
fa10: 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
fa20: 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
fa30: 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e  order to.  ** in
fa40: 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
fa50: 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ields..  */.  pI
fa60: 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
fa70: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fa80: 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
fa90: 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f  Info[1];.  pIdxO
faa0: 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
fab0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
fac0: 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
fad0: 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61  s[nTerm];.  pUsa
fae0: 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
faf0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
fb00: 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
fb10: 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
fb20: 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  By];.  *(int*)&p
fb30: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
fb40: 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
fb50: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
fb60: 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
fb70: 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
fb80: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fb90: 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
fba0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
fbb0: 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
fbc0: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
fbd0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
fbe0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
fbf0: 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
fc00: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
fc10: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fc20: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
fc30: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
fc40: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f     pUsage;..  fo
fca0: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
fcb0: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
fcc0: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
fcd0: 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20  +){.    u8 op;. 
fce0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
fcf0: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
fd00: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
fd10: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
fd20: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
fd30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
fd40: 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
fd50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
fd60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd70: 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
fd80: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
fd90: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
fda0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
fdb0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
fdc0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
fdd0: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
fde0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
fdf0: 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
fe00: 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  UIV))==0 ) conti
fe10: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
fe20: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
fe30: 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
fe40: 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
fe50: 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
fe60: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
fe70: 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
fe80: 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
fe90: 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
fea0: 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
feb0: 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
fec0: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
fed0: 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
fee0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
fef0: 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
ff00: 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
ff10: 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
ff20: 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
ff30: 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
ff40: 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
ff50: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
ff60: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
ff70: 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
ff80: 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
ff90: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
ffa0: 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
ffb0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ffc0: 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
ffd0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
ffe0: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
fff0: 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
10000 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10010 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
10020 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
10030 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10040 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
10050 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
10060 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10070 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
10080 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
10090 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
100a0 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
100b0 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
100c0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
100d0 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
100e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
100f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
10100 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
10110 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
10120 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
10130 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
10140 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
10150 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
10160 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
10170 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
10180 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
10190 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
101a0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
101b0 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
101c0 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
101d0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
101e0 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
101f0 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
10200 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
10210 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
10220 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
10230 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
10240 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
10250 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
10260 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
10270 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
10280 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
10290 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
102a0 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
102b0 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
102c0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
102d0 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
102e0 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
102f0 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
10300 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
10310 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
10320 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
10330 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
10340 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
10350 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
10360 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
10370 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
10380 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
10390 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
103a0 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
103b0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
103c0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
103d0 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
103e0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
103f0 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
10400 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
10410 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
10420 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
10430 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
10440 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
10450 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
10460 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
10470 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
10480 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
10490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
104a0 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
104b0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
104c0 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
104d0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
104e0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
104f0 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
10500 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
10510 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
10520 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
10530 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
10540 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
10550 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
10560 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
10570 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
10580 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
10590 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
105a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
105b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
105c0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
105d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
105e0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
105f0 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
10600 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
10610 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10620 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
10630 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
10640 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
10650 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10660 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
10670 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
10680 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
10690 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
106a0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
106b0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
106c0 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
106d0 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
106e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
106f0 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
10700 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
10710 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
10720 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
10730 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10740 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10750 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
10760 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
10770 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
10780 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
10790 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
107a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
107b0 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
107c0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
107d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
107e0 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
107f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10800 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
10810 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
10820 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
10830 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
10840 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
10850 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
10860 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
10870 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
10880 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
10890 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
108a0 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
108b0 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
108c0 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61   pVal.**    aSta
108d0 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
108e0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
108f0 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a  ual to pVal.**.*
10900 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10910 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
10920 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10930 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
10940 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
10960 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10970 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
10980 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
10990 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
109a0 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
109b0 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  f */.  UnpackedR
109c0 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20  ecord *pRec,    
109d0 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20     /* Vector of 
109e0 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64  values to consid
109f0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
10a00 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
10a10 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
10a20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
10a30 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
10a40 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
10a50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
10a60 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
10a70 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
10a80 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61    IndexSample *a
10a90 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
10aa0 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43  Sample;.  int iC
10ab0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
10ac0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
10ad0 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73  f required stats
10ae0 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20   in anEq[] etc. 
10af0 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20  */.  int iMin = 
10b00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10b10 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
10b20 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74  ple not yet test
10b30 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  ed */.  int i = 
10b40 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20  pIdx->nSample;  
10b50 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
10b60 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68  sample larger th
10b70 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
10b80 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  Rec */.  int iTe
10b90 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
10ba0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d       /* Next sam
10bb0 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ple to test */. 
10bc0 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10be0 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  Result of compar
10bf0 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ison operation *
10c00 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
10c10 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
10c20 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72  _PARAMETER( pPar
10c30 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  se );.#endif.  a
10c40 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29  ssert( pRec!=0 )
10c50 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d  ;.  iCol = pRec-
10c60 3e 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61  >nField - 1;.  a
10c70 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61  ssert( pIdx->nSa
10c80 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  mple>0 );.  asse
10c90 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  rt( pRec->nField
10ca0 3e 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  >0 && iCol<pIdx-
10cb0 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20  >nSampleCol );. 
10cc0 20 64 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d   do{.    iTest =
10cd0 20 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20   (iMin+i)/2;.   
10ce0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
10cf0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
10d00 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e  aSample[iTest].n
10d10 2c 20 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d  , aSample[iTest]
10d20 2e 70 2c 20 70 52 65 63 2c 20 30 29 3b 0a 20 20  .p, pRec, 0);.  
10d30 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
10d40 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
10d50 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
10d60 20 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b        i = iTest;
10d70 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
10d80 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29   res && iMin<i )
10d90 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10da0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
10db0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
10dc0 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63   statements chec
10dd0 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72  k that the binar
10de0 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20  y search code.  
10df0 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74  ** above found t
10e00 68 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e  he right answer.
10e10 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
10e20 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74  es no purpose ot
10e30 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f  her.  ** than to
10e40 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65   invoke the asse
10e50 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  rts.  */.  if( r
10e60 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
10e70 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74  If (res==0) is t
10e80 72 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65  rue, then sample
10e90 20 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61   $i must be equa
10ea0 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20  l to pRec */.   
10eb0 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d   assert( i<pIdx-
10ec0 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20  >nSample );.    
10ed0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
10ee0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
10ef0 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
10f00 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
10f10 70 52 65 63 2c 20 30 29 0a 20 20 20 20 20 20 20  pRec, 0).       
10f20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
10f30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10f40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
10f50 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63   Otherwise, pRec
10f60 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72   must be smaller
10f70 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20   than sample $i 
10f80 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a  and larger than.
10f90 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24      ** sample ($
10fa0 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  i-1).  */.    as
10fb0 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
10fc0 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
10fd0 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52   || sqlite3VdbeR
10fe0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
10ff0 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
11000 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 2c 20 30  le[i].p, pRec, 0
11010 29 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  )>0.         || 
11020 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
11030 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
11040 61 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20  assert( i==0.   
11050 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
11060 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
11070 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  e(aSample[i-1].n
11080 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70  , aSample[i-1].p
11090 2c 20 70 52 65 63 2c 20 30 29 3c 30 0a 20 20 20  , pRec, 0)<0.   
110a0 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
110b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
110c0 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d );.  }.#endif 
110d0 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
110e0 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41  DEBUG */..  /* A
110f0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53  t this point, aS
11100 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
11110 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61  first sample tha
11120 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
11130 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20  n.  ** or equal 
11140 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20  to pVal.  Or if 
11150 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
11160 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c  , then all sampl
11170 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a  es are less.  **
11180 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20   than pVal.  If 
11190 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c  aSample[i]==pVal
111a0 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20  , then res==0.. 
111b0 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   */.  if( res==0
111c0 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d   ){.    aStat[0]
111d0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
111e0 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53  Lt[iCol];.    aS
111f0 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[1] = aSample
11200 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a  [i].anEq[iCol];.
11210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
11220 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70  wcnt iLower, iUp
11230 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
11240 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
11250 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
11260 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
11270 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c  ple[0].anLt[iCol
11280 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
11290 20 20 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20      i64 nRow0 = 
112a0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49  sqlite3LogEstToI
112b0 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f  nt(pIdx->aiRowLo
112c0 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20  gEst[0]);.      
112d0 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78  iUpper = i>=pIdx
112e0 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f 77  ->nSample ? nRow
112f0 30 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  0 : aSample[i].a
11300 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  nLt[iCol];.     
11310 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
11320 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c  e[i-1].anEq[iCol
11330 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  ] + aSample[i-1]
11340 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
11350 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20   }.    aStat[1] 
11360 3d 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  = (pIdx->nKeyCol
11370 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41  >iCol ? pIdx->aA
11380 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b  vgEq[iCol] : 1);
11390 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
113a0 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
113b0 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
113c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
113d0 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
113e0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
113f0 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
11400 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
11410 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
11420 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
11430 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
11440 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
11450 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a  r + iGap;.  }.}.
11460 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11470 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11480 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
11490 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
114a0 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74  LL, pTerm is a t
114b0 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65  erm that provide
114c0 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f  s an upper or lo
114d0 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20  wer.** bound on 
114e0 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69  a range scan. Wi
114f0 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e  thout considerin
11500 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65  g pTerm, it is e
11510 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61  stimated .** tha
11520 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20  t the scan will 
11530 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e  visit nNew rows.
11540 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
11550 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
11560 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74  r.** estimated t
11570 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74  o be visited aft
11580 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20  er taking pTerm 
11590 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a  into account..**
115a0 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
115b0 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
115c0 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  fied a likelihoo
115d0 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68  d() value for th
115e0 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e  is term,.** then
115f0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
11600 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68  e is the likelih
11610 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62  ood multiplied b
11620 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
11630 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f  ** input rows. O
11640 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66  therwise, this f
11650 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
11660 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20  that an "IS NOT 
11670 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61  NULL" term.** ha
11680 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  s a likelihood o
11690 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20  f 0.50, and any 
116a0 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b  other term a lik
116b0 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e  elihood of 0.25.
116c0 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
116d0 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  t whereRangeAdju
116e0 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  st(WhereTerm *pT
116f0 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77  erm, LogEst nNew
11700 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74  ){.  LogEst nRet
11710 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70   = nNew;.  if( p
11720 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  Term ){.    if( 
11730 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
11740 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  <=0 ){.      nRe
11750 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
11760 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65  hProb;.    }else
11770 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
11780 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
11790 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  L)==0 ){.      n
117a0 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  Ret -= 20;      
117b0 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
117c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
117d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
117e0 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 23 69  turn nRet;.}..#i
117f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11800 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
11810 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  4./* .** This fu
11820 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11830 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
11840 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
11850 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20  visited by a.** 
11860 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20  range-scan on a 
11870 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e  skip-scan index.
11880 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
11890 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
118a0 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
118b0 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , c);.**   SELEC
118c0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
118d0 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57  E a=? AND c BETW
118e0 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a  EEN ? AND ?;.**.
118f0 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e  ** Value pLoop->
11900 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c  nOut is currentl
11910 79 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  y set to the est
11920 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
11930 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65   rows .** visite
11940 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28  d for scanning (
11950 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68  a=? AND b=?). Th
11960 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75  is function redu
11970 63 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74  ces that estimat
11980 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61  e .** by some fa
11990 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20  ctor to account 
119a0 66 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45  for the (c BETWE
119b0 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72  EN ? AND ?) expr
119c0 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20  ession based.** 
119d0 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74  on the stat4 dat
119e0 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  a for the index.
119f0 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20   this scan will 
11a00 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74  be peformed mult
11a10 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28  iple .** times (
11a20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61  once for each (a
11a30 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ,b) combination 
11a40 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f  that matches a=?
11a50 29 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20  ) is dealt with 
11a60 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
11a70 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73  r..**.** It does
11a80 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e   this by scannin
11a90 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74  g through all st
11aa0 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d  at4 samples, com
11ab0 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a  paring values.**
11ac0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
11ad0 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
11ae0 72 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  r with the corre
11af0 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
11b00 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c  in each.** sampl
11b10 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72  e. If L and U ar
11b20 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
11b30 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f  samples found to
11b40 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
11b50 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65  .** equal to the
11b60 20 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   values extracte
11b70 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
11b80 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
11b90 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20  ively, and.** N 
11ba0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
11bb0 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20  ber of samples, 
11bc0 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  the pLoop->nOut 
11bd0 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65  value is adjuste
11be0 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d.** as follows:
11bf0 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20  .**.**   nOut = 
11c00 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d  nOut * ( min(U -
11c10 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a   L, 1) / N ).**.
11c20 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20  ** If pLower is 
11c30 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
11c40 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
11c50 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65  cted from the te
11c60 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20  rm, L is.** set 
11c70 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70  to zero. If pUpp
11c80 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
11c90 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
11ca0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
11cb0 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20  it,.** U is set 
11cc0 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  to N..**.** Norm
11cd0 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
11ce0 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65  ion sets *pbDone
11cf0 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74   to 1 before ret
11d00 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  urning. However,
11d10 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20  .** if no value 
11d20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
11d30 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f   from either pLo
11d40 77 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61  wer or pUpper (a
11d50 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74  nd so the.** est
11d60 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
11d70 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69  ber of rows deli
11d80 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e  vered remains un
11d90 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e  changed), *pbDon
11da0 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20  e.** is left as 
11db0 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  is..**.** If an 
11dc0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
11dd0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11de0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
11df0 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53  Otherwise, .** S
11e00 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
11e10 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
11e20 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20  geSkipScanEst(. 
11e30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11e40 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11e50 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
11e60 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11e70 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
11e80 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
11e90 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
11ea0 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
11eb0 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
11ec0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
11ed0 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
11ee0 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
11ef0 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
11f00 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
11f10 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
11f20 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65  op,    /* Update
11f30 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65   the .nOut value
11f40 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f   of this loop */
11f50 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20  .  int *pbDone  
11f60 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
11f70 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61  o true if at lea
11f80 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c  st one expr. val
11f90 75 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ue extracted */.
11fa0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
11fb0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
11fc0 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
11fd0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
11fe0 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33  e.nEq;.  sqlite3
11ff0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12000 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20  b;.  int nLower 
12010 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70  = -1;.  int nUpp
12020 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b  er = p->nSample+
12030 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  1;.  int rc = SQ
12040 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66  LITE_OK;.  u8 af
12050 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  f = p->pTable->a
12060 43 6f 6c 5b 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e  Col[ p->aiColumn
12070 5b 6e 45 71 5d 20 5d 2e 61 66 66 69 6e 69 74 79  [nEq] ].affinity
12080 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
12090 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  ll;.  .  sqlite3
120a0 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20  _value *p1 = 0; 
120b0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
120c0 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
120d0 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c   pLower */.  sql
120e0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d  ite3_value *p2 =
120f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
12100 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
12110 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20  from pUpper */. 
12120 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
12130 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pVal = 0;       
12140 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
12150 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20  ted from record 
12160 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  */..  pColl = sq
12170 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
12180 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a  eq(pParse, p->az
12190 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66  Coll[nEq]);.  if
121a0 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
121b0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
121c0 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  4ValueFromExpr(p
121d0 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70  Parse, pLower->p
121e0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
121f0 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f  f, &p1);.    nLo
12200 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  wer = 0;.  }.  i
12210 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d  f( pUpper && rc=
12220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
12240 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
12250 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d  (pParse, pUpper-
12260 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
12270 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e  aff, &p2);.    n
12280 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a  Upper = p2 ? 0 :
12290 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d   p->nSample;.  }
122a0 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32  ..  if( p1 || p2
122b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
122c0 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20     int nDiff;.  
122d0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
122e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
122f0 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
12300 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12310 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62  e3Stat4Column(db
12320 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
12330 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  p, p->aSample[i]
12340 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b  .n, nEq, &pVal);
12350 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
12360 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29  QLITE_OK && p1 )
12370 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
12380 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
12390 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20  mpare(p1, pVal, 
123a0 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
123b0 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f  if( res>=0 ) nLo
123c0 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  wer++;.      }. 
123d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
123e0 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a  ITE_OK && p2 ){.
123f0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
12400 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
12410 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43  are(p2, pVal, pC
12420 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
12430 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65  ( res>=0 ) nUppe
12440 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
12450 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28   }.    nDiff = (
12460 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29  nUpper - nLower)
12470 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c  ;.    if( nDiff<
12480 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a  =0 ) nDiff = 1;.
12490 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
124a0 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
124b0 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  r and lower boun
124c0 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64  d specified, and
124d0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d   the .    ** com
124e0 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74  parisons indicat
124f0 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  e that they are 
12500 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20  close together, 
12510 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b  use the fallback
12520 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28  .    ** method (
12530 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
12540 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34  scan visits 1/64
12550 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f   of the rows) fo
12560 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20  r estimating.   
12570 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
12580 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20  f rows visited. 
12590 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d  Otherwise, estim
125a0 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
125b0 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73  f rows.    ** us
125c0 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64  ing the method d
125d0 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
125e0 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66  header comment f
125f0 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
12600 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69  . */.    if( nDi
12610 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d  ff!=1 || pUpper=
12620 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20  =0 || pLower==0 
12630 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64  ){.      int nAd
12640 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c  just = (sqlite3L
12650 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65  ogEst(p->nSample
12660 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ) - sqlite3LogEs
12670 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20  t(nDiff));.     
12680 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20   pLoop->nOut -= 
12690 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a  nAdjust;.      *
126a0 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  pbDone = 1;.    
126b0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
126c0 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d  0, ("range skip-
126d0 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75  scan regions: %u
126e0 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20  ..%u  adjust=%d 
126f0 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12710 20 20 20 20 20 20 28 75 33 32 29 6e 4c 6f 77 65        (u32)nLowe
12720 72 2c 20 28 75 33 32 29 6e 55 70 70 65 72 2c 20  r, (u32)nUpper, 
12730 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f  nAdjust*-1, pLoo
12740 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d  p->nOut));.    }
12750 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ..  }else{.    a
12760 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d  ssert( *pbDone==
12770 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  0 );.  }..  sqli
12780 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 31 29  te3ValueFree(p1)
12790 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
127a0 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69  Free(p2);.  sqli
127b0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
127c0 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
127d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
127e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
127f0 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f  3_OR_STAT4 */../
12800 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12810 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
12820 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
12830 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
12840 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
12850 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
12860 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
12870 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
12880 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
12890 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
128a0 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
128b0 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
128c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
128d0 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
128e0 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
128f0 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
12900 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
12910 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
12920 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
12930 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
12940 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
12950 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
12960 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
12970 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
12980 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
129b0 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
129d0 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129f0 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
12a00 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
12a10 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
12a20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
12a30 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
12a40 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
12a50 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
12a60 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
12a70 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
12a80 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69  *.** The value i
12a90 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  n (pBuilder->pNe
12aa0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20  w->u.btree.nEq) 
12ab0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
12ac0 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c  the index.** col
12ad0 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74  umn subject to t
12ae0 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
12af0 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c  int. Or, equival
12b00 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65  ently, the numbe
12b10 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79  r of.** equality
12b20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74   constraints opt
12b30 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72  imized by the pr
12b40 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61  oposed index sca
12b50 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  n. For example,.
12b60 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65  ** assuming inde
12b70 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20  x p is on t1(a, 
12b80 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20  b), and the SQL 
12b90 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
12ba0 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
12bb0 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20  ERE a = ? AND b 
12bc0 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e  > ? AND b < ? ..
12bd0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
12be0 20 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73   is set to 1 (as
12bf0 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72   the range restr
12c00 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c  icted column, b,
12c10 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   is the second .
12c20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
12c30 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
12c40 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75  ). Or, if the qu
12c50 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
12c60 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
12c70 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
12c80 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
12c90 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30   nEq is set to 0
12ca0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
12cb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12cc0 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20  lled, *pnOut is 
12cd0 73 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  set to the sqlit
12ce0 65 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68  e3LogEst() of th
12cf0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
12d00 6f 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ows that the ind
12d10 65 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63  ex scan is expec
12d20 74 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74  ted to visit wit
12d30 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  hout .** conside
12d40 72 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63  ring the range c
12d50 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e  onstraints. If n
12d60 45 71 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  Eq is 0, this is
12d70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
12d80 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  ** rows in the i
12d90 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e  ndex. Assuming n
12da0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
12db0 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74  *pnOut is adjust
12dc0 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20  ed (reduced).** 
12dd0 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
12de0 68 65 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69  he range contrai
12df0 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  nts pLower and p
12e00 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e  Upper..** .** In
12e10 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
12e20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41  sqlite_stat4 ANA
12e30 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66  LYZE data, or if
12e40 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f   such data canno
12e50 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20  t be.** used, a 
12e60 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65  single range ine
12e70 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
12e80 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
12e90 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
12ea0 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69  4. .** and a pai
12eb0 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
12ec0 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72   (x>? AND x<?) r
12ed0 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63  educes the expec
12ee0 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  ted number of.**
12ef0 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
12f00 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e   a factor of 64.
12f10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
12f20 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
12f30 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12f40 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
12f50 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
12f60 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
12f70 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
12f80 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
12f90 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
12fa0 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
12fb0 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
12fc0 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
12fd0 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
12fe0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
12ff0 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
13000 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
13010 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
13020 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
13030 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
13040 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66  oop     /* Modif
13050 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20  y the .nOut and 
13060 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c  maybe .rRun fiel
13070 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ds */.){.  int r
13080 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13090 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f   int nOut = pLoo
130a0 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73  p->nOut;.  LogEs
130b0 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  t nNew;..#ifdef 
130c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
130d0 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49  AT3_OR_STAT4.  I
130e0 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
130f0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
13100 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
13110 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
13120 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  ..  if( p->nSamp
13130 6c 65 3e 30 0a 20 20 20 26 26 20 6e 45 71 3c 70  le>0.   && nEq<p
13140 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20  ->nSampleCol.   
13150 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
13160 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
13170 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29  b, SQLITE_Stat3)
13180 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 6e   .  ){.    if( n
13190 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52  Eq==pBuilder->nR
131a0 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  ecValid ){.     
131b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
131c0 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
131d0 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74 52  ->pRec;.      tR
131e0 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20  owcnt a[2];.    
131f0 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20 20    u8 aff;..     
13200 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f   /* Variable iLo
13210 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20  wer will be set 
13220 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
13230 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
13240 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20   rows in .      
13250 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  ** the index tha
13260 74 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  t are less than 
13270 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
13280 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65  of the range que
13290 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ry. The.      **
132a0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69   lower bound bei
132b0 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ng the concatena
132c0 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24  tion of $P and $
132d0 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74  L, where $P is t
132e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d  he.      ** key-
132f0 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79  prefix formed by
13300 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20   the nEq values 
13310 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
13320 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73  the nEq left-mos
13330 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
13340 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ns of the index,
13350 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76   and $L is the v
13360 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a  alue in pLower..
13370 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
13380 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20  * Or, if pLower 
13390 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61  is NULL or $L ca
133a0 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
133b0 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75  d from it (becau
133c0 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69  se it.      ** i
133d0 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76  s not a simple v
133e0 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72  ariable or liter
133f0 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c  al value), the l
13400 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
13410 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65  e.      ** range
13420 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61   is $P. Due to a
13430 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61   quirk in the wa
13440 79 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  y whereKeyStats(
13450 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20  ) works, even.  
13460 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20      ** if $L is 
13470 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65  available, where
13480 4b 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61  KeyStats() is ca
13490 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24  lled for both ($
134a0 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  P) and .      **
134b0 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65   ($P:$L) and the
134c0 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74   larger of the t
134d0 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  wo returned valu
134e0 65 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  es used..      *
134f0 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c  *.      ** Simil
13500 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20  arly, iUpper is 
13510 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  to be set to the
13520 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
13530 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
13540 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68        ** less th
13550 61 6e 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  an the upper bou
13560 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
13570 71 75 65 72 79 2e 20 57 68 65 72 65 20 74 68 65  query. Where the
13580 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20   upper bound.   
13590 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
135a0 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e  ($P) or ($P:$U).
135b0 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20   Again, even if 
135c0 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $U is available,
135d0 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20   both values.   
135e0 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20     ** of iUpper 
135f0 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f 66  are requested of
13600 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
13610 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72   and the smaller
13620 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   used..      */.
13630 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c        tRowcnt iL
13640 6f 77 65 72 3b 0a 20 20 20 20 20 20 74 52 6f 77  ower;.      tRow
13650 63 6e 74 20 69 55 70 70 65 72 3b 0a 0a 20 20 20  cnt iUpper;..   
13660 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e     if( nEq==p->n
13670 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
13680 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
13690 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
136a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
136b0 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
136c0 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
136d0 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69 74  mn[nEq]].affinit
136e0 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
136f0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c   /* Determine iL
13700 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20  ower and iUpper 
13710 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e  using ($P) only.
13720 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45   */.      if( nE
13730 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  q==0 ){.        
13740 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
13750 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c      iUpper = sql
13760 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
13770 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  p->aiRowLogEst[0
13780 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
13790 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65  .        /* Note
137a0 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c  : this call coul
137b0 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61  d be optimized a
137c0 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20  way - since the 
137d0 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74  same values must
137e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76   .        ** hav
137f0 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
13800 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65   when testing ke
13810 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75  y $P in whereEqu
13820 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f  alScanEst().  */
13830 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
13840 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
13850 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
13860 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
13870 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55  a[0];.        iU
13880 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b  pper = a[0] + a[
13890 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1];.      }..   
138a0 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c     /* If possibl
138b0 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68  e, improve on th
138c0 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74  e iLower estimat
138d0 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e  e using ($P:$L).
138e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c   */.      if( pL
138f0 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
13900 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20  int bOk;        
13910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13920 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20  rue if value is 
13930 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
13940 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  Expr */.        
13950 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
13960 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
13970 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
13980 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f  ert( (pLower->eO
13990 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
139a0 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_GE))!=0 );. 
139b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
139c0 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
139d0 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
139e0 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61   &pRec, pExpr, a
139f0 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a  ff, nEq, &bOk);.
13a00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
13a10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
13a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52   ){.          tR
13a30 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
13a40 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74        whereKeySt
13a50 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
13a60 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
13a70 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
13a80 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
13a90 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29  perator & WO_GT)
13aa0 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
13ab0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
13ac0 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72  >iLower ) iLower
13ad0 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
13ae0 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
13af0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
13b00 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
13b10 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
13b20 68 65 20 69 55 70 70 65 72 20 65 73 74 69 6d 61  he iUpper estima
13b30 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29  te using ($P:$U)
13b40 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
13b50 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Upper ){.       
13b60 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20   int bOk;       
13b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b80 54 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73  True if value is
13b90 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13ba0 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20  pExpr */.       
13bb0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
13bc0 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
13bd0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
13be0 73 65 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65  sert( (pUpper->e
13bf0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
13c00 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a  T|WO_LE))!=0 );.
13c10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13c20 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
13c30 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
13c40 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
13c50 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b  aff, nEq, &bOk);
13c60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
13c70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f  =SQLITE_OK && bO
13c80 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  k ){.          t
13c90 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
13ca0 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53         whereKeyS
13cb0 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
13cc0 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20  pRec, 1, a);.   
13cd0 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
13ce0 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65  0] + ((pUpper->e
13cf0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
13d00 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
13d10 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
13d20 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
13d30 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
13d40 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
13d50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
13d60 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
13d70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
13d80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
13da0 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
13db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
13dc0 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
13dd0 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
13de0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  er);.        }el
13df0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e  se{.          nN
13e00 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20  ew = 10;        
13e10 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
13e20 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
13e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13e40 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
13e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
13e60 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
13e70 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f    }.        pLoo
13e80 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
13e90 74 29 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  t)nOut;.        
13ea0 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
13eb0 20 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65   ("range scan re
13ec0 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 65  gions: %u..%u  e
13ed0 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
13f00 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e  , (u32)iUpper, n
13f10 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Out));.        r
13f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
13f40 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  se{.      int bD
13f50 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  one = 0;.      r
13f60 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b  c = whereRangeSk
13f70 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  ipScanEst(pParse
13f80 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
13f90 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29  , pLoop, &bDone)
13fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e  ;.      if( bDon
13fb0 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  e ) return rc;. 
13fc0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
13fd0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13fe0 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
13ff0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42  SED_PARAMETER(pB
14000 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64 69 66 0a  uilder);.#endif.
14010 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
14020 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20   || pUpper );.  
14030 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d  assert( pUpper==
14040 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74  0 || (pUpper->wt
14050 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
14060 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77  LL)==0 );.  nNew
14070 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
14080 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74  ust(pLower, nOut
14090 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
140a0 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70  eRangeAdjust(pUp
140b0 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f  per, nNew);..  /
140c0 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
140d0 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
140e0 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69  per and lower li
140f0 6d 69 74 2c 20 61 73 73 75 6d 65 20 74 68 65 20  mit, assume the 
14100 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65  range is.  ** re
14110 64 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69  duced by an addi
14120 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73  tional 75%. This
14130 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20   means that, by 
14140 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e  default, an open
14150 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67  -ended.  ** rang
14160 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f  e query (e.g. co
14170 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65  l > ?) is assume
14180 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f  d to match 1/4 o
14190 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  f the rows in th
141a0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68  e.  ** index. Wh
141b0 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e  ile a closed ran
141c0 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54  ge (e.g. col BET
141d0 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73  WEEN ? AND ?) is
141e0 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20   estimated to.  
141f0 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66  ** match 1/64 of
14200 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a   the index. */ .
14210 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20    if( pLower && 
14220 70 55 70 70 65 72 20 29 20 6e 4e 65 77 20 2d 3d  pUpper ) nNew -=
14230 20 32 30 3b 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20   20;..  nOut -= 
14240 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20 28 70  (pLower!=0) + (p
14250 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69 66 28  Upper!=0);.  if(
14260 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20   nNew<10 ) nNew 
14270 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77  = 10;.  if( nNew
14280 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e  <nOut ) nOut = n
14290 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  New;.  pLoop->nO
142a0 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
142b0 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
142c0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
142d0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
142e0 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
142f0 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
14300 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
14310 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
14320 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
14330 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
14340 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
14350 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
14360 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
14370 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
14380 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
14390 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
143a0 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
143b0 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
143c0 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
143d0 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
143e0 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
143f0 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
14400 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
14410 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
14420 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
14430 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
14440 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
14450 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
14460 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
14470 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
14480 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
14490 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
144a0 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
144b0 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
144c0 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
144d0 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
144e0 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
144f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
14500 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
14510 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
14520 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
14530 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
14540 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
14550 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
14560 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
14570 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
14580 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
14590 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
145a0 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
145b0 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
145c0 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
145d0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
145e0 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
145f0 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
14600 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14610 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
14620 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
14630 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14640 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
14650 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70  ilder,.  Expr *p
14660 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
14670 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
14680 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
14690 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
146a0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
146b0 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
146c0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
146d0 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
146e0 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
146f0 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
14700 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
14710 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
14720 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
14730 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55  u.btree.nEq;.  U
14740 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
14750 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
14760 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20  pRec;.  u8 aff; 
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14780 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
14790 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
147a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
147b0 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
147c0 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
147d0 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
147e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
147f0 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
14800 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
14810 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
14820 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 28 70   assert( nEq<=(p
14830 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 3b 0a  ->nKeyCol+1) );.
14840 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
14850 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
14860 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
14870 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14880 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
14890 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  id<nEq );..  /* 
148a0 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  If values are no
148b0 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
148c0 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
148d0 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  e index to the l
148e0 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  eft.  ** of this
148f0 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74   one, no estimat
14900 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52  e can be made. R
14910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
14920 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20  FOUND. */.  if( 
14930 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
14940 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20  lid<(nEq-1) ){. 
14950 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14960 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a  _NOTFOUND;.  }..
14970 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
14980 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
14990 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  y. The call to s
149a0 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
149b0 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20  SetValue().  ** 
149c0 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75  below would retu
149d0 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  rn the same valu
149e0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  e.  */.  if( nEq
149f0 3e 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  >p->nKeyCol ){. 
14a00 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20     *pnRow = 1;. 
14a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14a20 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20  _OK;.  }..  aff 
14a30 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  = p->pTable->aCo
14a40 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  l[p->aiColumn[nE
14a50 71 2d 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  q-1]].affinity;.
14a60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
14a70 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
14a80 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
14a90 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
14aa0 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70  Eq-1, &bOk);.  p
14ab0 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
14ac0 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21 3d  pRec;.  if( rc!=
14ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
14ae0 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b  rn rc;.  if( bOk
14af0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
14b00 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
14b10 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
14b20 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68  lid = nEq;..  wh
14b30 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
14b40 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
14b50 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  a);.  WHERETRACE
14b60 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74 79  (0x10,("equality
14b70 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
14b80 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29  d\n", (int)a[1])
14b90 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b  );.  *pnRow = a[
14ba0 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  1];.  .  return 
14bb0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
14bc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14bd0 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
14be0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14bf0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
14c00 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
14c10 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
14c20 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
14c30 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
14c40 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
14c50 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
14c60 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
14c70 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
14c80 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
14c90 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
14ca0 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
14cb0 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
14cc0 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
14cd0 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
14ce0 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
14cf0 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
14d00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
14d10 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
14d20 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
14d30 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
14d40 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
14d50 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
14d60 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
14d70 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
14d80 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
14d90 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
14da0 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
14db0 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
14dc0 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
14dd0 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
14de0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
14df0 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
14e00 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
14e10 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
14e20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
14e30 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
14e40 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
14e50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14e60 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20  hereInScanEst(. 
14e70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14e80 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
14e90 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
14ea0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14eb0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
14ec0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
14ed0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
14ee0 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
14ef0 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20  list on the RHS 
14f00 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c  of "x IN (v1,v2,
14f10 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52  v3,...)" */.  tR
14f20 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
14f30 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
14f40 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
14f50 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
14f60 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
14f70 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
14f80 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
14f90 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74  64 nRow0 = sqlit
14fa0 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d  e3LogEstToInt(p-
14fb0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29  >aiRowLogEst[0])
14fc0 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69  ;.  int nRecVali
14fd0 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
14fe0 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72  ecValid;.  int r
14ff0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
15000 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
15010 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
15020 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b  .  tRowcnt nEst;
15030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15040 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72  mber of rows for
15050 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a   a single term *
15060 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77  /.  tRowcnt nRow
15070 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  Est = 0;    /* N
15080 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
15090 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
150a0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
150c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
150d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
150e0 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
150f0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
15100 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
15110 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
15120 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30      nEst = nRow0
15130 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
15140 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
15150 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
15160 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15170 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52  , &nEst);.    nR
15180 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20  owEst += nEst;. 
15190 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
151a0 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
151b0 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  id;.  }..  if( r
151c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
151d0 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20      if( nRowEst 
151e0 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45 73  > nRow0 ) nRowEs
151f0 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a  t = nRow0;.    *
15200 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
15210 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
15220 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73  0x10,("IN row es
15230 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e  timate: est=%g\n
15240 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20  ", nRowEst));.  
15250 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  }.  assert( pBui
15260 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d  lder->nRecValid=
15270 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  =nRecValid );.  
15280 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
15290 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
152a0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
152b0 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69  AT4 */../*.** Di
152c0 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20  sable a term in 
152d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
152e0 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  .  Except, do no
152f0 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  t disable the te
15300 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74  rm.** if it cont
15310 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45  rols a LEFT OUTE
15320 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69  R JOIN and it di
15330 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
15340 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20  in the ON.** or 
15350 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
15360 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  that join..**.**
15370 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65   Consider the te
15380 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20  rm t2.z='ok' in 
15390 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
153a0 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  eries:.**.**   (
153b0 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1)  SELECT * FRO
153c0 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
153d0 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57  2 ON t1.a=t2.x W
153e0 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a  HERE t2.z='ok'.*
153f0 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20  *   (2)  SELECT 
15400 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
15410 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
15420 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
15430 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45  '.**   (3)  SELE
15440 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
15450 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78   WHERE t1.a=t2.x
15460 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
15470 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f  *.** The t2.z='o
15480 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  k' is disabled i
15490 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63  n the in (2) bec
154a0 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74  ause it originat
154b0 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  es.** in the ON 
154c0 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72  clause.  The ter
154d0 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  m is disabled in
154e0 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20   (3) because it 
154f0 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f  is not part.** o
15500 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
15510 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68  OIN.  In (1), th
15520 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69  e term is not di
15530 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69  sabled..**.** Di
15540 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63  sabling a term c
15550 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20  auses that term 
15560 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  to not be tested
15570 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   in the inner lo
15580 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  op.** of the joi
15590 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73  n.  Disabling is
155a0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
155b0 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72  .  When terms ar
155c0 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
155d0 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69  y indices, we di
155e0 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72  sable them to pr
155f0 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20  event redundant 
15600 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e  tests in the inn
15610 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20  er.** loop.  We 
15620 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f  would get the co
15630 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66  rrect results if
15640 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
15650 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20  er disabled,.** 
15660 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20  but joins might 
15670 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
15680 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
15690 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
156a0 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63   much.** as we c
156b0 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62  an without disab
156c0 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20  ling too much.  
156d0 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
156e0 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a  n (1), we'd get.
156f0 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73  ** the wrong ans
15700 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74  wer.  See ticket
15710 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   #813..*/.static
15720 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72   void disableTer
15730 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  m(WhereLevel *pL
15740 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20  evel, WhereTerm 
15750 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  *pTerm){.  if( p
15760 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
15770 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
15780 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
15790 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
157a0 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
157b0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
157c0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
157d0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
157e0 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e     && (pLevel->n
157f0 6f 74 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d  otReady & pTerm-
15800 3e 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20  >prereqAll)==0. 
15810 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
15820 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
15830 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
15840 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
15850 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
15860 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
15870 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
15880 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
15890 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
158a0 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
158b0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
158c0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
158d0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
158e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
158f0 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
15900 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
15910 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
15920 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
15930 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
15940 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
15950 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
15960 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
15970 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
15980 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
15990 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
159a0 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
159b0 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
159c0 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
159d0 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
159e0 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
159f0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
15a00 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
15a10 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
15a20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15a30 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
15a40 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
15a50 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
15a60 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
15a70 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
15a80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
15a90 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
15aa0 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
15ab0 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
15ac0 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
15ad0 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
15ae0 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
15af0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
15b00 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
15b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15b20 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15b30 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
15b40 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
15b50 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
15b60 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
15b70 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
15b80 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
15b90 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
15ba0 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
15bb0 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
15bc0 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
15bd0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
15be0 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
15bf0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
15c00 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
15c10 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
15c20 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
15c30 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
15c40 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
15c50 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
15c60 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
15c70 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
15c80 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
15c90 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
15ca0 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
15cb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15cc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
15cd0 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
15ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15cf0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
15d00 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
15d10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
15d20 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
15d30 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
15d40 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
15d50 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
15d60 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
15d70 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
15d80 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
15d90 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
15da0 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
15db0 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
15dc0 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
15dd0 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
15de0 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
15df0 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
15e00 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
15e10 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
15e20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
15e30 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
15e40 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
15e50 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
15e60 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
15e70 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
15e80 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
15e90 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
15ea0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
15eb0 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
15ec0 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
15ed0 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
15ee0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
15ef0 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
15f00 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
15f10 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
15f20 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
15f30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15f40 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
15f50 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
15f60 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
15f70 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
15f80 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
15f90 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
15fa0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
15fb0 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c  pLevel, /* The l
15fc0 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
15fd0 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
15fe0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
15ff0 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
16000 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
16010 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
16020 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76   within this lev
16030 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  el */.  int bRev
16040 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
16050 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d  rue for reverse-
16060 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69  order IN operati
16070 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
16080 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
16090 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
160a0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
160b0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
160c0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
160d0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
160e0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
160f0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
16100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16110 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
16120 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
16130 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
16140 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
16150 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
16160 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
16170 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
16180 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
16190 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
161a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
161b0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
161c0 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
161d0 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
161e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
161f0 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
16200 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16210 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
16220 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
16230 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
16240 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
16250 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
16260 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
16270 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
16280 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  p;..    if( (pLo
16290 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
162a0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
162b0 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  )==0.      && pL
162c0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
162d0 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20  dex!=0.      && 
162e0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
162f0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
16300 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20  r[iEq].    ){.  
16310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45      testcase( iE
16320 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  q==0 );.      te
16330 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
16340 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
16350 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ev;.    }.    as
16360 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
16370 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
16380 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
16390 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
163a0 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
163b0 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66  , pX, 0);.    if
163c0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
163d0 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
163e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
163f0 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
16400 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
16410 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  }.    iTab = pX-
16420 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
16430 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16440 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
16450 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54   : OP_Rewind, iT
16460 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65  ab, 0);.    Vdbe
16470 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
16480 65 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ev);.    VdbeCov
16490 65 72 61 67 65 49 66 28 76 2c 20 21 62 52 65 76  erageIf(v, !bRev
164a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
164b0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
164c0 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29   WHERE_MULTI_OR)
164d0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  ==0 );.    pLoop
164e0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
164f0 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20  RE_IN_ABLE;.    
16500 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
16510 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
16520 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
16530 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16540 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
16550 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
16560 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
16570 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
16580 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
16590 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
165a0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
165b0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
165c0 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
165f0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
16600 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
16610 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
16620 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
16630 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
16640 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
16650 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
16660 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
16670 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
16680 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
16690 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
166a0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
166b0 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
166c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
166d0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
166e0 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
166f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
16700 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
16710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16720 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
16730 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
16740 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d      }.      pIn-
16750 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52  >eEndLoopOp = bR
16760 65 76 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70  ev ? OP_PrevIfOp
16770 65 6e 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70  en : OP_NextIfOp
16780 65 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  en;.      sqlite
16790 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
167a0 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b  P_IsNull, iReg);
167b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
167c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
167d0 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
167e0 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
167f0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
16800 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
16810 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
16820 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
16830 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
16840 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
16850 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
16860 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
16870 6e 0a 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e  n.** index scan.
16880 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
16890 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
168a0 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
168b0 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
168c0 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
168d0 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
168e0 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
168f0 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
16900 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
16910 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
16920 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
16930 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
16940 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
16950 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
16960 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
16970 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
16980 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
16990 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
169a0 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
169b0 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
169c0 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
169d0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
169e0 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
169f0 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
16a00 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
16a10 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
16a20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
16a30 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
16a40 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
16a50 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
16a60 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
16a70 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
16a80 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
16a90 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
16aa0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
16ab0 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
16ac0 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
16ad0 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
16ae0 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
16af0 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
16b00 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
16b10 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
16b20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
16b30 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
16b40 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
16b50 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
16b60 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
16b70 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 52 65 67  ** The nExtraReg
16b80 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
16b90 6f 72 20 31 2e 20 20 49 74 20 69 73 20 30 20 69  or 1.  It is 0 i
16ba0 66 20 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75  f all WHERE clau
16bb0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  se constraints.*
16bc0 2a 20 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61  * are == or IN a
16bd0 6e 64 20 61 72 65 20 63 6f 76 65 72 65 64 20 62  nd are covered b
16be0 79 20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74  y the nEq.  nExt
16bf0 72 61 52 65 67 20 69 73 20 31 20 69 66 20 74 68  raReg is 1 if th
16c00 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65  ere is.** an ine
16c10 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16c20 6e 74 20 28 73 75 63 68 20 61 73 20 74 68 65 20  nt (such as the 
16c30 22 63 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20  "c>=5 AND c<10" 
16c40 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20  in the example) 
16c50 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61  that.** occurs a
16c60 66 74 65 72 20 74 68 65 20 6e 45 71 20 71 75 61  fter the nEq qua
16c70 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16c80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16c90 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
16ca0 20 72 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45   range of nEq+nE
16cb0 78 74 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63  xtraReg memory c
16cc0 65 6c 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ells and returns
16cd0 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
16ce0 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72   the first memor
16cf0 79 20 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72  y cell in that r
16d00 61 6e 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74  ange. The code t
16d10 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
16d20 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
16d30 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72  se that memory r
16d40 61 6e 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65  ange to store ke
16d50 79 73 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20  ys for.** start 
16d60 61 6e 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  and termination 
16d70 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68  conditions of th
16d80 65 20 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76  e loop..** key v
16d90 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
16da0 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
16db0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
16dc0 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
16dd0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
16de0 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
16df0 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
16e00 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
16e10 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  l.** use..**.** 
16e20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
16e30 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20  , *pzAff is set 
16e40 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
16e50 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
16e60 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65  a.** copy of the
16e70 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
16e80 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69   string of the i
16e90 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75  ndex allocated u
16ea0 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44  sing.** sqlite3D
16eb0 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70  bMalloc(). Excep
16ec0 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  t, entries in th
16ed0 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  e copy of the st
16ee0 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a  ring associated.
16ef0 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79  ** with equality
16f00 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
16f10 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e  t use NONE affin
16f20 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a  ity are set to.*
16f30 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
16f40 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65  E. This is to de
16f50 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68  al with SQL such
16f60 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
16f70 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
16f80 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58  E TABLE t1(a TEX
16f90 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  T PRIMARY KEY, b
16fa0 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e  );.**   SELECT .
16fb0 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32  .. FROM t1 AS t2
16fc0 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20  , t1 WHERE t1.a 
16fd0 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e  = t2.b;.**.** In
16fe0 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
16ff0 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ve, the index on
17000 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20   t1(a) has TEXT 
17010 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69  affinity. But si
17020 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74  nce.** the right
17030 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68   hand side of th
17040 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
17050 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73  raint (t2.b) has
17060 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a   NONE affinity,.
17070 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  ** no conversion
17080 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d   should be attem
17090 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e  pted before usin
170a0 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61  g a t2.b value a
170b0 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b  s part of.** a k
170c0 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ey to search the
170d0 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68   index. Hence th
170e0 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20  e first byte in 
170f0 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66  the returned aff
17100 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20  inity.** string 
17110 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20  in this example 
17120 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  would be set to 
17130 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
17140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
17150 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
17160 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
17170 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
17180 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
17190 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
171a0 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
171b0 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
171c0 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
171d0 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69  re coding */.  i
171e0 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
171f0 20 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20       /* Reverse 
17200 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
17210 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
17220 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20  nt nExtraReg,   
17230 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17240 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
17250 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
17260 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20  .  char **pzAff 
17270 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
17280 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   Set to point to
17290 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
172a0 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71   */.){.  u16 nEq
172b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
172c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
172d0 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
172e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
172f0 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53  code */.  u16 nS
17300 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kip;            
17310 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17320 72 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63  r of left-most c
17330 6f 6c 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a  olumns to skip *
17340 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
17350 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
17360 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65    /* The vm unde
17370 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
17380 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
173b0 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
173c0 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  is loop */.  Whe
173d0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
173e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
173f0 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
17400 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  t term */.  Wher
17410 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
17420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17430 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
17440 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  t */.  int j;   
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
17470 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
17480 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
17490 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
174a0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
174b0 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20  t nReg;         
174c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
174d0 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
174e0 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
174f0 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20  /.  char *zAff; 
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17510 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
17520 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a  ring to return *
17530 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64  /..  /* This mod
17540 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ule is only call
17550 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e  ed on query plan
17560 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e  s that use an in
17570 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20  dex. */.  pLoop 
17580 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
17590 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f  ;.  assert( (pLo
175a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
175b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
175c0 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20  )==0 );.  nEq = 
175d0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
175e0 45 71 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c  Eq;.  nSkip = pL
175f0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  oop->u.btree.nSk
17600 69 70 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f  ip;.  pIdx = pLo
17610 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
17620 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ex;.  assert( pI
17630 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46  dx!=0 );..  /* F
17640 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
17650 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
17660 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
17670 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
17680 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
17690 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
176a0 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f   1;.  nReg = pLo
176b0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
176c0 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70  + nExtraReg;.  p
176d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
176e0 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73  Reg;..  zAff = s
176f0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
17700 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74  Parse->db, sqlit
17710 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
17720 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20  tr(v, pIdx));.  
17730 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20  if( !zAff ){.   
17740 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
17750 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
17760 20 7d 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70 20   }..  if( nSkip 
17770 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  ){.    int iIdxC
17780 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
17790 78 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  xCur;.    sqlite
177a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28  3VdbeAddOp1(v, (
177b0 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f  bRev?OP_Last:OP_
177c0 52 65 77 69 6e 64 29 2c 20 69 49 64 78 43 75 72  Rewind), iIdxCur
177d0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
177e0 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
177f0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
17800 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
17810 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
17820 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 73 6b  nt((v, "begin sk
17830 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20  ip-scan on %s", 
17840 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
17850 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 56 64     j = sqlite3Vd
17860 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
17870 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oto);.    pLevel
17880 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20 73 71 6c  ->addrSkip = sql
17890 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
178a0 74 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65  t(v, (bRev?OP_Se
178b0 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47 54 29 2c  ekLT:OP_SeekGT),
178c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
178d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64               iId
178e0 78 43 75 72 2c 20 30 2c 20 72 65 67 42 61 73 65  xCur, 0, regBase
178f0 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 56 64  , nSkip);.    Vd
17900 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
17910 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64  bRev==0);.    Vd
17920 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
17930 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 73 71  bRev!=0);.    sq
17940 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
17950 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72  e(v, j);.    for
17960 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a  (j=0; j<nSkip; j
17970 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
17980 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17990 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
179a0 75 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a  ur, j, regBase+j
179b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
179c0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
179d0 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 56  j]>=0 );.      V
179e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
179f0 25 73 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  %s", pIdx->pTabl
17a00 65 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69  e->aCol[pIdx->ai
17a10 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
17a20 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20  ));.    }.  }   
17a30 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65   ..  /* Evaluate
17a40 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
17a50 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
17a60 20 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30   assert( zAff==0
17a70 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28   || (int)strlen(
17a80 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20  zAff)>=nEq );.  
17a90 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e  for(j=nSkip; j<n
17aa0 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e  Eq; j++){.    in
17ab0 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20  t r1;.    pTerm 
17ac0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
17ad0 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  j];.    assert( 
17ae0 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
17af0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
17b00 20 74 65 73 74 63 61 73 65 20 69 73 20 74 72 75   testcase is tru
17b10 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69  e for indices wi
17b20 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  th redundant col
17b30 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78  umns. .    ** Ex
17b40 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  : CREATE INDEX i
17b50 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20  1 ON t1(a,b,a); 
17b60 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
17b70 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62   WHERE a=0 AND b
17b80 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  =0; */.    testc
17b90 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ase( (pTerm->wtF
17ba0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
17bb0 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  D)!=0 );.    tes
17bc0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
17bd0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
17be0 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d  TUAL );.    r1 =
17bf0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
17c00 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
17c10 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
17c20 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
17c30 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
17c40 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
17c50 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
17c60 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17c70 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17c80 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
17c90 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
17ca0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17cc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
17cd0 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
17ce0 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
17cf0 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
17d00 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
17d10 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
17d20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
17d30 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
17d40 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
17d50 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
17d60 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
17d70 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
17d80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
17d90 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
17da0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
17db0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
17dc0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68  rCanBeNull(pRigh
17dd0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  t) ){.        sq
17de0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17df0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
17e00 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
17e10 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
17e20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
17e30 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
17e40 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20    if( zAff ){.  
17e50 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17e60 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
17e70 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
17e80 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
17e90 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
17ea0 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
17eb0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
17ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17ed0 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
17ee0 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
17ef0 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  e(pRight, zAff[j
17f00 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
17f10 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
17f20 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
17f30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17f40 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20   }.  }.  *pzAff 
17f50 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e  = zAff;.  return
17f60 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66   regBase;.}..#if
17f70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17f80 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54  _EXPLAIN./*.** T
17f90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
17fa0 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c   helper for expl
17fb0 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20  ainIndexRange() 
17fc0 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72  below.**.** pStr
17fd0 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20   holds the text 
17fe0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
17ff0 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69   that we are bui
18000 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72  lding up one ter
18010 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20  m.** at a time. 
18020 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
18030 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  ds a new term to
18040 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18050 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54  expression..** T
18060 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74  erms are separat
18070 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64  ed by AND so add
18080 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20   the "AND" text 
18090 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73  for second and s
180a0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72  ubsequent.** ter
180b0 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ms only..*/.stat
180c0 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41  ic void explainA
180d0 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72  ppendTerm(.  Str
180e0 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20  Accum *pStr,    
180f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18100 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20  text expression 
18110 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20  being built */. 
18120 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20   int iTerm,     
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18140 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65  Index of this te
18150 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65  rm.  First is ze
18160 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ro */.  const ch
18170 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20  ar *zColumn,    
18180 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
18190 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
181a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20  onst char *zOp  
181b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
181c0 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  me of the operat
181d0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  or */.){.  if( i
181e0 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74  Term ) sqlite3St
181f0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
18200 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a  r, " AND ", 5);.
18210 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
18220 6d 41 70 70 65 6e 64 41 6c 6c 28 70 53 74 72 2c  mAppendAll(pStr,
18230 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c   zColumn);.  sql
18240 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
18250 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29  nd(pStr, zOp, 1)
18260 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
18270 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
18280 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  "?", 1);.}../*.*
18290 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
182a0 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
182b0 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
182c0 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
182d0 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
182e0 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
182f0 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
18300 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
18310 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  g a description.
18320 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74  ** of the subset
18330 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73   of table rows s
18340 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74  canned by the st
18350 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f  rategy in the fo
18360 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20  rm of an.** SQL 
18370 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20  expression. Or, 
18380 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
18390 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73  scanned, NULL is
183a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
183b0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
183c0 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
183d0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
183e0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41  M t1 WHERE a=1 A
183f0 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73  ND b>2;.**.** is
18400 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69   run and there i
18410 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  s an index on (a
18420 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20  , b), then this 
18430 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
18440 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d   a.** string sim
18450 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
18460 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a   "a=? AND b>?".*
18470 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
18480 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  d pointer points
18490 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
184a0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
184b0 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  DbMalloc()..** I
184c0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
184d0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
184e0 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
184f0 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74  e buffer when it
18500 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
18510 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
18520 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61  atic char *expla
18530 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c  inIndexRange(sql
18540 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
18550 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c  oop *pLoop, Tabl
18560 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
18570 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f  x *pIndex = pLoo
18580 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
18590 78 3b 0a 20 20 75 31 36 20 6e 45 71 20 3d 20 70  x;.  u16 nEq = p
185a0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
185b0 71 3b 0a 20 20 75 31 36 20 6e 53 6b 69 70 20 3d  q;.  u16 nSkip =
185c0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
185d0 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20  nSkip;.  int i, 
185e0 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  j;.  Column *aCo
185f0 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a  l = pTab->aCol;.
18600 20 20 69 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20    i16 *aiColumn 
18610 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
18620 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74  mn;.  StrAccum t
18630 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d  xt;..  if( nEq==
18640 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  0 && (pLoop->wsF
18650 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54  lags & (WHERE_BT
18660 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
18670 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a  P_LIMIT))==0 ){.
18680 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18690 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
186a0 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c  cumInit(&txt, 0,
186b0 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c   0, SQLITE_MAX_L
186c0 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62  ENGTH);.  txt.db
186d0 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33   = db;.  sqlite3
186e0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
186f0 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20  txt, " (", 2);. 
18700 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b   for(i=0; i<nEq;
18710 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
18720 2a 7a 20 3d 20 28 69 3d 3d 70 49 6e 64 65 78 2d  *z = (i==pIndex-
18730 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f  >nKeyCol ) ? "ro
18740 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
18750 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[i]].zName;.
18760 20 20 20 20 69 66 28 20 69 3e 3d 6e 53 6b 69 70      if( i>=nSkip
18770 20 29 7b 0a 20 20 20 20 20 20 65 78 70 6c 61 69   ){.      explai
18780 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
18790 2c 20 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20  , i, z, "=");.  
187a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
187b0 66 28 20 69 20 29 20 73 71 6c 69 74 65 33 53 74  f( i ) sqlite3St
187c0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78  rAccumAppend(&tx
187d0 74 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a  t, " AND ", 5);.
187e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
187f0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
18800 2c 20 22 41 4e 59 28 22 2c 20 34 29 3b 0a 20 20  , "ANY(", 4);.  
18810 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
18820 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 74 78  cumAppendAll(&tx
18830 74 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, z);.      sql
18840 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
18850 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
18860 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6a  ;.    }.  }..  j
18870 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f   = i;.  if( pLoo
18880 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
18890 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
188a0 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
188b0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
188c0 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
188d0 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
188e0 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
188f0 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
18900 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  t, i++, z, ">");
18910 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
18920 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
18930 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
18940 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
18950 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Index->nKeyCol )
18960 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
18970 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
18980 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
18990 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
189a0 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20  , i, z, "<");.  
189b0 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
189c0 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
189d0 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  ")", 1);.  retur
189e0 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  n sqlite3StrAccu
189f0 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d  mFinish(&txt);.}
18a00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
18a10 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
18a20 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c   unless currentl
18a30 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  y processing an 
18a40 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
18a50 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49  AN.** command. I
18a60 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e  f the query bein
18a70 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e  g compiled is an
18a80 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
18a90 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  LAN, a single.**
18aa0 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
18ab0 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74   to the output t
18ac0 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  o describe the t
18ad0 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65  able scan strate
18ae0 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c  gy in .** pLevel
18af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18b00 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
18b10 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18b30 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
18b40 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
18b50 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
18b60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
18b70 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
18b80 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
18b90 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
18ba0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
18bb0 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
18bc0 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
18bd0 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  de for */.  int 
18be0 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
18c00 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22  alue for "level"
18c10 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
18c20 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
18c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18c40 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
18c50 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d  for "from" colum
18c60 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
18c70 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
18ca0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
18cb0 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 23 69  Begin() */.){.#i
18cc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
18cd0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
18ce0 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65  >explain==2 ).#e
18cf0 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 74 72  ndif.  {.    str
18d00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
18d10 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
18d20 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
18d30 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20  From];.    Vdbe 
18d40 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
18d50 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62  be;      /* VM b
18d60 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
18d70 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20   */.    sqlite3 
18d80 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
18d90 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
18da0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  e handle */.    
18db0 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20  char *zMsg;     
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18dd0 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20   Text to add to 
18de0 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
18df0 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72    int iId = pPar
18e00 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20  se->iSelectId;  
18e10 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65  /* Select id (le
18e20 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63  ft-most output c
18e30 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  olumn) */.    in
18e40 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20  t isSearch;     
18e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18e60 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48  rue for a SEARCH
18e70 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e  . False for SCAN
18e80 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  . */.    WhereLo
18e90 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
18ea0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
18eb0 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c  ntrolling WhereL
18ec0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
18ed0 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20    u32 flags;    
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ef0 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65  /* Flags that de
18f00 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70  scribe this loop
18f10 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d   */..    pLoop =
18f20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
18f30 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f  .    flags = pLo
18f40 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
18f50 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
18f60 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28  E_MULTI_OR) || (
18f70 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
18f80 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
18f90 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ) return;..    i
18fa0 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73  sSearch = (flags
18fb0 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  &(WHERE_BTM_LIMI
18fc0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
18fd0 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  T))!=0.         
18fe0 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48     || ((flags&WH
18ff0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
19000 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  )==0 && (pLoop->
19010 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a  u.btree.nEq>0)).
19020 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
19030 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
19040 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
19050 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
19060 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  );..    zMsg = s
19070 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
19080 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68  , "%s", isSearch
19090 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22  ?"SEARCH":"SCAN"
190a0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
190b0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
190c0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
190d0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
190e0 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59  sg, "%s SUBQUERY
190f0 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d   %d", zMsg,pItem
19100 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  ->iSelectId);.  
19110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
19120 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
19130 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
19140 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  "%s TABLE %s", z
19150 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Msg, pItem->zNam
19160 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
19170 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
19180 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
19190 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
191a0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41  (db, zMsg, "%s A
191b0 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
191c0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
191d0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
191e0 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
191f0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
19200 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41  E))==0.     && A
19210 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62  LWAYS(pLoop->u.b
19220 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a  tree.pIndex!=0).
19230 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e      ){.      con
19240 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 3b 0a 20  st char *zFmt;. 
19250 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
19260 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
19270 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
19280 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65  char *zWhere = e
19290 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
192a0 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65  (db, pLoop, pIte
192b0 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20  m->pTab);.      
192c0 61 73 73 65 72 74 28 20 21 28 66 6c 61 67 73 26  assert( !(flags&
192d0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
192e0 29 20 7c 7c 20 28 66 6c 61 67 73 26 57 48 45 52  ) || (flags&WHER
192f0 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 3b 0a 20  E_IDX_ONLY) );. 
19300 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
19310 69 64 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  id(pItem->pTab) 
19320 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
19330 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20  ndex(pIdx) ){.  
19340 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 7a 57 68        zFmt = zWh
19350 65 72 65 20 3f 20 22 25 73 20 55 53 49 4e 47 20  ere ? "%s USING 
19360 50 52 49 4d 41 52 59 20 4b 45 59 25 2e 30 73 25  PRIMARY KEY%.0s%
19370 73 22 20 3a 20 22 25 73 25 2e 30 73 25 73 22 3b  s" : "%s%.0s%s";
19380 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
19390 20 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41   flags & WHERE_A
193a0 55 54 4f 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20  UTO_INDEX ){.   
193b0 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 25 73 20       zFmt = "%s 
193c0 55 53 49 4e 47 20 41 55 54 4f 4d 41 54 49 43 20  USING AUTOMATIC 
193d0 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 25 2e  COVERING INDEX%.
193e0 30 73 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c  0s%s";.      }el
193f0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 57  se if( flags & W
19400 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b  HERE_IDX_ONLY ){
19410 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d 20  .        zFmt = 
19420 22 25 73 20 55 53 49 4e 47 20 43 4f 56 45 52 49  "%s USING COVERI
19430 4e 47 20 49 4e 44 45 58 20 25 73 25 73 22 3b 0a  NG INDEX %s%s";.
19440 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19450 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 25 73 20       zFmt = "%s 
19460 55 53 49 4e 47 20 49 4e 44 45 58 20 25 73 25 73  USING INDEX %s%s
19470 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
19480 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
19490 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
194a0 2c 20 7a 46 6d 74 2c 20 7a 4d 73 67 2c 20 70 49  , zFmt, zMsg, pI
194b0 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72  dx->zName, zWher
194c0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
194d0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65  3DbFree(db, zWhe
194e0 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  re);.    }else i
194f0 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
19500 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c  E_IPK)!=0 && (fl
19510 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
19520 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20  TRAINT)!=0 ){.  
19530 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
19540 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
19550 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49  Msg, "%s USING I
19560 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
19570 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20  EY", zMsg);..   
19580 20 20 20 69 66 28 20 66 6c 61 67 73 26 28 57 48     if( flags&(WH
19590 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
195a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29  ERE_COLUMN_IN) )
195b0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
195c0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
195d0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
195e0 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29  rowid=?)", zMsg)
195f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19600 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42  ( (flags&WHERE_B
19610 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52  OTH_LIMIT)==WHER
19620 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a  E_BOTH_LIMIT ){.
19630 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
19640 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
19650 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
19660 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c  wid>? AND rowid<
19670 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
19680 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
19690 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  s&WHERE_BTM_LIMI
196a0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  T ){.        zMs
196b0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
196c0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
196d0 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d  s (rowid>?)", zM
196e0 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
196f0 20 69 66 28 20 41 4c 57 41 59 53 28 66 6c 61 67   if( ALWAYS(flag
19700 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  s&WHERE_TOP_LIMI
19710 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  T) ){.        zM
19720 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
19730 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
19740 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a  %s (rowid<?)", z
19750 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Msg);.      }.  
19760 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
19770 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
19780 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66  ABLE.    else if
19790 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
197a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
197b0 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  0 ){.      zMsg 
197c0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
197d0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
197e0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
197f0 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67  DEX %d:%s", zMsg
19800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19810 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
19820 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d  b.idxNum, pLoop-
19830 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
19840 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
19850 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
19860 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
19870 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a  g, "%s", zMsg);.
19880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19890 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
198a0 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c  ain, iId, iLevel
198b0 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50  , iFrom, zMsg, P
198c0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
198d0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
198e0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
198f0 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
19900 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
19910 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a  IT_EXPLAIN */...
19920 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
19930 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ode for the star
19940 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d  t of the iLevel-
19950 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57  th loop in the W
19960 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69  HERE clause.** i
19970 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65  mplementation de
19980 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66  scribed by pWInf
19990 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  o..*/.static Bit
199a0 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70  mask codeOneLoop
199b0 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e  Start(.  WhereIn
199c0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a  fo *pWInfo,   /*
199d0 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d   Complete inform
199e0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
199f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
19a00 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
19a10 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
19a20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d  level of pWInfo-
19a30 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63  >a[] should be c
19a40 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73  oded */.  Bitmas
19a50 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f  k notReady     /
19a60 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61  * Which tables a
19a70 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  re currently ava
19a80 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  ilable */.){.  i
19a90 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  nt j, k;        
19aa0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
19ab0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
19ac0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
19ad0 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
19ae0 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
19af0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74  */.  int addrNxt
19b00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  ;         /* Whe
19b10 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f  re to jump to co
19b20 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
19b30 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a  next IN case */.
19b40 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
19b50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
19b60 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64  f we use the ind
19b70 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ex only */.  int
19b80 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
19b90 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
19ba0 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20  need to scan in 
19bb0 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
19bc0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
19bd0 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77  Level;  /* The w
19be0 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65  here level to be
19bf0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
19c00 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
19c10 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
19c20 70 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63  p object being c
19c30 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  oded */.  WhereC
19c40 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
19c50 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
19c60 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48  of the entire WH
19c70 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
19c80 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
19c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19ca0 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73  /* A WHERE claus
19cb0 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73  e term */.  Pars
19cc0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
19ce0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
19cf0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
19d20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
19d30 56 64 62 65 20 2a 76 3b 20 20 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 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
19d60 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  stmt under const
19d70 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74  ructions */.  st
19d80 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
19d90 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
19da0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
19db0 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  m being coded */
19dc0 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20  .  int addrBrk; 
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
19df0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
19e00 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
19e10 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20  t addrCont;     
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e30 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
19e40 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
19e50 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
19e60 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20  iRowidReg = 0;  
19e70 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
19e80 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73  s stored in this
19e90 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f   register, if no
19ea0 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  t zero */.  int 
19eb0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b  iReleaseReg = 0;
19ec0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
19ed0 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62  gister to free b
19ee0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
19ef0 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
19f00 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
19f10 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
19f20 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  be;.  pWC = &pWI
19f30 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d  nfo->sWC;.  db =
19f40 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
19f50 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
19f60 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c  >a[iLevel];.  pL
19f70 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
19f80 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d  Loop;.  pTabItem
19f90 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
19fa0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
19fb0 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d  iFrom];.  iCur =
19fc0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
19fd0 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f  or;.  pLevel->no
19fe0 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64  tReady = notRead
19ff0 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57  y & ~getMask(&pW
1a000 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
1a010 69 43 75 72 29 3b 0a 20 20 62 52 65 76 20 3d 20  iCur);.  bRev = 
1a020 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b  (pWInfo->revMask
1a030 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f  >>iLevel)&1;.  o
1a040 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f  mitTable = (pLoo
1a050 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1a060 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20  RE_IDX_ONLY)!=0 
1a070 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
1a080 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1a090 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45  gs & WHERE_FORCE
1a0a0 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64  _TABLE)==0;.  Vd
1a0b0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
1a0c0 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45  (v, "Begin WHERE
1a0d0 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69 4c 65  -loop%d: %s",iLe
1a0e0 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e 70 54  vel,pTabItem->pT
1a0f0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  ab->zName));..  
1a100 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
1a110 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
1a120 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
1a130 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
1a140 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
1a150 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
1a160 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61   addrBrk to brea
1a170 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  k out of a loop.
1a180 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f  .  ** Jump to co
1a190 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
1a1a0 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
1a1b0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
1a1c0 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a  e.  ** loop..  *
1a1d0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72  *.  ** When ther
1a1e0 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
1a1f0 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
1a200 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61  e a "addrNxt" la
1a210 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65  bel that.  ** me
1a220 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
1a230 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
1a240 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
1a250 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74  on.  When.  ** t
1a260 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
1a270 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
1a280 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1a290 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1a2a0 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  .  ** is the sam
1a2b0 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a  e as "addrBrk"..
1a2c0 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d    */.  addrBrk =
1a2d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1a2e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1a2f0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1a300 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1a310 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65  addrCont = pLeve
1a320 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  l->addrCont = sq
1a330 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1a340 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  el(v);..  /* If 
1a350 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
1a360 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
1a370 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
1a380 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20  locate and.  ** 
1a390 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
1a3a0 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
1a3b0 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
1a3c0 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
1a3d0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
1a3e0 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
1a3f0 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
1a400 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
1a410 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
1a420 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  0].jointype & JT
1a430 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
1a440 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1a450 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  in = ++pParse->n
1a460 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1a470 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a480 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65  _Integer, 0, pLe
1a490 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
1a4a0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1a4b0 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
1a4c0 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
1a4d0 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ag"));.  }..  /*
1a4e0 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   Special case of
1a4f0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73   a FROM clause s
1a500 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e  ubquery implemen
1a510 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
1a520 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ine */.  if( pTa
1a530 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  bItem->viaCorout
1a540 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
1a550 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
1a560 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
1a570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a580 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
1a590 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
1a5a0 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d  ld, 0, pTabItem-
1a5b0 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
1a5c0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1a5d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a5e0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a5f0 72 65 67 59 69 65 6c 64 2c 20 61 64 64 72 42 72  regYield, addrBr
1a600 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
1a610 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
1a620 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65  eComment((v, "ne
1a630 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22  xt row of \"%s\"
1a640 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  ", pTabItem->pTa
1a650 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
1a660 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1a670 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  Goto;.  }else..#
1a680 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a690 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1a6a0 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77    if(  (pLoop->w
1a6b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1a6c0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
1a6d0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
1a6e0 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  :  The table is 
1a6f0 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e  a virtual-table.
1a700 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65    Use the VFilte
1a710 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20  r and VNext.    
1a720 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61  **          to a
1a730 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a  ccess the data..
1a740 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69      */.    int i
1a750 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c  Reg;   /* P3 Val
1a760 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65  ue for OP_VFilte
1a770 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
1a780 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69  rNotFound;.    i
1a790 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
1a7a0 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a   pLoop->nLTerm;.
1a7b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1a7c0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1a7d0 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  );.    iReg = sq
1a7e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1a7f0 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74  e(pParse, nConst
1a800 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64  raint+2);.    ad
1a810 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65  drNotFound = pLe
1a820 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20  vel->addrBrk;.  
1a830 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
1a840 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
1a850 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67 65        int iTarge
1a860 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20  t = iReg+j+2;.  
1a870 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1a880 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
1a890 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
1a8a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a8b0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
1a8c0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
1a8d0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45  ){.        codeE
1a8e0 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
1a8f0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
1a900 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72  l, j, bRev, iTar
1a910 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64  get);.        ad
1a920 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65  drNotFound = pLe
1a930 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
1a940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a950 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1a960 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  de(pParse, pTerm
1a970 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
1a980 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1a990 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1a9a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a9b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c  , OP_Integer, pL
1a9c0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  oop->u.vtab.idxN
1a9d0 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73  um, iReg);.    s
1a9e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a9f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1aa00 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65  nConstraint, iRe
1aa10 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g+1);.    sqlite
1aa20 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1aa30 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
1aa40 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69   addrNotFound, i
1aa50 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Reg,.           
1aa60 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1aa70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
1aa80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aa90 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
1aaa0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20  vtab.needFree ? 
1aab0 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f  P4_MPRINTF : P4_
1aac0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 56 64 62  STATIC);.    Vdb
1aad0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1aae0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1aaf0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1ab00 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
1ab10 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36  nstraint && j<16
1ab20 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1ab30 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  ( (pLoop->u.vtab
1ab40 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20  .omitMask>>j)&1 
1ab50 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
1ab60 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1ab70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29  Loop->aLTerm[j])
1ab80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ab90 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1aba0 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70   OP_VNext;.    p
1abb0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1abc0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1abd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1abe0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1abf0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1ac00 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1ac10 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
1ac20 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  int+2);.    sqli
1ac30 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1ac40 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73 65  pParse);.  }else
1ac50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ac60 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1ac70 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70  BLE */..  if( (p
1ac80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1ac90 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20  WHERE_IPK)!=0.  
1aca0 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
1acb0 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
1acc0 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
1acd0 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b  UMN_EQ))!=0.  ){
1ace0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
1acf0 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
1ad00 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
1ad10 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
1ad20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ad30 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
1ad40 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
1ad50 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
1ad60 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1ad70 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d    we reference m
1ad80 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69  ultiple rows usi
1ad90 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28  ng a "rowid IN (
1ada0 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20  ...)".    **    
1adb0 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
1adc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1add0 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  rt( pLoop->u.btr
1ade0 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20  ee.nEq==1 );.   
1adf0 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1ae00 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61  aLTerm[0];.    a
1ae10 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
1ae20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1ae30 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
1ae40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
1ae50 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1ae60 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1ae70 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1ae80 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
1ae90 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 2b   iReleaseReg = +
1aea0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1aeb0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63     iRowidReg = c
1aec0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1aed0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1aee0 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20  Level, 0, bRev, 
1aef0 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
1af00 20 20 69 66 28 20 69 52 6f 77 69 64 52 65 67 21    if( iRowidReg!
1af10 3d 69 52 65 6c 65 61 73 65 52 65 67 20 29 20 73  =iReleaseReg ) s
1af20 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1af30 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
1af40 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
1af50 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
1af60 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
1af70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1af80 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
1af90 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
1afa0 4e 78 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Nxt); VdbeCovera
1afb0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1afc0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1afd0 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
1afe0 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f  ur, addrNxt, iRo
1aff0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62  widReg);.    Vdb
1b000 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b010 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1b020 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1b030 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64 52  (pParse, iRowidR
1b040 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  eg, 1);.    sqli
1b050 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1b060 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1b070 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1b080 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1b090 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
1b0a0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1b0b0 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Noop;.  }else if
1b0c0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1b0d0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1b0e0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
1b0f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1b100 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
1b110 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  GE)!=0.  ){.    
1b120 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20 68  /* Case 3:  We h
1b130 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
1b140 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
1b150 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
1b160 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
1b170 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
1b180 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
1b190 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
1b1a0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
1b1b0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
1b1c0 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
1b1d0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
1b1e0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20  ble==0 );.    j 
1b1f0 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20  = 0;.    pStart 
1b200 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20  = pEnd = 0;.    
1b210 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1b220 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
1b230 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d 20  IMIT ) pStart = 
1b240 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
1b250 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  +];.    if( pLoo
1b260 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1b270 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70  RE_TOP_LIMIT ) p
1b280 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
1b290 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73  erm[j++];.    as
1b2a0 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30 20  sert( pStart!=0 
1b2b0 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  || pEnd!=0 );.  
1b2c0 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
1b2d0 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61      pTerm = pSta
1b2e0 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74  rt;.      pStart
1b2f0 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70   = pEnd;.      p
1b300 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
1b310 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72   }.    if( pStar
1b320 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
1b330 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
1b340 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1b350 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  on that defines 
1b360 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20  the start bound 
1b370 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  */.      int r1,
1b380 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f   rTemp;        /
1b390 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20  * Registers for 
1b3a0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72  holding the star
1b3b0 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20  t boundary */.. 
1b3c0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
1b3d0 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d  owing constant m
1b3e0 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20  aps TK_xx codes 
1b3f0 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69  into correspondi
1b400 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65  ng .      ** see
1b410 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64  k opcodes.  It d
1b420 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74  epends on a part
1b430 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20  icular ordering 
1b440 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a  of TK_xx.      *
1b450 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  /.      const u8
1b460 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20   aMoveOp[] = {. 
1b470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1b480 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 54  GT */  OP_SeekGT
1b490 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1b4a0 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LE */  OP_See
1b4b0 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLE,.           
1b4c0 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f  /* TK_LT */  OP_
1b4d0 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20 20 20  SeekLT,.        
1b4e0 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20     /* TK_GE */  
1b4f0 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20 20  OP_SeekGE.      
1b500 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  };.      assert(
1b510 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20   TK_LE==TK_GT+1 
1b520 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );      /* Make 
1b530 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e  sure the orderin
1b540 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  g.. */.      ass
1b550 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
1b560 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+2 );      /*  
1b570 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78  ... of the TK_xx
1b580 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20   values... */.  
1b590 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
1b5a0 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20  E==TK_GT+3 );   
1b5b0 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f     /*  ... is co
1b5c0 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20  rrecct. */..    
1b5d0 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61 72    assert( (pStar
1b5e0 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1b5f0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
1b600 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b610 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1b620 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1b630 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61  .      pX = pSta
1b640 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
1b650 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1b660 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b670 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75  ( pStart->leftCu
1b680 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a  rsor!=iCur ); /*
1b690 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73   transitive cons
1b6a0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
1b6b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1b6c0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1b6d0 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
1b6e0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
1b6f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1b700 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
1b710 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
1b720 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
1b730 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1b740 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
1b750 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1b760 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  v, pX->op==TK_GT
1b770 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1b780 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f  erageIf(v, pX->o
1b790 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20  p==TK_LE);.     
1b7a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1b7b0 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  v, pX->op==TK_LT
1b7c0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1b7d0 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f  erageIf(v, pX->o
1b7e0 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20  p==TK_GE);.     
1b7f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b800 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1b810 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
1b820 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1b830 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1b840 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
1b850 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1b860 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
1b870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b880 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b890 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
1b8a0 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
1b8b0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
1b8c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1b8d0 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
1b8e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1b8f0 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 21  erageIf(v, bRev!
1b900 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  =0);.    }.    i
1b910 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  f( pEnd ){.     
1b920 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
1b930 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70   pX = pEnd->pExp
1b940 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1b950 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
1b960 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e 77  assert( (pEnd->w
1b970 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
1b980 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ULL)==0 );.     
1b990 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
1b9a0 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
1b9b0 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69  r ); /* Transiti
1b9c0 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
1b9d0 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
1b9e0 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ( pEnd->wtFlags 
1b9f0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1ba00 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61  ;.      memEndVa
1ba10 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lue = ++pParse->
1ba20 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
1ba30 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1ba40 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
1ba50 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20  memEndValue);.  
1ba60 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d      if( pX->op==
1ba70 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LT || pX->op=
1ba80 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20  =TK_GT ){.      
1ba90 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
1baa0 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b  ? OP_Le : OP_Ge;
1bab0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bac0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1bad0 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50  Rev ? OP_Lt : OP
1bae0 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _Gt;.      }.   
1baf0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1bb00 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
1bb10 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20    }.    start = 
1bb20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1bb30 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70  ntAddr(v);.    p
1bb40 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
1bb50 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
1bb60 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
1bb70 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
1bb80 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
1bb90 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  art;.    assert(
1bba0 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
1bbb0 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f 70  ;.    if( testOp
1bbc0 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
1bbd0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b     iRowidReg = +
1bbe0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1bbf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bc00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1bc10 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  id, iCur, iRowid
1bc20 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1bc30 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1bc40 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1bc50 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1bc60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bc70 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
1bc80 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20  p, memEndValue, 
1bc90 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52  addrBrk, iRowidR
1bca0 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  eg);.      VdbeC
1bcb0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73  overageIf(v, tes
1bcc0 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  tOp==OP_Le);.   
1bcd0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1bce0 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f  f(v, testOp==OP_
1bcf0 4c 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Lt);.      VdbeC
1bd00 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73  overageIf(v, tes
1bd10 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  tOp==OP_Ge);.   
1bd20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1bd30 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f  f(v, testOp==OP_
1bd40 47 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Gt);.      sqlit
1bd50 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1bd60 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
1bd70 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55  ERIC | SQLITE_JU
1bd80 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  MPIFNULL);.    }
1bd90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f  .  }else if( pLo
1bda0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1bdb0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
1bdc0 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20     /* Case 4: A 
1bdd0 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e  scan using an in
1bde0 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
1bdf0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57  **         The W
1be00 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20  HERE clause may 
1be10 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20  contain zero or 
1be20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20  more equality . 
1be30 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65     **         te
1be40 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e  rms ("==" or "IN
1be50 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61  " operators) tha
1be60 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e  t refer to the N
1be70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1be80 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1be90 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  s of the index. 
1bea0 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  It may also cont
1beb0 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ain.    **      
1bec0 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f     inequality co
1bed0 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c  nstraints (>, <,
1bee0 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68   >= or <=) on th
1bef0 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a  e indexed.    **
1bf00 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
1bf10 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  that immediately
1bf20 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65   follows the N e
1bf30 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20  qualities. Only 
1bf40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1bf50 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
1bf60 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20  olumn can be an 
1bf70 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65  inequality - the
1bf80 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a   rest must.    *
1bf90 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
1bfa0 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
1bfb0 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65  operators. For e
1bfc0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
1bfd0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1bfe0 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c  ndex is on (x,y,
1bff0 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  z), then the fol
1c000 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61  lowing clauses a
1c010 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20  re all .    **  
1c020 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64         optimized
1c030 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1c040 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20             x=5. 
1c050 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1c060 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20   x=5 AND y=10.  
1c070 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1c080 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  x=5 AND y<10.   
1c090 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1c0a0 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79  =5 AND y>5 AND y
1c0b0 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
1c0c0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1c0d0 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20  5 AND z<=10.    
1c0e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1c0f0 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20    The z<10 term 
1c100 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1c110 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
1c120 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20   only.    **    
1c130 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72       the x=5 ter
1c140 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m:.    **.    **
1c150 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1c160 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a  AND z<10.    **.
1c170 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e      **         N
1c180 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20   may be zero if 
1c190 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
1c1a0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1c1b0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
1c1c0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1c1d0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1c1e0 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20  traints, then N 
1c1f0 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20  is at.    **    
1c200 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a       least one..
1c210 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1c220 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
1c230 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
1c240 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
1c250 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
1c260 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
1c270 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
1c280 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
1c290 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
1c2a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c2b0 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
1c2c0 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
1c2d0 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
1c2e0 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20   BY..    */  .  
1c2f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1c300 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b  8 aStartOp[] = {
1c310 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
1c320 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69  0,.      OP_Rewi
1c330 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nd,           /*
1c340 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   2: (!start_cons
1c350 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1c360 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f  Eq &&  !bRev) */
1c370 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20  .      OP_Last, 
1c380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
1c390 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
1c3a0 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
1c3b0 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20   &&   bRev) */. 
1c3c0 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 54 2c 20       OP_SeekGT, 
1c3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20            /* 4: 
1c3e0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1c3f0 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1c400 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1c410 20 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 20 20 20     OP_SeekLT,   
1c420 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73          /* 5: (s
1c430 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1c440 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
1c450 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1c460 20 4f 50 5f 53 65 65 6b 47 45 2c 20 20 20 20 20   OP_SeekGE,     
1c470 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61        /* 6: (sta
1c480 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1c490 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21  &&  startEq && !
1c4a0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1c4b0 50 5f 53 65 65 6b 4c 45 20 20 20 20 20 20 20 20  P_SeekLE        
1c4c0 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74      /* 7: (start
1c4d0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1c4e0 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52    startEq &&  bR
1c4f0 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
1c500 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1c510 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20  8 aEndOp[] = {. 
1c520 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20       OP_IdxGE,  
1c530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
1c540 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1c550 20 26 26 20 21 62 52 65 76 20 26 26 20 21 65 6e   && !bRev && !en
1c560 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  dEq) */.      OP
1c570 5f 49 64 78 47 54 2c 20 20 20 20 20 20 20 20 20  _IdxGT,         
1c580 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f     /* 1: (end_co
1c590 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
1c5a0 65 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a 2f  ev &&  endEq) */
1c5b0 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 45 2c  .      OP_IdxLE,
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1c5d0 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1c5e0 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20 21  ts &&  bRev && !
1c5f0 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20  endEq) */.      
1c600 4f 50 5f 49 64 78 4c 54 2c 20 20 20 20 20 20 20  OP_IdxLT,       
1c610 20 20 20 20 20 2f 2a 20 33 3a 20 28 65 6e 64 5f       /* 3: (end_
1c620 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 20  constraints &&  
1c630 62 52 65 76 20 26 26 20 20 65 6e 64 45 71 29 20  bRev &&  endEq) 
1c640 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 31  */.    };.    u1
1c650 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  6 nEq = pLoop->u
1c660 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 20 20 20  .btree.nEq;     
1c670 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
1c680 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20  or IN terms */. 
1c690 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20     int regBase; 
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
1c6c0 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61   holding constra
1c6d0 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  int values */.  
1c6e0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1c6f0 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
1c700 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1c710 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1c720 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
1c730 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
1c740 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
1c750 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1c760 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
1c770 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
1c780 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
1c790 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c7a0 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
1c7b0 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1c7c0 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1c7f0 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
1c800 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
1c810 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
1c820 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
1c830 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
1c840 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
1c850 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1c860 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1c870 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1c880 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1c890 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1c8a0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1c8b0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1c8c0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
1c8d0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
1c8e0 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
1c8f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1c900 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1c910 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1c920 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
1c930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c940 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1c950 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
1c960 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
1c990 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
1c9a0 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9c0 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
1c9d0 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
1c9e0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
1c9f0 61 72 20 63 45 6e 64 41 66 66 20 3d 20 30 3b 20  ar cEndAff = 0; 
1ca00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
1ca10 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
1ca20 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
1ca30 6e 74 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 65  nt */.    u8 bSe
1ca40 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b 20  ekPastNull = 0; 
1ca50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
1ca60 6f 20 73 65 65 6b 20 70 61 73 74 20 69 6e 69 74  o seek past init
1ca70 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20 20  ial nulls */.   
1ca80 20 75 38 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20   u8 bStopAtNull 
1ca90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
1caa0 20 41 64 64 20 63 6f 6e 64 69 74 69 6f 6e 20 74   Add condition t
1cab0 6f 20 74 65 72 6d 69 6e 61 74 65 20 61 74 20 4e  o terminate at N
1cac0 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20 20 70 49 64  ULLs */..    pId
1cad0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
1cae0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
1caf0 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
1cb00 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 61 73  >iIdxCur;.    as
1cb10 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f 70  sert( nEq>=pLoop
1cb20 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20  ->u.btree.nSkip 
1cb30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
1cb40 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65  is loop satisfie
1cb50 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28  s a sort order (
1cb60 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73  pOrderBy) reques
1cb70 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77  t that .    ** w
1cb80 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  as passed to thi
1cb90 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d  s function to im
1cba0 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43  plement a "SELEC
1cbb0 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20  T min(x) ..." . 
1cbc0 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65     ** query, the
1cbd0 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  n the caller wil
1cbe0 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65  l only allow the
1cbf0 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72   loop to run for
1cc00 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65  .    ** a single
1cc10 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   iteration. This
1cc20 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1cc30 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e  first row return
1cc40 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  ed.    ** should
1cc50 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c   not have a NULL
1cc60 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
1cc70 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20   'x'. If column 
1cc80 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68  'x' is.    ** th
1cc90 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65  e first one afte
1cca0 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69  r the nEq equali
1ccb0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  ty constraints i
1ccc0 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20  n the index,.   
1ccd0 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72 65   ** this require
1cce0 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68  s some special h
1ccf0 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  andling..    */.
1cd00 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
1cd10 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a  fo->pOrderBy==0.
1cd20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e           || pWIn
1cd30 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
1cd40 78 70 72 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  xpr==1.         
1cd50 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
1cd60 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  lFlags&WHERE_ORD
1cd70 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a  ERBY_MIN)==0 );.
1cd80 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
1cd90 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
1cda0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d  E_ORDERBY_MIN)!=
1cdb0 30 0a 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f  0.     && pWInfo
1cdc0 2d 3e 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20 20  ->nOBSat>0.     
1cdd0 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  && (pIdx->nKeyCo
1cde0 6c 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  l>nEq).    ){.  
1cdf0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
1ce00 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
1ce10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 53 65  ==0 );.      bSe
1ce20 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a  ekPastNull = 1;.
1ce30 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
1ce40 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1ce50 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
1ce60 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ce70 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
1ce80 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
1ce90 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
1cea0 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
1ceb0 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  j = nEq;.    if(
1cec0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1ced0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1cee0 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
1cef0 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e  eStart = pLoop->
1cf00 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
1cf10 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
1cf20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1cf30 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1cf40 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1cf50 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
1cf60 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
1cf70 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
1cf80 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1cf90 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53       if( pRangeS
1cfa0 74 61 72 74 3d 3d 30 0a 20 20 20 20 20 20 20 26  tart==0.       &
1cfb0 26 20 28 6a 20 3d 20 70 49 64 78 2d 3e 61 69 43  & (j = pIdx->aiC
1cfc0 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20 0a  olumn[nEq])>=0 .
1cfd0 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
1cfe0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e  pTable->aCol[j].
1cff0 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20  notNull==0.     
1d000 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65 65   ){.        bSee
1d010 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  kPastNull = 1;. 
1d020 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d030 20 61 73 73 65 72 74 28 20 70 52 61 6e 67 65 45   assert( pRangeE
1d040 6e 64 3d 3d 30 20 7c 7c 20 28 70 52 61 6e 67 65  nd==0 || (pRange
1d050 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1d060 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
1d070 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
1d080 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
1d090 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
1d0a0 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
1d0b0 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e   or IN.    ** an
1d0c0 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  d store the valu
1d0d0 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
1d0e0 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  s in an array of
1d0f0 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
1d100 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  * starting at re
1d110 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  gBase..    */.  
1d120 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65    regBase = code
1d130 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
1d140 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62  (pParse,pLevel,b
1d150 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a  Rev,nExtraReg,&z
1d160 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61  StartAff);.    a
1d170 73 73 65 72 74 28 20 7a 53 74 61 72 74 41 66 66  ssert( zStartAff
1d180 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
1d190 72 6c 65 6e 33 30 28 7a 53 74 61 72 74 41 66 66  rlen30(zStartAff
1d1a0 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 20 20 69 66  )>=nEq );.    if
1d1b0 28 20 7a 53 74 61 72 74 41 66 66 20 29 20 63 45  ( zStartAff ) cE
1d1c0 6e 64 41 66 66 20 3d 20 7a 53 74 61 72 74 41 66  ndAff = zStartAf
1d1d0 66 5b 6e 45 71 5d 3b 0a 20 20 20 20 61 64 64 72  f[nEq];.    addr
1d1e0 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
1d1f0 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  drNxt;..    /* I
1d200 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1d210 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73   reverse order s
1d220 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  can on an ascend
1d230 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20  ing index, or.  
1d240 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f    ** a forward o
1d250 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64  rder scan on a d
1d260 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  escending index,
1d270 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65   interchange the
1d280 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61   .    ** start a
1d290 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52  nd end terms (pR
1d2a0 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52  angeStart and pR
1d2b0 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f  angeEnd)..    */
1d2c0 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49  .    if( (nEq<pI
1d2d0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20 62  dx->nKeyCol && b
1d2e0 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72  Rev==(pIdx->aSor
1d2f0 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c  tOrder[nEq]==SQL
1d300 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20  ITE_SO_ASC)).   
1d310 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49    || (bRev && pI
1d320 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45 71  dx->nKeyCol==nEq
1d330 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53  ).    ){.      S
1d340 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c  WAP(WhereTerm *,
1d350 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e   pRangeEnd, pRan
1d360 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  geStart);.      
1d370 53 57 41 50 28 75 38 2c 20 62 53 65 65 6b 50 61  SWAP(u8, bSeekPa
1d380 73 74 4e 75 6c 6c 2c 20 62 53 74 6f 70 41 74 4e  stNull, bStopAtN
1d390 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ull);.    }..   
1d3a0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1d3b0 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67  eStart && (pRang
1d3c0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
1d3d0 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b  r & WO_LE)!=0 );
1d3e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1d3f0 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28 70  RangeStart && (p
1d400 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1d410 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
1d420 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1d430 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1d440 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
1d450 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
1d460 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1d470 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
1d480 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65  (pRangeEnd->eOpe
1d490 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d  rator & WO_GE)!=
1d4a0 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71  0 );.    startEq
1d4b0 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20   = !pRangeStart 
1d4c0 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  || pRangeStart->
1d4d0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1d4e0 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65  LE|WO_GE);.    e
1d4f0 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65  ndEq =   !pRange
1d500 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64  End || pRangeEnd
1d510 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1d520 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
1d530 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1d540 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ts = pRangeStart
1d550 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20   || nEq>0;..    
1d560 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65  /* Seek the inde
1d570 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  x cursor to the 
1d580 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e  start of the ran
1d590 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73  ge. */.    nCons
1d5a0 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
1d5b0 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
1d5c0 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
1d5d0 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
1d5e0 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52  Start->pExpr->pR
1d5f0 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
1d600 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1d610 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
1d620 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
1d630 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74  if( (pRangeStart
1d640 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1d650 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  _VNULL)==0.     
1d660 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
1d670 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74  CanBeNull(pRight
1d680 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
1d690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d6a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
1d6b0 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
1d6c0 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
1d6d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1d6e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d6f0 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29   if( zStartAff )
1d700 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1d710 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1d720 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74  nity(pRight, zSt
1d730 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51  artAff[nEq])==SQ
1d740 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a  LITE_AFF_NONE){.
1d750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
1d760 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
1d770 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f  n is to be perfo
1d780 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e  rmed with no con
1d790 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  versions.       
1d7a0 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f     ** applied to
1d7b0 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73   the operands, s
1d7c0 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  et the affinity 
1d7d0 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67  to apply to pRig
1d7e0 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20  ht to .         
1d7f0 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   ** SQLITE_AFF_N
1d800 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ONE.  */.       
1d810 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
1d820 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
1d830 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
1d840 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1d850 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
1d860 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
1d870 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
1d880 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  q]) ){.         
1d890 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
1d8a0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1d8b0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1d8c0 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f     }  .      nCo
1d8d0 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1d8e0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1d8f0 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
1d900 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1d910 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1d920 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 29   bSeekPastNull )
1d930 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1d940 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d950 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65  Null, 0, regBase
1d960 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f  +nEq);.      nCo
1d970 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1d980 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20    startEq = 0;. 
1d990 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74       start_const
1d9a0 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20  raints = 1;.    
1d9b0 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41  }.    codeApplyA
1d9c0 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
1d9d0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
1d9e0 61 69 6e 74 20 2d 20 62 53 65 65 6b 50 61 73 74  aint - bSeekPast
1d9f0 4e 75 6c 6c 2c 20 7a 53 74 61 72 74 41 66 66 29  Null, zStartAff)
1da00 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72  ;.    op = aStar
1da10 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74  tOp[(start_const
1da20 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74  raints<<2) + (st
1da30 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76  artEq<<1) + bRev
1da40 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ];.    assert( o
1da50 70 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  p!=0 );.    sqli
1da60 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1da70 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
1da80 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
1da90 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
1daa0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1dab0 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
1dac0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1dad0 4f 50 5f 52 65 77 69 6e 64 29 3b 20 20 74 65 73  OP_Rewind);  tes
1dae0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65  tcase( op==OP_Re
1daf0 77 69 6e 64 20 29 3b 0a 20 20 20 20 56 64 62 65  wind );.    Vdbe
1db00 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1db10 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20 20 20 20 74  ==OP_Last);    t
1db20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1db30 4c 61 73 74 20 29 3b 0a 20 20 20 20 56 64 62 65  Last );.    Vdbe
1db40 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1db50 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 20 20 74  ==OP_SeekGT);  t
1db60 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1db70 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20 56 64  SeekGT );.    Vd
1db80 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1db90 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 29 3b 20  op==OP_SeekGE); 
1dba0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1dbb0 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20 20 20  P_SeekGE );.    
1dbc0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1dbd0 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45 29  , op==OP_SeekLE)
1dbe0 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1dbf0 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20  =OP_SeekLE );.  
1dc00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1dc10 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  (v, op==OP_SeekL
1dc20 54 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f  T);  testcase( o
1dc30 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 29 3b 0a  p==OP_SeekLT );.
1dc40 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
1dc50 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
1dc60 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1dc70 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  aint at the end 
1dc80 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61  of the.    ** ra
1dc90 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  nge (if any)..  
1dca0 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72    */.    nConstr
1dcb0 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
1dcc0 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b  if( pRangeEnd ){
1dcd0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1dce0 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d  ght = pRangeEnd-
1dcf0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
1dd00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1dd10 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
1dd20 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  rse, regBase+nEq
1dd30 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
1dd40 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1dd50 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
1dd60 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
1dd70 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e  if( (pRangeEnd->
1dd80 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1dd90 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 20  NULL)==0.       
1dda0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
1ddb0 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29 0a  nBeNull(pRight).
1ddc0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1ddd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dde0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1ddf0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
1de00 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20 20  drNxt);.        
1de10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1de20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1de30 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1de40 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1de50 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51 4c 49  , cEndAff)!=SQLI
1de60 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20 20 20  TE_AFF_NONE.    
1de70 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 45 78     && !sqlite3Ex
1de80 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1de90 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1dea0 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20 20 29  cEndAff).      )
1deb0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 41 70  {.        codeAp
1dec0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
1ded0 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  se, regBase+nEq,
1dee0 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b 0a 20   1, &cEndAff);. 
1def0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 6f       }.      nCo
1df00 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1df10 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1df20 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
1df30 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1df40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62  .    }else if( b
1df50 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a 20 20  StopAtNull ){.  
1df60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1df70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1df80 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
1df90 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71 20 3d  );.      endEq =
1dfa0 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74   0;.      nConst
1dfb0 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  raint++;.    }. 
1dfc0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1dfd0 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  (db, zStartAff);
1dfe0 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
1dff0 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
1e000 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1e010 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1e020 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
1e030 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
1e040 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
1e050 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
1e060 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
1e070 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74 72 61      if( nConstra
1e080 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 20  int ){.      op 
1e090 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a 32 20  = aEndOp[bRev*2 
1e0a0 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20 20 20  + endEq];.      
1e0b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e0c0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1e0d0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1e0e0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1e0f0 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  nt);.      testc
1e100 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
1e110 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  T );  VdbeCovera
1e120 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
1e130 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  dxGT );.      te
1e140 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
1e150 64 78 47 45 20 29 3b 20 20 56 64 62 65 43 6f 76  dxGE );  VdbeCov
1e160 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1e170 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20  P_IdxGE );.     
1e180 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1e190 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64 62 65  P_IdxLT );  Vdbe
1e1a0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1e1b0 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20  ==OP_IdxLT );.  
1e1c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e1d0 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20 20 56  ==OP_IdxLE );  V
1e1e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e1f0 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b   op==OP_IdxLE );
1e200 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
1e210 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75  eek the table cu
1e220 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65  rsor, if require
1e230 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65  d */.    disable
1e240 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
1e250 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64  ngeStart);.    d
1e260 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1e270 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20  l, pRangeEnd);. 
1e280 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c 65     if( omitTable
1e290 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49 64   ){.      /* pId
1e2a0 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  x is a covering 
1e2b0 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64 20  index.  No need 
1e2c0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d 61  to access the ma
1e2d0 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  in table. */.   
1e2e0 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f   }else if( HasRo
1e2f0 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  wid(pIdx->pTable
1e300 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  ) ){.      iRowi
1e310 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  dReg = ++pParse-
1e320 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1e330 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e340 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
1e350 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65  IdxCur, iRowidRe
1e360 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1e370 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
1e380 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
1e390 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1e3a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e3b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp2(v, OP_Seek
1e3c0 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
1e3d0 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64  g);  /* Deferred
1e3e0 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 65 6c   seek */.    }el
1e3f0 73 65 20 69 66 28 20 69 43 75 72 21 3d 69 49 64  se if( iCur!=iId
1e400 78 43 75 72 20 29 7b 0a 20 20 20 20 20 20 49 6e  xCur ){.      In
1e410 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
1e420 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1e430 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b  x(pIdx->pTable);
1e440 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1e450 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1e460 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
1e470 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
1e480 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1e490 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
1e4a0 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73  ){.        k = s
1e4b0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1e4c0 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61  dex(pIdx, pPk->a
1e4d0 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20  iColumn[j]);.   
1e4e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e4f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1e500 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c  umn, iIdxCur, k,
1e510 20 69 52 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20   iRowidReg+j);. 
1e520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1e530 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1e540 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
1e550 2c 20 69 43 75 72 2c 20 61 64 64 72 43 6f 6e 74  , iCur, addrCont
1e560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 69 52 6f               iRo
1e580 77 69 64 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65  widReg, pPk->nKe
1e590 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
1e5a0 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20  age(v);.    }.. 
1e5b0 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65     /* Record the
1e5c0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65   instruction use
1e5d0 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
1e5e0 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65  he loop. Disable
1e5f0 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63   .    ** WHERE c
1e600 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65  lause terms made
1e610 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68   redundant by th
1e620 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63  e index range sc
1e630 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  an..    */.    i
1e640 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1e650 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
1e660 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1e670 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
1e680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
1e690 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  ev ){.      pLev
1e6a0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76  el->op = OP_Prev
1e6b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e6c0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1e6d0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  OP_Next;.    }. 
1e6e0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1e6f0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 70 4c 65  iIdxCur;.    pLe
1e700 76 65 6c 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70  vel->p3 = (pLoop
1e710 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1e720 55 4e 51 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f  UNQ_WANTED)!=0 ?
1e730 20 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 28 70   1:0;.    if( (p
1e740 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1e750 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
1e760 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  )==0 ){.      pL
1e770 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
1e780 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
1e790 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20  LSCAN_STEP;.    
1e7a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1e7b0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
1e7c0 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  =0 );.    }.  }e
1e7d0 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
1e7e0 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
1e7f0 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70  MIZATION.  if( p
1e800 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1e810 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
1e820 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a  {.    /* Case 5:
1e830 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65    Two or more se
1e840 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64  parately indexed
1e850 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
1e860 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20   by OR.    **.  
1e870 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1e880 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52    **.    **   CR
1e890 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
1e8a0 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20  b,c,d);.    **  
1e8b0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
1e8c0 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a   ON t1(a);.    *
1e8d0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1e8e0 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20   i2 ON t1(b);.  
1e8f0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
1e900 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b  DEX i3 ON t1(c);
1e910 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1e920 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1e930 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62  1 WHERE a=5 OR b
1e940 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20  =7 OR (c=11 AND 
1e950 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20  d=13).    **.   
1e960 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70   ** In the examp
1e970 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  le, there are th
1e980 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ree indexed term
1e990 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
1e9a0 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f  R..    ** The to
1e9b0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f  p of the loop lo
1e9c0 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  oks like this:. 
1e9d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1e9e0 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
1e9f0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
1ea00 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
1ea10 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
1ea20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c   **.    ** Then,
1ea30 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65   for each indexe
1ea40 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c  d term, the foll
1ea50 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d  owing. The argum
1ea60 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52  ents to.    ** R
1ea70 6f 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75  owSetTest are su
1ea80 63 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69  ch that the rowi
1ea90 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
1eaa0 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64   row is inserted
1eab0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
1eac0 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69   RowSet. If it i
1ead0 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
1eae0 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73  t, control skips
1eaf0 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75   the.    ** Gosu
1eb00 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d  b opcode and jum
1eb10 70 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74  ps straight to t
1eb20 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
1eb30 64 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e  d by WhereEnd().
1eb40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1eb50 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
1eb60 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a  reBegin(<term>).
1eb70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1eb80 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20  RowSetTest      
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e              # In
1eba0 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20  sert rowid into 
1ebb0 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20  rowset.    **   
1ebc0 20 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20         Gosub    
1ebd0 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20    2 A.    **    
1ebe0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1ebf0 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20  End().    **.   
1ec00 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** Following th
1ec10 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f  e above, code to
1ec20 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
1ec30 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68  oop. Label A, th
1ec40 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20  e target.    ** 
1ec50 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f  of the Gosub abo
1ec60 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65  ve, jumps to the
1ec70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67   instruction rig
1ec80 68 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74  ht after the Got
1ec90 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  o..    **.    **
1eca0 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
1ecb0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
1ecc0 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
1ecd0 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
1ece0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ecf0 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20   Goto       B   
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54               # T
1ed10 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73  he loop is finis
1ed20 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  hed..    **.    
1ed30 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f  **       A: <loo
1ed40 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20  p body>         
1ed50 20 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e          # Return
1ed60 20 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e   data, whatever.
1ed70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ed80 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20          Return  
1ed90 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
1eda0 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20      # Jump back 
1edb0 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20  to the Gosub.   
1edc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1edd0 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c   B: <after the l
1ede0 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oop>.    **.    
1edf0 2a 2a 20 41 64 64 65 64 20 32 30 31 34 2d 30 35  ** Added 2014-05
1ee00 2d 32 36 3a 20 49 66 20 74 68 65 20 74 61 62 6c  -26: If the tabl
1ee10 65 20 69 73 20 61 20 57 49 54 48 4f 55 54 20 52  e is a WITHOUT R
1ee20 4f 57 49 44 20 74 61 62 6c 65 2c 20 74 68 65 6e  OWID table, then
1ee30 0a 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 20 65  .    ** use an e
1ee40 70 68 65 72 6d 65 72 61 6c 20 69 6e 64 65 78 20  phermeral index 
1ee50 69 6e 73 74 65 61 64 20 6f 66 20 61 20 52 6f 77  instead of a Row
1ee60 53 65 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68  Set to record th
1ee70 65 20 70 72 69 6d 61 72 79 0a 20 20 20 20 2a 2a  e primary.    **
1ee80 20 6b 65 79 73 20 6f 66 20 74 68 65 20 72 6f 77   keys of the row
1ee90 73 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  s we have alread
1eea0 79 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2a 0a 20  y seen..    **. 
1eeb0 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43     */.    WhereC
1eec0 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
1eed0 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
1eee0 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
1eef0 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
1ef00 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61    SrcList *pOrTa
1ef10 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  b;       /* Shor
1ef20 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74  tened table list
1ef30 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65   or OR-clause ge
1ef40 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
1ef50 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b  Index *pCov = 0;
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ef70 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69  Potential coveri
1ef80 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c  ng index (or NUL
1ef90 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  L) */.    int iC
1efa0 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  ovCur = pParse->
1efb0 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73  nTab++;  /* Curs
1efc0 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  or used for inde
1efd0 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29  x scans (if any)
1efe0 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67   */..    int reg
1eff0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
1f000 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  e->nMem;        
1f010 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75     /* Register u
1f020 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75  sed with OP_Gosu
1f030 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  b */.    int reg
1f040 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20  Rowset = 0;     
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f060 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
1f070 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  or RowSet object
1f080 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
1f090 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
1f0c0 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20  lding rowid */. 
1f0d0 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79     int iLoopBody
1f0e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1f0f0 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
1f100 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f  Start of loop bo
1f110 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52  dy */.    int iR
1f120 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  etInit;         
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1f150 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74  f regReturn init
1f160 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65   */.    int unte
1f170 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20  stedTerms = 0;  
1f180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
1f190 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d  me terms not com
1f1a0 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a  pletely tested *
1f1b0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 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 2f 2a 20 4c 6f 6f 70           /* Loop
1f1e0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
1f1f0 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d  Expr *pAndExpr =
1f200 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f210 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44     /* An ".. AND
1f220 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69   (...)" expressi
1f230 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  on */.    Table 
1f240 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
1f250 2d 3e 70 54 61 62 3b 0a 20 20 20 0a 20 20 20 20  ->pTab;.   .    
1f260 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1f270 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73  LTerm[0];.    as
1f280 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1f290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1f2a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1f2b0 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73   WO_OR );.    as
1f2c0 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
1f2d0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
1f2e0 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70  NFO)!=0 );.    p
1f2f0 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWc = &pTerm->u
1f300 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
1f310 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1f320 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  P_Return;.    pL
1f330 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65  evel->p1 = regRe
1f340 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  turn;..    /* Se
1f350 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69  t up a new SrcLi
1f360 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e  st in pOrTab con
1f370 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1f380 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a  e being scanned.
1f390 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c      ** by this l
1f3a0 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20  oop in the a[0] 
1f3b0 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74  slot and all not
1f3c0 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20  Ready tables in 
1f3d0 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20  a[1..] slots..  
1f3e0 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65    ** This become
1f3f0 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e  s the SrcList in
1f400 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
1f410 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
1f420 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20  ereBegin()..    
1f430 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  */.    if( pWInf
1f440 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20  o->nLevel>1 ){. 
1f450 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61       int nNotRea
1f460 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dy;             
1f470 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1f480 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61  r of notReady ta
1f490 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74  bles */.      st
1f4a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1f4b0 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20  m *origSrc;     
1f4c0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74  /* Original list
1f4d0 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
1f4e0 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20      nNotReady = 
1f4f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d  pWInfo->nLevel -
1f500 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20   iLevel - 1;.   
1f510 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69     pOrTab = sqli
1f520 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77  te3StackAllocRaw
1f530 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  (db,.           
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f550 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29   sizeof(*pOrTab)
1f560 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65  + nNotReady*size
1f570 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29  of(pOrTab->a[0])
1f580 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
1f590 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
1f5a0 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20  notReady;.      
1f5b0 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d  pOrTab->nAlloc =
1f5c0 20 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20   (u8)(nNotReady 
1f5d0 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54  + 1);.      pOrT
1f5e0 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61  ab->nSrc = pOrTa
1f5f0 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20  b->nAlloc;.     
1f600 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e   memcpy(pOrTab->
1f610 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a  a, pTabItem, siz
1f620 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b  eof(*pTabItem));
1f630 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d  .      origSrc =
1f640 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
1f650 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  t->a;.      for(
1f660 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64  k=1; k<=nNotRead
1f670 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
1f680 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d   memcpy(&pOrTab-
1f690 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b  >a[k], &origSrc[
1f6a0 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d  pLevel[k].iFrom]
1f6b0 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d  , sizeof(pOrTab-
1f6c0 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d  >a[k]));.      }
1f6d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f6e0 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66    pOrTab = pWInf
1f6f0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20  o->pTabList;.   
1f700 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   }..    /* Initi
1f710 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74  alize the rowset
1f720 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e   register to con
1f730 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51  tain NULL. An SQ
1f740 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a  L NULL is .    *
1f750 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
1f760 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e  an empty rowset.
1f770 20 20 4f 72 2c 20 63 72 65 61 74 65 20 61 6e 20    Or, create an 
1f780 65 70 68 65 72 6d 65 72 61 6c 20 69 6e 64 65 78  ephermeral index
1f790 0a 20 20 20 20 2a 2a 20 63 61 70 61 62 6c 65 20  .    ** capable 
1f7a0 6f 66 20 68 6f 6c 64 69 6e 67 20 70 72 69 6d 61  of holding prima
1f7b0 72 79 20 6b 65 79 73 20 69 6e 20 74 68 65 20 63  ry keys in the c
1f7c0 61 73 65 20 6f 66 20 61 20 57 49 54 48 4f 55 54  ase of a WITHOUT
1f7d0 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2a 0a 20   ROWID..    **. 
1f7e0 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69     ** Also initi
1f7f0 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20  alize regReturn 
1f800 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61  to contain the a
1f810 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
1f820 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a  struction .    *
1f830 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
1f840 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52  llowing the OP_R
1f850 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74  eturn at the bot
1f860 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  tom of the loop.
1f870 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
1f880 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65  required in a fe
1f890 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a  w obscure LEFT J
1f8a0 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20  OIN cases where 
1f8b0 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20  control jumps.  
1f8c0 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f    ** over the to
1f8d0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e  p of the loop in
1f8e0 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69  to the body of i
1f8f0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
1f900 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72  the .    ** corr
1f910 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72  ect response for
1f920 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70   the end-of-loop
1f930 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65   code (the OP_Re
1f940 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20  turn) is to .   
1f950 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   ** fall through
1f960 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
1f970 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61  truction, just a
1f980 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65  s an OP_Next doe
1f990 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s if.    ** call
1f9a0 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
1f9b0 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20  alized cursor.. 
1f9c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
1f9d0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1f9e0 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
1f9f0 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
1fa00 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
1fa10 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
1fa20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b     regRowset = +
1fa30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1fa40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1fa50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1fa60 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65  ull, 0, regRowse
1fa70 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
1fa80 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
1fa90 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
1faa0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
1fab0 62 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 52  b);.        regR
1fac0 6f 77 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e  owset = pParse->
1fad0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
1fae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1faf0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
1fb00 6d 65 72 61 6c 2c 20 72 65 67 52 6f 77 73 65 74  meral, regRowset
1fb10 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  , pPk->nKeyCol);
1fb20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fb30 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
1fb40 28 70 50 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20  (pParse, pPk);. 
1fb50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 67       }.      reg
1fb60 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
1fb70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
1fb80 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c    iRetInit = sql
1fb90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fba0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1fbb0 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
1fbc0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67    /* If the orig
1fbd0 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  inal WHERE claus
1fbe0 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f  e is z of the fo
1fbf0 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f  rm:  (x1 OR x2 O
1fc00 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20  R ...) AND y.   
1fc10 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65   ** Then for eve
1fc20 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c  ry term xN, eval
1fc30 75 61 74 65 20 61 73 20 74 68 65 20 73 75 62 65  uate as the sube
1fc40 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e  xpression: xN AN
1fc50 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  D z.    ** That 
1fc60 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20  way, terms in y 
1fc70 74 68 61 74 20 61 72 65 20 66 61 63 74 6f 72 65  that are factore
1fc80 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75  d into the disju
1fc90 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  nction will.    
1fca0 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  ** be picked up 
1fcb0 62 79 20 74 68 65 20 72 65 63 75 72 73 69 76 65  by the recursive
1fcc0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
1fcd0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 62 65  3WhereBegin() be
1fce0 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  low..    **.    
1fcf0 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63  ** Actually, eac
1fd00 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
1fd10 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  is converted to 
1fd20 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65  "xN AND w" where
1fd30 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65   w is.    ** the
1fd40 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74   "interesting" t
1fd50 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d  erms of z - term
1fd60 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f  s that did not o
1fd70 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a  riginate in the.
1fd80 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49      ** ON or USI
1fd90 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  NG clause of a L
1fda0 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65  EFT JOIN, and te
1fdb0 72 6d 73 20 74 68 61 74 20 61 72 65 20 75 73 61  rms that are usa
1fdc0 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69  ble as .    ** i
1fdd0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
1fde0 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d     ** This optim
1fdf0 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c  ization also onl
1fe00 79 20 61 70 70 6c 69 65 73 20 69 66 20 74 68 65  y applies if the
1fe10 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e   (x1 OR x2 OR ..
1fe20 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69  .) term.    ** i
1fe30 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
1fe40 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
1fe50 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
1fe60 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b  .    ** See tick
1fe70 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71  et http://www.sq
1fe80 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66  lite.org/src/inf
1fe90 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20 20  o/f2369304e4.   
1fea0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d   */.    if( pWC-
1feb0 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20  >nTerm>1 ){.    
1fec0 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20    int iTerm;.   
1fed0 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20     for(iTerm=0; 
1fee0 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d  iTerm<pWC->nTerm
1fef0 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; iTerm++){.    
1ff00 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1ff10 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  = pWC->a[iTerm].
1ff20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
1ff30 66 28 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d  f( &pWC->a[iTerm
1ff40 5d 20 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e  ] == pTerm ) con
1ff50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1ff60 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1ff70 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
1ff80 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75  mJoin) ) continu
1ff90 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e;.        testc
1ffa0 61 73 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72  ase( pWC->a[iTer
1ffb0 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m].wtFlags & TER
1ffc0 4d 5f 4f 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20  M_ORINFO );.    
1ffd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
1ffe0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c  C->a[iTerm].wtFl
1fff0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
20000 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AL );.        if
20010 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
20020 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
20030 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 56 49 52 54  ORINFO|TERM_VIRT
20040 55 41 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  UAL) ) continue;
20050 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
20060 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65  C->a[iTerm].eOpe
20070 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d  rator & WO_ALL)=
20080 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
20090 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
200a0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
200b0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
200c0 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
200d0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
200e0 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78  b, pAndExpr, pEx
200f0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
20100 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
20110 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  ){.        pAndE
20120 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
20130 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e  pr(pParse, TK_AN
20140 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20  D, 0, pAndExpr, 
20150 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
20160 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 61 20  }..    /* Run a 
20170 73 65 70 61 72 61 74 65 20 57 48 45 52 45 20 63  separate WHERE c
20180 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 74  lause for each t
20190 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c  erm of the OR cl
201a0 61 75 73 65 2e 20 20 41 66 74 65 72 0a 20 20 20  ause.  After.   
201b0 20 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6e 67 20   ** eliminating 
201c0 64 75 70 6c 69 63 61 74 65 73 20 66 72 6f 6d 20  duplicates from 
201d0 6f 74 68 65 72 20 57 48 45 52 45 20 63 6c 61 75  other WHERE clau
201e0 73 65 73 2c 20 74 68 65 20 61 63 74 69 6f 6e 20  ses, the action 
201f0 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20  for each.    ** 
20200 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65  sub-WHERE clause
20210 20 69 73 20 74 6f 20 74 6f 20 69 6e 76 6f 6b 65   is to to invoke
20220 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62   the main loop b
20230 6f 64 79 20 61 73 20 61 20 73 75 62 72 6f 75 74  ody as a subrout
20240 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
20250 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
20260 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  Wc->nTerm; ii++)
20270 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
20280 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f  m *pOrTerm = &pO
20290 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  rWc->a[ii];.    
202a0 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
202b0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
202c0 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  || (pOrTerm->eOp
202d0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
202e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57  !=0 ){.        W
202f0 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49  hereInfo *pSubWI
20300 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
20310 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
20320 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
20330 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
20340 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72  pOrExpr = pOrTer
20350 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75 72  m->pExpr; /* Cur
20360 72 65 6e 74 20 4f 52 20 63 6c 61 75 73 65 20 74  rent OR clause t
20370 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  erm */.        i
20380 6e 74 20 6a 31 20 3d 20 30 3b 20 20 20 20 20 20  nt j1 = 0;      
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
203a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d  * Address of jum
203b0 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  p operation */. 
203c0 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
203d0 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50  xpr && !ExprHasP
203e0 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c  roperty(pOrExpr,
203f0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
20400 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45  .          pAndE
20410 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72  xpr->pLeft = pOr
20420 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
20430 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78  pOrExpr = pAndEx
20440 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
20450 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
20460 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
20470 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
20480 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
20490 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66          pSubWInf
204a0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
204b0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f  Begin(pParse, pO
204c0 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30  rTab, pOrExpr, 0
204d0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
204f0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
20500 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f  SE | WHERE_AND_O
20510 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NLY |.          
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
20530 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
20540 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  | WHERE_ONETABLE
20550 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b  _ONLY, iCovCur);
20560 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20570 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50   pSubWInfo || pP
20580 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
20590 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
205a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
205b0 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ubWInfo ){.     
205c0 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
205d0 70 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  pSubLoop;.      
205e0 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
205f0 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  an(.            
20600 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62    pParse, pOrTab
20610 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b  , &pSubWInfo->a[
20620 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76  0], iLevel, pLev
20630 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20  el->iFrom, 0.   
20640 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
20650 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
20660 68 65 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  he sub-WHERE cla
20670 75 73 65 20 62 6f 64 79 2e 20 20 46 69 72 73 74  use body.  First
20680 20 73 6b 69 70 20 6f 76 65 72 0a 20 20 20 20 20   skip over.     
20690 20 20 20 20 20 2a 2a 20 64 75 70 6c 69 63 61 74       ** duplicat
206a0 65 20 72 6f 77 73 20 66 72 6f 6d 20 70 72 69 6f  e rows from prio
206b0 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75  r sub-WHERE clau
206c0 73 65 73 2c 20 61 6e 64 20 72 65 63 6f 72 64 20  ses, and record 
206d0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
206e0 20 72 6f 77 69 64 20 28 6f 72 20 50 52 49 4d 41   rowid (or PRIMA
206f0 52 59 20 4b 45 59 29 20 66 6f 72 20 74 68 65 20  RY KEY) for the 
20700 63 75 72 72 65 6e 74 20 72 6f 77 20 73 6f 20 74  current row so t
20710 68 61 74 20 74 68 65 20 73 61 6d 65 0a 20 20 20  hat the same.   
20720 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 77 69         ** row wi
20730 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69 6e  ll be skipped in
20740 20 73 75 62 73 65 71 75 65 6e 74 20 73 75 62 2d   subsequent sub-
20750 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 0a 20  WHERE clauses.. 
20760 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
20770 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
20780 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
20790 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
207a0 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
207b0 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20         int r;.  
207c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53            int iS
207d0 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63  et = ((ii==pOrWc
207e0 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69  ->nTerm-1)?-1:ii
207f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
20800 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
20810 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
20820 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78     r = sqlite3Ex
20830 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
20840 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 2d 31  pParse, pTab, -1
20850 2c 20 69 43 75 72 2c 20 72 65 67 52 6f 77 69 64  , iCur, regRowid
20860 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
20870 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
20880 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
20890 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20   OP_RowSetTest, 
208a0 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c  regRowset, 0, r,
208b0 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  iSet);.         
208c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
208d0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
208e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
208f0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
20900 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
20910 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
20920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20930 69 6e 74 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e  int nPk = pPk->n
20940 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
20950 20 20 20 20 20 20 69 6e 74 20 69 50 6b 3b 0a 0a        int iPk;..
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20970 20 52 65 61 64 20 74 68 65 20 50 4b 20 69 6e 74   Read the PK int
20980 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 65  o an array of te
20990 6d 70 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f  mp registers. */
209a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
209b0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
209c0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
209d0 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pk);.           
209e0 20 20 20 66 6f 72 28 69 50 6b 3d 30 3b 20 69 50     for(iPk=0; iP
209f0 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20  k<nPk; iPk++){. 
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
20a10 6e 74 20 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61  nt iCol = pPk->a
20a20 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20  iColumn[iPk];.  
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
20a40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
20a50 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
20a60 54 61 62 2c 20 69 43 6f 6c 2c 20 69 43 75 72 2c  Tab, iCol, iCur,
20a70 20 72 2b 69 50 6b 2c 20 30 29 3b 0a 20 20 20 20   r+iPk, 0);.    
20a80 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
20a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
20aa0 65 63 6b 20 69 66 20 74 68 65 20 74 65 6d 70 20  eck if the temp 
20ab0 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 63 6f  table already co
20ac0 6e 74 61 69 6e 73 20 74 68 69 73 20 6b 65 79 2e  ntains this key.
20ad0 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20 20   If so,.        
20ae0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77        ** the row
20af0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
20b00 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  n included in th
20b10 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
20b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
20b30 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  * can be ignored
20b40 20 28 62 79 20 6a 75 6d 70 69 6e 67 20 70 61 73   (by jumping pas
20b50 74 20 74 68 65 20 47 6f 73 75 62 20 62 65 6c 6f  t the Gosub belo
20b60 77 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  w). Otherwise,. 
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20b80 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20 69  insert the key i
20b90 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
20ba0 6c 65 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  le and proceed w
20bb0 69 74 68 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ith processing. 
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20bd0 74 68 65 20 72 6f 77 2e 0a 20 20 20 20 20 20 20  the row..       
20be0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20bf0 20 20 20 20 20 20 20 20 2a 2a 20 55 73 65 20 73          ** Use s
20c00 6f 6d 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ome of the same 
20c10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61 73  optimizations as
20c20 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20   OP_RowSetTest: 
20c30 49 66 20 69 53 65 74 0a 20 20 20 20 20 20 20 20  If iSet.        
20c40 20 20 20 20 20 20 2a 2a 20 69 73 20 7a 65 72 6f        ** is zero
20c50 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
20c60 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20 61 6c 72  e key cannot alr
20c70 65 61 64 79 20 62 65 20 70 72 65 73 65 6e 74 20  eady be present 
20c80 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  in.             
20c90 20 2a 2a 20 74 68 65 20 74 65 6d 70 20 74 61 62   ** the temp tab
20ca0 6c 65 2e 20 41 6e 64 20 69 66 20 69 53 65 74 20  le. And if iSet 
20cb0 69 73 20 2d 31 2c 20 61 73 73 75 6d 65 20 74 68  is -1, assume th
20cc0 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 0a  at there is no .
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20ce0 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20   need to insert 
20cf0 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65  the key into the
20d00 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61 73 20   temp table, as 
20d10 69 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 0a 20  it will never . 
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20d30 62 65 20 74 65 73 74 65 64 20 66 6f 72 2e 20 20  be tested for.  
20d40 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  */ .            
20d50 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20 20    if( iSet ){.  
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 31                j1
20d70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
20d80 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
20d90 75 6e 64 2c 20 72 65 67 52 6f 77 73 65 74 2c 20  und, regRowset, 
20da0 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20  0, r, nPk);.    
20db0 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
20dc0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
20dd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20de0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
20df0 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Set>=0 ){.      
20e00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20e10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
20e20 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 2c  P_MakeRecord, r,
20e30 20 6e 50 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b   nPk, regRowid);
20e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20e50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20e60 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p3(v, OP_IdxInse
20e70 72 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 72  rt, regRowset, r
20e80 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  egRowid, 0);.   
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
20ea0 20 69 53 65 74 20 29 20 73 71 6c 69 74 65 33 56   iSet ) sqlite3V
20eb0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
20ec0 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
20ed0 55 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULT);.          
20ee0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
20ef0 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20       /* Release 
20f00 74 68 65 20 61 72 72 61 79 20 6f 66 20 74 65 6d  the array of tem
20f10 70 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  p registers */. 
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
20f30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
20f40 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 2c 20  ange(pParse, r, 
20f50 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nPk);.          
20f60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
20f70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
20f80 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f  voke the main lo
20f90 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62  op body as a sub
20fa0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
20fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20fc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
20fd0 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69  ub, regReturn, i
20fe0 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
20ff0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
21000 72 65 20 28 73 6b 69 70 70 69 6e 67 20 74 68 65  re (skipping the
21010 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
21020 73 75 62 72 6f 75 74 69 6e 65 29 20 69 66 20 74  subroutine) if t
21030 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
21040 63 75 72 72 65 6e 74 20 73 75 62 2d 57 48 45 52  current sub-WHER
21050 45 20 72 6f 77 20 69 73 20 61 20 64 75 70 6c 69  E row is a dupli
21060 63 61 74 65 20 66 72 6f 6d 20 70 72 69 6f 72 20  cate from prior 
21070 73 75 62 2d 57 48 45 52 45 73 2e 20 2a 2f 0a 20  sub-WHEREs. */. 
21080 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 31 20           if( j1 
21090 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
210a0 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20  pHere(v, j1);.. 
210b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
210c0 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
210d0 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
210e0 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
210f0 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
21100 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
21110 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
21120 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
21130 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
21140 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
21150 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
21160 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
21170 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
21180 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
21190 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
211a0 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
211b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
211c0 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
211d0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
211e0 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
211f0 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
21200 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
21210 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
21220 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
21230 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
21240 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
21250 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
21260 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
21270 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
21280 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
21290 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
212a0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
212b0 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
212c0 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
212d0 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
212e0 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
212f0 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
21300 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
21310 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
21320 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
21330 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
21340 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
21350 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
21360 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
21370 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
21380 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
21390 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
213a0 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
213b0 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
213c0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
213d0 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
213e0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
213f0 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
21400 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
21410 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
21420 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
21430 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
21440 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
21450 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
21460 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
21470 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
21480 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
21490 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
214a0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
214b0 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
214c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
214d0 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20       pSubLoop = 
214e0 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
214f0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
21500 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c    assert( (pSubL
21510 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21520 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
21530 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
21540 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
21550 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21560 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
21570 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30         && (ii==0
21580 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e   || pSubLoop->u.
21590 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43  btree.pIndex==pC
215a0 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  ov).           &
215b0 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
215c0 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
215d0 65 79 49 6e 64 65 78 28 70 53 75 62 4c 6f 6f 70  eyIndex(pSubLoop
215e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
215f0 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
21600 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
21610 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  rt( pSubWInfo->a
21620 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f  [0].iIdxCur==iCo
21630 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20  vCur );.        
21640 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c      pCov = pSubL
21650 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
21660 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dex;.          }
21670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21680 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20    pCov = 0;.    
21690 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
216a0 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65     /* Finish the
216b0 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   loop through ta
216c0 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
216d0 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
216e0 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
216f0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
21700 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20  d(pSubWInfo);.  
21710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21720 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
21730 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43  ->u.pCovidx = pC
21740 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76  ov;.    if( pCov
21750 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   ) pLevel->iIdxC
21760 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20  ur = iCovCur;.  
21770 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
21780 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72  {.      pAndExpr
21790 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  ->pLeft = 0;.   
217a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
217b0 6c 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70  lete(db, pAndExp
217c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
217d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
217e0 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73  1(v, iRetInit, s
217f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
21800 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73  tAddr(v));.    s
21810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21820 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
21830 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
21840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
21850 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
21860 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
21870 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
21880 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33  evel>1 ) sqlite3
21890 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f  StackFree(db, pO
218a0 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21  rTab);.    if( !
218b0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20  untestedTerms ) 
218c0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
218d0 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65  el, pTerm);.  }e
218e0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
218f0 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
21900 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20  IMIZATION */..  
21910 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a  {.    /* Case 6:
21920 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73    There is no us
21930 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20  able index.  We 
21940 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65  must do a comple
21950 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
21960 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65     scan of the e
21970 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20  ntire table..   
21980 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
21990 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20  onst u8 aStep[] 
219a0 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f  = { OP_Next, OP_
219b0 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74  Prev };.    stat
219c0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
219d0 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69  rt[] = { OP_Rewi
219e0 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20  nd, OP_Last };. 
219f0 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d     assert( bRev=
21a00 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b  =0 || bRev==1 );
21a10 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65  .    if( pTabIte
21a20 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29  m->isRecursive )
21a30 7b 0a 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  {.      /* Table
21a40 73 20 6d 61 72 6b 65 64 20 69 73 52 65 63 75 72  s marked isRecur
21a50 73 69 76 65 20 68 61 76 65 20 6f 6e 6c 79 20 61  sive have only a
21a60 20 73 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74   single row that
21a70 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20   is stored in.  
21a80 20 20 20 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d      ** a pseudo-
21a90 63 75 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65 64  cursor.  No need
21aa0 20 74 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e 65   to Rewind or Ne
21ab0 78 74 20 73 75 63 68 20 63 75 72 73 6f 72 73 2e  xt such cursors.
21ac0 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   */.      pLevel
21ad0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
21ae0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21af0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53   pLevel->op = aS
21b00 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20  tep[bRev];.     
21b10 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
21b20 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
21b30 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
21b40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21b50 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43  aStart[bRev], iC
21b60 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
21b70 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
21b80 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a  If(v, bRev==0);.
21b90 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
21ba0 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29  geIf(v, bRev!=0)
21bb0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
21bc0 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
21bd0 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
21be0 53 54 45 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  STEP;.    }.  }.
21bf0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
21c00 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
21c10 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
21c20 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
21c30 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  tely.  ** comput
21c40 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72  ed using the cur
21c50 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c  rent set of tabl
21c60 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  es..  */.  for(p
21c70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
21c80 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
21c90 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
21ca0 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
21cb0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21cc0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
21cd0 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
21ce0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
21cf0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
21d00 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28  CODED );.    if(
21d10 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
21d20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
21d30 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
21d40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
21d50 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
21d60 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  l & pLevel->notR
21d70 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
21d80 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
21d90 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
21da0 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  s==0.           
21db0 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
21dc0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
21dd0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
21de0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57  )!=0 );.      pW
21df0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
21e00 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  rms = 1;.      c
21e10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
21e20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
21e30 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
21e40 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pE!=0 );.    i
21e50 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
21e60 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
21e70 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
21e80 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
21e90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
21ea0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
21eb0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
21ec0 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
21ed0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
21ee0 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77  L);.    pTerm->w
21ef0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
21f00 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ODED;.  }..  /* 
21f10 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
21f20 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20  est for implied 
21f30 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65  constraints base
21f40 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74  d on transitivit
21f50 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d  y.  ** of the "=
21f60 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  =" operator..  *
21f70 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  *.  ** Example: 
21f80 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
21f90 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31  use contains "t1
21fa0 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32  .a=t2.b" and "t2
21fb0 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64  .b=123".  ** and
21fc0 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74   we are coding t
21fd0 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74  he t1 loop and t
21fe0 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e  he t2 loop has n
21ff0 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20  ot yet coded,.  
22000 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f  ** then we canno
22010 74 20 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d  t use the "t1.a=
22020 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74  t2.b" constraint
22030 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64  , but we can cod
22040 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69  e.  ** the impli
22050 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f  ed "t1.a=123" co
22060 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
22070 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
22080 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
22090 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
220a0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
220b0 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57  E, *pEAlt;.    W
220c0 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a  hereTerm *pAlt;.
220d0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
220e0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
220f0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
22100 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
22110 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
22120 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55  perator!=(WO_EQU
22130 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74  IV|WO_EQ) ) cont
22140 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
22150 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
22160 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
22170 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
22180 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f  ->iLeftJoin ) co
22190 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d  ntinue;.    pE =
221a0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
221b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
221c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
221d0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a  EP_FromJoin) );.
221e0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
221f0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
22200 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  & pLevel->notRea
22210 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41  dy)!=0 );.    pA
22220 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  lt = findTerm(pW
22230 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e  C, iCur, pTerm->
22240 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f  u.leftColumn, no
22250 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
22260 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _IN, 0);.    if(
22270 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69   pAlt==0 ) conti
22280 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c  nue;.    if( pAl
22290 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  t->wtFlags & (TE
222a0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
222b0 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61  inue;.    testca
222c0 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61  se( pAlt->eOpera
222d0 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
222e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c     testcase( pAl
222f0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
22300 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65  O_IN );.    Vdbe
22310 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
22320 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74  , "begin transit
22330 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29  ive constraint")
22340 29 3b 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73  );.    pEAlt = s
22350 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
22360 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
22370 70 45 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28  pEAlt));.    if(
22380 20 70 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20   pEAlt ){.      
22390 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e  *pEAlt = *pAlt->
223a0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41  pExpr;.      pEA
223b0 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e  lt->pLeft = pE->
223c0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c  pLeft;.      sql
223d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
223e0 70 50 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61  pParse, pEAlt, a
223f0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
22400 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
22410 20 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46     sqlite3StackF
22420 72 65 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a  ree(db, pEAlt);.
22430 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
22440 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
22450 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
22460 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
22470 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
22480 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73  hat.  ** at leas
22490 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  t one row of the
224a0 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73   right table has
224b0 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66   matched the lef
224c0 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a  t table.  .  */.
224d0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
224e0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70  eftJoin ){.    p
224f0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
22500 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
22510 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
22520 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22530 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
22540 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 1, pLevel->iL
22550 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
22560 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
22570 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20  ecord LEFT JOIN 
22580 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  hit"));.    sqli
22590 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
225a0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66  r(pParse);.    f
225b0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
225c0 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65   j=0; j<pWC->nTe
225d0 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
225e0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
225f0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
22600 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
22610 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
22620 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
22630 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
22640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
22650 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
22660 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
22670 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
22680 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
22690 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
226a0 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  & pLevel->notRea
226b0 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
226c0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
226d0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
226e0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
226f0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
22700 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
22710 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
22720 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
22730 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  lse(pParse, pTer
22740 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f  m->pExpr, addrCo
22750 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
22760 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54  FNULL);.      pT
22770 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
22780 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
22790 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
227a0 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
227b0 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
227c0 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
227d0 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65 64 28  LED) && defined(
227e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
227f0 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a  EE_EXPLAIN)./*.*
22800 2a 20 47 65 6e 65 72 61 74 65 20 22 45 78 70 6c  * Generate "Expl
22810 61 6e 61 74 69 6f 6e 22 20 74 65 78 74 20 66 6f  anation" text fo
22820 72 20 61 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  r a WhereTerm..*
22830 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
22840 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 56  ereExplainTerm(V
22850 64 62 65 20 2a 76 2c 20 57 68 65 72 65 54 65 72  dbe *v, WhereTer
22860 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 63 68 61  m *pTerm){.  cha
22870 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 6d 65  r zType[4];.  me
22880 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e  mcpy(zType, "...
22890 22 2c 20 34 29 3b 0a 20 20 69 66 28 20 70 54 65  ", 4);.  if( pTe
228a0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
228b0 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79  RM_VIRTUAL ) zTy
228c0 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 69  pe[0] = 'V';.  i
228d0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
228e0 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20  tor & WO_EQUIV  
228f0 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27  ) zType[1] = 'E'
22900 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
22910 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
22920 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
22930 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20  n) ) zType[2] = 
22940 27 4c 27 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  'L';.  sqlite3Ex
22950 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22  plainPrintf(v, "
22960 25 73 20 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20  %s ", zType);.  
22970 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
22980 70 72 28 76 2c 20 70 54 65 72 6d 2d 3e 70 45 78  pr(v, pTerm->pEx
22990 70 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  pr);.}.#endif /*
229a0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
229b0 4c 45 44 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  LED && SQLITE_EN
229c0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
229d0 4e 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48  N */...#ifdef WH
229e0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
229f0 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57  ./*.** Print a W
22a00 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
22a10 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  for debugging pu
22a20 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
22a30 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50   void whereLoopP
22a40 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  rint(WhereLoop *
22a50 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  p, WhereClause *
22a60 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  pWC){.  WhereInf
22a70 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  o *pWInfo = pWC-
22a80 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e  >pWInfo;.  int n
22a90 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70  b = 1+(pWInfo->p
22aa0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29  TabList->nSrc+7)
22ab0 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  /8;.  struct Src
22ac0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
22ad0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
22ae0 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62  ist->a + p->iTab
22af0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
22b00 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
22b10 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22b20 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c  ntf("%c%2d.%0*ll
22b30 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49  x.%0*llx", p->cI
22b40 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
22b50 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c          p->iTab,
22b60 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66   nb, p->maskSelf
22b70 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29  , nb, p->prereq)
22b80 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
22b90 50 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a  Printf(" %12s",.
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bb0 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69       pItem->zAli
22bc0 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  as ? pItem->zAli
22bd0 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  as : pTab->zName
22be0 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46  );.  if( (p->wsF
22bf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
22c00 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b  TUALTABLE)==0 ){
22c10 0a 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  .     const char
22c20 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 66   *zName;.     if
22c30 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  ( p->u.btree.pIn
22c40 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  dex && (zName = 
22c50 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
22c60 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  x->zName)!=0 ){.
22c70 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
22c80 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
22c90 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37  _autoindex_", 17
22ca0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22cb0 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53  int i = sqlite3S
22cc0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d  trlen30(zName) -
22cd0 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   1;.        whil
22ce0 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  e( zName[i]!='_'
22cf0 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) i--;.        
22d00 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20  zName += i;.    
22d10 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
22d20 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25  3DebugPrintf(".%
22d30 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65  -16s %2d", zName
22d40 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  , p->u.btree.nEq
22d50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22d60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22d70 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22  Printf("%20s",""
22d80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
22d90 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
22da0 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62     if( p->u.vtab
22db0 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  .idxStr ){.     
22dc0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
22dd0 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22  intf("(%d,\"%s\"
22de0 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%x)",.         
22df0 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62         p->u.vtab
22e00 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
22e10 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e  ab.idxStr, p->u.
22e20 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
22e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22e40 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
22e50 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20  intf("(%d,%x)", 
22e60 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
22e70 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
22e80 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
22e90 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22ea0 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29  ntf(" %-19s", z)
22eb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
22ec0 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ee(z);.  }.  sql
22ed0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22ee0 22 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20  " f %05x N %d", 
22ef0 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e  p->wsFlags, p->n
22f00 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65  LTerm);.  sqlite
22f10 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63  3DebugPrintf(" c
22f20 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c  ost %d,%d,%d\n",
22f30 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72   p->rSetup, p->r
22f40 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 23  Run, p->nOut);.#
22f50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
22f60 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
22f70 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 30 78 31  .  /* If the 0x1
22f80 30 30 20 62 69 74 20 6f 66 20 77 68 65 72 65 74  00 bit of wheret
22f90 72 61 63 69 6e 67 20 69 73 20 73 65 74 2c 20 74  racing is set, t
22fa0 68 65 6e 20 73 68 6f 77 20 61 6c 6c 20 6f 66 20  hen show all of 
22fb0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20  the constraint. 
22fc0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
22fd0 69 6e 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  in the WhereLoop
22fe0 2e 61 4c 54 65 72 6d 5b 5d 20 61 72 72 61 79 2e  .aLTerm[] array.
22ff0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  .  */.  if( p->n
23000 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65  LTerm && (sqlite
23010 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
23020 31 30 30 29 21 3d 30 20 29 7b 20 20 2f 2a 20 57  100)!=0 ){  /* W
23030 48 45 52 45 54 52 41 43 45 20 30 78 31 30 30 20  HERETRACE 0x100 
23040 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
23050 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57 49 6e    Vdbe *v = pWIn
23060 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64 62  fo->pParse->pVdb
23070 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e;.    sqlite3Ex
23080 70 6c 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a 20  plainBegin(v);. 
23090 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
230a0 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  >nLTerm; i++){. 
230b0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
230c0 70 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  pTerm = p->aLTer
230d0 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[i];.      if( 
230e0 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
230f0 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nue;.      sqlit
23100 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
23110 76 2c 20 22 20 20 28 25 64 29 20 23 25 2d 32 64  v, "  (%d) #%-2d
23120 20 22 2c 20 69 2b 31 2c 20 28 69 6e 74 29 28 70   ", i+1, (int)(p
23130 54 65 72 6d 2d 70 57 43 2d 3e 61 29 29 3b 0a 20  Term-pWC->a));. 
23140 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
23150 61 69 6e 50 75 73 68 28 76 29 3b 0a 20 20 20 20  ainPush(v);.    
23160 20 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65    whereExplainTe
23170 72 6d 28 76 2c 20 70 54 65 72 6d 29 3b 0a 20 20  rm(v, pTerm);.  
23180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
23190 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20 20  inPop(v);.      
231a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
231b0 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
231c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e  qlite3ExplainFin
231d0 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ish(v);.    sqli
231e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
231f0 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65  %s", sqlite3Vdbe
23200 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b  Explanation(v));
23210 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 23 65  .  }.#endif.}.#e
23220 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ndif../*.** Conv
23230 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  ert bulk memory 
23240 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65  into a valid Whe
23250 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20  reLoop that can 
23260 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  be passed.** to 
23270 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68  whereLoopClear h
23280 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74  armlessly..*/.st
23290 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
232a0 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f  oopInit(WhereLoo
232b0 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65  p *p){.  p->aLTe
232c0 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70  rm = p->aLTermSp
232d0 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d  ace;.  p->nLTerm
232e0 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f   = 0;.  p->nLSlo
232f0 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d  t = ArraySize(p-
23300 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20  >aLTermSpace);. 
23310 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b   p->wsFlags = 0;
23320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
23330 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20  the WhereLoop.u 
23340 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68  union.  Leave Wh
23350 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69  ereLoop.pLTerm i
23360 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntact..*/.static
23370 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
23380 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65  learUnion(sqlite
23390 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
233a0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77   *p){.  if( p->w
233b0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
233c0 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45  VIRTUALTABLE|WHE
233d0 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29  RE_AUTO_INDEX) )
233e0 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  {.    if( (p->ws
233f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
23400 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26  RTUALTABLE)!=0 &
23410 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  & p->u.vtab.need
23420 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Free ){.      sq
23430 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e  lite3_free(p->u.
23440 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
23450 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65      p->u.vtab.ne
23460 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
23470 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53    p->u.vtab.idxS
23480 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  tr = 0;.    }els
23490 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67  e if( (p->wsFlag
234a0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
234b0 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75  NDEX)!=0 && p->u
234c0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
234d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
234e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
234f0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
23500 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73  ColAff);.      s
23510 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
23520 65 66 28 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  ef(p->u.btree.pI
23530 6e 64 65 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  ndex->pKeyInfo);
23540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
23550 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
23560 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree.pIndex);.   
23570 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
23580 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
23590 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61    }.}../*.** Dea
235a0 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c  llocate internal
235b0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
235c0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
235d0 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
235e0 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
235f0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
23600 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
23610 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
23620 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
23630 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23640 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77   p->aLTerm);.  w
23650 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
23660 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65  on(db, p);.  whe
23670 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d  reLoopInit(p);.}
23680 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ../*.** Increase
23690 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
236a0 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70  cation for pLoop
236b0 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65  ->aLTerm[] to be
236c0 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a   at least n..*/.
236d0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
236e0 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
236f0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
23700 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  p *p, int n){.  
23710 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65  WhereTerm **paNe
23720 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c  w;.  if( p->nLSl
23730 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53  ot>=n ) return S
23740 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20  QLITE_OK;.  n = 
23750 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65  (n+7)&~7;.  paNe
23760 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
23770 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
23780 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a  f(p->aLTerm[0])*
23790 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d  n);.  if( paNew=
237a0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
237b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63  TE_NOMEM;.  memc
237c0 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54  py(paNew, p->aLT
237d0 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  erm, sizeof(p->a
237e0 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53  LTerm[0])*p->nLS
237f0 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  lot);.  if( p->a
23800 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d  LTerm!=p->aLTerm
23810 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44  Space ) sqlite3D
23820 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54  bFree(db, p->aLT
23830 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72  erm);.  p->aLTer
23840 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e  m = paNew;.  p->
23850 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65  nLSlot = n;.  re
23860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23870 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
23880 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  r content from t
23890 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20  he second pLoop 
238a0 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a  into the first..
238b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
238c0 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69  ereLoopXfer(sqli
238d0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
238e0 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f  op *pTo, WhereLo
238f0 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68  op *pFrom){.  wh
23900 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
23910 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66  n(db, pTo);.  if
23920 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
23930 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  e(db, pTo, pFrom
23940 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20  ->nLTerm) ){.   
23950 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c   memset(&pTo->u,
23960 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e   0, sizeof(pTo->
23970 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  u));.    return 
23980 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23990 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20  }.  memcpy(pTo, 
239a0 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f  pFrom, WHERE_LOO
239b0 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65  P_XFER_SZ);.  me
239c0 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  mcpy(pTo->aLTerm
239d0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c  , pFrom->aLTerm,
239e0 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a   pTo->nLTerm*siz
239f0 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b  eof(pTo->aLTerm[
23a00 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  0]));.  if( pFro
23a10 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
23a20 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
23a30 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
23a40 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
23a50 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
23a60 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
23a70 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
23a80 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72  X)!=0 ){.    pFr
23a90 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  om->u.btree.pInd
23aa0 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ex = 0;.  }.  re
23ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
23ad0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
23ae0 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
23af0 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74  d whereLoopDelet
23b00 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
23b10 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
23b20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
23b30 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, p);.  sqlite3
23b40 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
23b50 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
23b60 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
23b70 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
23b80 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
23b90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
23ba0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
23bb0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57  .  if( ALWAYS(pW
23bc0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65  Info) ){.    whe
23bd0 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
23be0 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20  WInfo->sWC);.   
23bf0 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
23c00 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20  pLoops ){.      
23c10 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70  WhereLoop *p = p
23c20 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20  WInfo->pLoops;. 
23c30 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f       pWInfo->pLo
23c40 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ops = p->pNextLo
23c50 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  op;.      whereL
23c60 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
23c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23c80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
23c90 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Info);.  }.}../*
23ca0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
23cb0 69 66 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66  if both of the f
23cc0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
23cd0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
23ce0 58 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  X has the same o
23cf0 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
23d00 74 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20  t Y.**   (2)  X 
23d10 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
23d20 65 74 20 6f 66 20 59 0a 2a 2a 0a 2a 2a 20 42 79  et of Y.**.** By
23d30 20 22 70 72 6f 70 65 72 20 73 75 62 73 65 74 22   "proper subset"
23d40 20 77 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20   we mean that X 
23d50 75 73 65 73 20 66 65 77 65 72 20 57 48 45 52 45  uses fewer WHERE
23d60 20 63 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a   clause terms.**
23d70 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
23d80 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
23d90 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
23da0 20 58 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a   X is also used.
23db0 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49  ** by Y..**.** I
23dc0 66 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  f X is a proper 
23dd0 73 75 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e  subset of Y then
23de0 20 59 20 69 73 20 61 20 62 65 74 74 65 72 20 63   Y is a better c
23df0 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a  hoice and ought.
23e00 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77  ** to have a low
23e10 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72  er cost.  This r
23e20 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54  outine returns T
23e30 52 55 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f  RUE when that co
23e40 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73  st .** relations
23e50 68 69 70 20 69 73 20 69 6e 76 65 72 74 65 64 20  hip is inverted 
23e60 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
23e70 61 64 6a 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61  adjusted..*/.sta
23e80 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
23e90 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
23ea0 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68  bset(.  const Wh
23eb0 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20  ereLoop *pX,    
23ec0 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72     /* First Wher
23ed0 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65  eLoop to compare
23ee0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72   */.  const Wher
23ef0 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20  eLoop *pY       
23f00 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69   /* Compare agai
23f10 6e 73 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f  nst this WhereLo
23f20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  op */.){.  int i
23f30 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e  , j;.  if( pX->n
23f40 4c 54 65 72 6d 20 3e 3d 20 70 59 2d 3e 6e 4c 54  LTerm >= pY->nLT
23f50 65 72 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 20  erm ) return 0; 
23f60 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75  /* X is not a su
23f70 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 69  bset of Y */.  i
23f80 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70  f( pX->rRun >= p
23f90 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69  Y->rRun ){.    i
23fa0 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59  f( pX->rRun > pY
23fb0 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20  ->rRun ) return 
23fc0 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
23fd0 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
23fe0 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74      if( pX->nOut
23ff0 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65   > pY->nOut ) re
24000 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
24010 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
24020 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Y */.  }.  for(i
24030 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69  =pX->nLTerm-1; i
24040 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 66  >=0; i--){.    f
24050 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d  or(j=pY->nLTerm-
24060 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
24070 20 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54       if( pY->aLT
24080 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65  erm[j]==pX->aLTe
24090 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  rm[i] ) break;. 
240a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
240b0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
240c0 20 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20   X not a subset 
240d0 6f 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20  of Y since term 
240e0 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79  X[i] not used by
240f0 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75   Y */.  }.  retu
24100 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f  rn 1;  /* All co
24110 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f  nditions meet */
24120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
24130 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74   adjust the cost
24140 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54   of WhereLoop pT
24150 65 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73 20  emplate upwards 
24160 6f 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a  or downwards so.
24170 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  ** that:.**.**  
24180 20 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (1) pTemplate c
24190 6f 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61  osts less than a
241a0 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
241b0 6f 70 73 20 74 68 61 74 20 61 72 65 20 61 20 70  ops that are a p
241c0 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73  roper.**       s
241d0 75 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61  ubset of pTempla
241e0 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70  te.**.**   (2) p
241f0 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d  Template costs m
24200 6f 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68  ore than any oth
24210 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f  er WhereLoops fo
24220 72 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74  r which pTemplat
24230 65 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20  e.**       is a 
24240 70 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a  proper subset..*
24250 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65  *.** To say "Whe
24260 72 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72  reLoop X is a pr
24270 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
24280 22 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75  " means that X u
24290 73 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45  ses fewer.** WHE
242a0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
242b0 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20  than Y and that 
242c0 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
242d0 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20  se term used by 
242e0 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65  X is.** also use
242f0 64 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68  d by Y..**.** Th
24300 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
24310 20 6f 6d 69 74 74 65 64 20 66 6f 72 20 53 4b 49   omitted for SKI
24320 50 53 43 41 4e 20 6c 6f 6f 70 73 2e 20 20 49 6e  PSCAN loops.  In
24330 20 61 20 53 4b 49 50 53 43 41 4e 20 6c 6f 6f 70   a SKIPSCAN loop
24340 2c 20 74 68 65 0a 2a 2a 20 57 68 65 72 65 4c 6f  , the.** WhereLo
24350 6f 70 2e 6e 4c 54 65 72 6d 20 66 69 65 6c 64 20  op.nLTerm field 
24360 69 73 20 6e 6f 74 20 61 6e 20 61 63 63 75 72 61  is not an accura
24370 74 65 20 6d 65 61 73 75 72 65 20 6f 66 20 74 68  te measure of th
24380 65 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 52  e number of WHER
24390 45 0a 2a 2a 20 63 6c 61 75 73 65 20 74 65 72 6d  E.** clause term
243a0 73 20 63 6f 76 65 72 65 64 2c 20 73 69 6e 63 65  s covered, since
243b0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 66 69 72   some of the fir
243c0 73 74 20 6e 4c 54 65 72 6d 20 65 6e 74 72 69 65  st nLTerm entrie
243d0 73 20 69 6e 20 61 4c 54 65 72 6d 5b 5d 0a 2a 2a  s in aLTerm[].**
243e0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 28 62   will be NULL (b
243f0 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
24400 73 6b 69 70 70 65 64 29 2e 20 20 54 68 61 74 20  skipped).  That 
24410 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69  makes it more di
24420 66 66 69 63 75 6c 74 0a 2a 2a 20 74 6f 20 63 6f  fficult.** to co
24430 6d 70 61 72 65 20 74 68 65 20 6c 6f 6f 70 73 2e  mpare the loops.
24440 20 20 57 65 20 63 6f 75 6c 64 20 61 64 64 20 65    We could add e
24450 78 74 72 61 20 63 6f 64 65 20 74 6f 20 64 6f 20  xtra code to do 
24460 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  the comparison, 
24470 61 6e 64 0a 2a 2a 20 70 65 72 68 61 70 73 20 77  and.** perhaps w
24480 65 20 77 69 6c 6c 20 73 6f 6d 65 64 61 79 2e 20  e will someday. 
24490 20 42 75 74 20 53 4b 49 50 53 43 41 4e 20 69 73   But SKIPSCAN is
244a0 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20 75 6e   sufficiently un
244b0 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73  common, and this
244c0 0a 2a 2a 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  .** adjustment i
244d0 73 20 73 75 66 66 69 63 69 65 6e 74 20 6d 69 6e  s sufficient min
244e0 6f 72 2c 20 74 68 61 74 20 69 74 20 69 73 20 76  or, that it is v
244f0 65 72 79 20 64 69 66 66 69 63 75 6c 74 20 74 6f  ery difficult to
24500 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 61 20   construct.** a 
24510 74 65 73 74 20 63 61 73 65 20 77 68 65 72 65 20  test case where 
24520 74 68 65 20 65 78 74 72 61 20 63 6f 64 65 20 77  the extra code w
24530 6f 75 6c 64 20 69 6d 70 72 6f 76 65 20 74 68 65  ould improve the
24540 20 71 75 65 72 79 20 70 6c 61 6e 2e 20 20 42 65   query plan.  Be
24550 74 74 65 72 0a 2a 2a 20 74 6f 20 61 76 6f 69 64  tter.** to avoid
24560 20 74 68 65 20 61 64 64 65 64 20 63 6f 6d 70 6c   the added compl
24570 65 78 69 74 79 20 61 6e 64 20 6a 75 73 74 20 6f  exity and just o
24580 6d 69 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  mit cost adjustm
24590 65 6e 74 73 20 74 6f 20 53 4b 49 50 53 43 41 4e  ents to SKIPSCAN
245a0 0a 2a 2a 20 6c 6f 6f 70 73 2e 0a 2a 2f 0a 73 74  .** loops..*/.st
245b0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
245c0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f  oopAdjustCost(co
245d0 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
245e0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
245f0 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28  mplate){.  if( (
24600 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
24610 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
24620 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ED)==0 ) return;
24630 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
24640 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
24650 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20  RE_SKIPSCAN)!=0 
24660 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
24670 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c  ; p; p=p->pNextL
24680 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  oop){.    if( p-
24690 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65  >iTab!=pTemplate
246a0 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75  ->iTab ) continu
246b0 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  e;.    if( (p->w
246c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
246d0 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e  NDEXED)==0 ) con
246e0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
246f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
24700 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20  RE_SKIPSCAN)!=0 
24710 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24720 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  if( whereLoopChe
24730 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
24740 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29  (p, pTemplate) )
24750 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
24760 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  t pTemplate cost
24770 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61   downward so tha
24780 74 20 69 74 20 69 73 20 63 68 65 61 70 65 72 20  t it is cheaper 
24790 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20  than its .      
247a0 2a 2a 20 73 75 62 73 65 74 20 70 20 2a 2f 0a 20  ** subset p */. 
247b0 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
247c0 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
247d0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
247e0 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
247f0 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  - 1;.    }else i
24800 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  f( whereLoopChea
24810 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
24820 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b  pTemplate, p) ){
24830 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
24840 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20   pTemplate cost 
24850 75 70 77 61 72 64 20 73 6f 20 74 68 61 74 20 69  upward so that i
24860 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68  t is costlier th
24870 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20  an p since.     
24880 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73   ** pTemplate is
24890 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
248a0 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 70   of p */.      p
248b0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d  Template->rRun =
248c0 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20   p->rRun;.      
248d0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
248e0 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20  = p->nOut + 1;. 
248f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
24900 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c 69 73  * Search the lis
24910 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  t of WhereLoops 
24920 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69  in *ppPrev looki
24930 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 20  ng for one that 
24940 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c 61  can be.** suppla
24950 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  nted by pTemplat
24960 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
24970 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68 65 72  NULL if the Wher
24980 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74 61  eLoop list conta
24990 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74 68 61  ins an entry tha
249a0 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a 2a  t can supplant.*
249b0 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e 20  * pTemplate, in 
249c0 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 70  other words if p
249d0 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f  Template does no
249e0 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20  t belong on the 
249f0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  list..**.** If p
24a00 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  X is a WhereLoop
24a10 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74 65 20   that pTemplate 
24a20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74 68  can supplant, th
24a30 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  en return the.**
24a40 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74   link that point
24a50 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49  s to pX..**.** I
24a60 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 6e  f pTemplate cann
24a70 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e 79 20  ot supplant any 
24a80 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e 74  existing element
24a90 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75 74   of the list but
24aa0 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
24ab0 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73  added to the lis
24ac0 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  t, then return a
24ad0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24ae0 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69 73 74  tail of the list
24af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
24b00 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f  eLoop **whereLoo
24b10 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20 20 57  pFindLesser(.  W
24b20 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
24b30 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  v,.  const Where
24b40 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a  Loop *pTemplate.
24b50 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
24b60 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70 50  p;.  for(p=(*ppP
24b70 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65 76 3d  rev); p; ppPrev=
24b80 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70  &p->pNextLoop, p
24b90 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69  =*ppPrev){.    i
24ba0 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
24bb0 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70  plate->iTab || p
24bc0 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d  ->iSortIdx!=pTem
24bd0 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20  plate->iSortIdx 
24be0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65  ){.      /* If e
24bf0 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20 6f  ither the iTab o
24c00 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65  r iSortIdx value
24c10 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c  s for two WhereL
24c20 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65 6e  oop are differen
24c30 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  t.      ** then 
24c40 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73  those WhereLoops
24c50 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73   need to be cons
24c60 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65 6c  idered separatel
24c70 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20  y.  Neither is. 
24c80 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64       ** a candid
24c90 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74  ate to replace t
24ca0 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20  he other. */.   
24cb0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
24cc0 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65   }.    /* In the
24cd0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
24ce0 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65  ntation, the rSe
24cf0 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69 74  tup value is eit
24d00 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20  her zero.    ** 
24d10 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62  or the cost of b
24d20 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d  uilding an autom
24d30 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67  atic index (Nlog
24d40 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e  N) and the NlogN
24d50 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73  .    ** is the s
24d60 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62  ame for compatib
24d70 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a  le WhereLoops. *
24d80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
24d90 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54  >rSetup==0 || pT
24da0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d  emplate->rSetup=
24db0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
24dc0 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75       || p->rSetu
24dd0 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p==pTemplate->rS
24de0 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
24df0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
24e00 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72  e() always gener
24e10 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73  ates and inserts
24e20 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
24e30 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65  ndex.    ** case
24e40 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63   first.  Hence c
24e50 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64  ompatible candid
24e60 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ate WhereLoops n
24e70 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72 67  ever have a larg
24e80 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70  er.    ** rSetup
24e90 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55  . Call this SETU
24ea0 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20  P-INVARIANT */. 
24eb0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
24ec0 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
24ed0 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
24ee0 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e  /* Any loop usin
24ef0 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d  g an appliation-
24f00 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20 28 6f  defined index (o
24f10 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  r PRIMARY KEY or
24f20 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45 20 63  .    ** UNIQUE c
24f30 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74 68 20  onstraint) with 
24f40 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63  one or more == c
24f50 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 62 65  onstraints is be
24f60 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  tter.    ** than
24f70 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
24f80 64 65 78 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  dex. */.    if( 
24f90 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
24fa0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
24fb0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
24fc0 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
24fd0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
24fe0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
24ff0 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
25000 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
25010 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d  )!=0.     && (p-
25020 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
25030 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
25040 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a  emplate->prereq.
25050 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
25060 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
25070 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68  * If existing Wh
25080 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74  ereLoop p is bet
25090 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ter than pTempla
250a0 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61  te, pTemplate ca
250b0 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63  n be.    ** disc
250c0 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f  arded.  WhereLoo
250d0 70 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66  p p is better if
250e0 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20  :.    **   (1)  
250f0 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65  p has no more de
25100 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
25110 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20  pTemplate, and. 
25120 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68     **   (2)  p h
25130 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
25140 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
25150 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a  Template.    */.
25160 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
25170 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
25180 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
25190 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  eq    /* (1)  */
251a0 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
251b0 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
251c0 53 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20  Setup           
251d0 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a         /* (2a) *
251e0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
251f0 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n<=pTemplate->rR
25200 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
25210 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
25220 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  */.     && p->nO
25230 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut<=pTemplate->n
25240 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
25250 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29           /* (2c)
25260 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
25270 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44   return 0;  /* D
25280 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65  iscard pTemplate
25290 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
252a0 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69  * If pTemplate i
252b0 73 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20  s always better 
252c0 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75  than p, then cau
252d0 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77  se p to be overw
252e0 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69  ritten.    ** wi
252f0 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70  th pTemplate.  p
25300 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  Template is bett
25310 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20  er than p if:.  
25320 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d    **   (1)  pTem
25330 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72  plate has no mor
25340 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68  e dependences th
25350 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  an p, and.    **
25360 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74     (2)  pTemplat
25370 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f  e has an equal o
25380 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
25390 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n p..    */.    
253a0 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
253b0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
253c0 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  eq)==pTemplate->
253d0 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20  prereq   /* (1) 
253e0 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
253f0 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
25400 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25420 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
25430 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65   && p->nOut>=pTe
25440 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29           /* (2b)
25470 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
25480 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
25490 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
254a0 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55  Setup ); /* SETU
254b0 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76  P-INVARIANT abov
254c0 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  e */.      break
254d0 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74  ;   /* Cause p t
254e0 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
254f0 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
25500 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
25510 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f  urn ppPrev;.}../
25520 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
25530 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f  eplace a WhereLo
25540 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  op entry using t
25550 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70  he template supp
25560 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  lied..**.** An e
25570 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
25580 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65  p entry might be
25590 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
255a0 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
255b0 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e  .** is better an
255c0 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65  d has fewer depe
255d0 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68  ndencies.  Or th
255e0 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20  e template will 
255f0 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e  be ignored.** an
25600 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c  d no insert will
25610 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69   occur if an exi
25620 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
25630 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61  is faster and ha
25640 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e  s.** fewer depen
25650 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
25660 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65   template.  Othe
25670 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72  rwise a new Wher
25680 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65  eLoop is.** adde
25690 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74  d based on the t
256a0 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  emplate..**.** I
256b0 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
256c0 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  et is not NULL t
256d0 68 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75  hen we care abou
256e0 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72  t only the.** pr
256f0 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20  erequisites and 
25700 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f  rRun and nOut co
25710 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73  sts of the N bes
25720 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a  t loops.  That.*
25730 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * information is
25740 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65   gathered in the
25750 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
25760 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
25770 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65  special.** proce
25780 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  ssing mode is us
25790 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63  ed only for OR c
257a0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
257b0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63  ..**.** When acc
257c0 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70  umulating multip
257d0 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70  le loops (when p
257e0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
257f0 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
25800 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
25810 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
25820 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
25830 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
25840 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20  ** new template 
25850 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70  is better.  Loop
25860 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69  s may be overwri
25870 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c  tten if the foll
25880 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74  owing .** condit
25890 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  ions are met:.**
258a0 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79  .**    (1)  They
258b0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
258c0 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20  Tab..**    (2)  
258d0 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
258e0 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20  me iSortIdx..** 
258f0 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70     (3)  The temp
25900 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72  late has same or
25910 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
25920 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ies than the cur
25930 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
25940 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (4)  The templat
25950 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  e has the same o
25960 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
25970 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
25980 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  op.*/.static int
25990 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
259a0 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
259b0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65  r *pBuilder, Whe
259c0 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
259d0 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  e){.  WhereLoop 
259e0 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20  **ppPrev, *p;.  
259f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
25a00 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
25a10 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20  Info;.  sqlite3 
25a20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
25a30 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
25a40 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  If pBuilder->pOr
25a50 53 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20  Set is defined, 
25a60 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74  then only keep t
25a70 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74  rack of the cost
25a80 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65  s.  ** and prere
25a90 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  qs..  */.  if( p
25aa0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21  Builder->pOrSet!
25ab0 3d 30 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54  =0 ){.#if WHERET
25ac0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
25ad0 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65   u16 n = pBuilde
25ae0 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20  r->pOrSet->n;.  
25af0 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66    int x =.#endif
25b00 0a 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65  .    whereOrInse
25b10 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rt(pBuilder->pOr
25b20 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Set, pTemplate->
25b30 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74  prereq, pTemplat
25b40 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20  e->rRun,.       
25b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
25b70 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23  mplate->nOut);.#
25b80 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
25b90 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
25ba0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
25bb0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
25bc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25bd0 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
25be0 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
25bf0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
25c00 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
25c10 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
25c20 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
25c30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
25c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25c50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
25c60 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
25c70 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70  WhereLoop to rep
25c80 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c  lace with pTempl
25c90 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65  ate.  */.  where
25ca0 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70  LoopAdjustCost(p
25cb0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
25cc0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50  Template);.  ppP
25cd0 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  rev = whereLoopF
25ce0 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66  indLesser(&pWInf
25cf0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
25d00 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70  late);..  if( pp
25d10 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Prev==0 ){.    /
25d20 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20  * There already 
25d30 65 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f  exists a WhereLo
25d40 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74  op on the list t
25d50 68 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20  hat is better.  
25d60 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c    ** than pTempl
25d70 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e  ate, so just ign
25d80 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ore pTemplate */
25d90 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
25da0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
25db0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
25dc0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
25dd0 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
25de0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69  e3DebugPrintf("i
25df0 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20  ns-noop: ");.   
25e00 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
25e10 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
25e20 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
25e30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
25e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
25e50 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70   .  }else{.    p
25e60 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a   = *ppPrev;.  }.
25e70 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
25e80 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  h this point it 
25e90 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
25ea0 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  r p[] should be 
25eb0 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a  overwritten.  **
25ec0 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b   with pTemplate[
25ed0 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c  ] if p[] exists,
25ee0 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74   or if p==NULL t
25ef0 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  hen allocate a n
25f00 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f  ew.  ** WhereLoo
25f10 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e  p and insert it.
25f20 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54  .  */.#if WHERET
25f30 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
25f40 30 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  0x8 */.  if( sql
25f50 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
25f60 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20   0x8 ){.    if( 
25f70 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p!=0 ){.      sq
25f80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25f90 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a  ("ins-del:  ");.
25fa0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
25fb0 72 69 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72  rint(p, pBuilder
25fc0 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20  ->pWC);.    }.  
25fd0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25fe0 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20  intf("ins-new:  
25ff0 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  ");.    whereLoo
26000 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
26010 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
26020 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
26030 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  f( p==0 ){.    /
26040 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
26050 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64   WhereLoop to ad
26060 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  d to the end of 
26070 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  the list */.    
26080 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73 71  *ppPrev = p = sq
26090 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
260a0 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  (db, sizeof(Wher
260b0 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28  eLoop));.    if(
260c0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
260d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
260e0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
260f0 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c  );.    p->pNextL
26100 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  oop = 0;.  }else
26110 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c  {.    /* We will
26120 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20   be overwriting 
26130 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20  WhereLoop p[].  
26140 42 75 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f  But before we do
26150 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67  , first.    ** g
26160 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65  o through the re
26170 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61  st of the list a
26180 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74  nd delete any ot
26190 68 65 72 20 65 6e 74 72 69 65 73 20 62 65 73 69  her entries besi
261a0 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74  des.    ** p[] t
261b0 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70  hat are also sup
261c0 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c  plated by pTempl
261d0 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ate */.    Where
261e0 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20  Loop **ppTail = 
261f0 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20  &p->pNextLoop;. 
26200 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54     WhereLoop *pT
26210 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  oDel;.    while(
26220 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20   *ppTail ){.    
26230 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65    ppTail = where
26240 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70  LoopFindLesser(p
26250 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65  pTail, pTemplate
26260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70 54  );.      if( ppT
26270 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ail==0 ) break;.
26280 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a        pToDel = *
26290 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66  ppTail;.      if
262a0 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72  ( pToDel==0 ) br
262b0 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61  eak;.      *ppTa
262c0 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65  il = pToDel->pNe
262d0 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52  xtLoop;.#if WHER
262e0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
262f0 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69  * 0x8 */.      i
26300 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
26310 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
26320 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26330 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65  ugPrintf("ins-de
26340 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20  l:  ");.        
26350 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
26360 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
26370 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
26380 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
26390 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
263a0 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
263b0 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66   }.  whereLoopXf
263c0 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c  er(db, p, pTempl
263d0 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ate);.  if( (p->
263e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
263f0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
26400 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
26410 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72  Index = p->u.btr
26420 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
26430 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e  f( pIndex && pIn
26440 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a  dex->tnum==0 ){.
26450 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
26460 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
26470 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
26480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26490 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57  .** Adjust the W
264a0 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61  hereLoop.nOut va
264b0 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20  lue downward to 
264c0 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d  account for term
264d0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52  s of the.** WHER
264e0 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65  E clause that re
264f0 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70  ference the loop
26500 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
26510 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a  ot used by an.**
26520 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e   index..**.** In
26530 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
26540 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65  lementation, the
26550 20 66 69 72 73 74 20 65 78 74 72 61 20 57 48 45   first extra WHE
26560 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 72  RE clause term r
26570 65 64 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75  educes.** the nu
26580 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
26590 6f 77 73 20 62 79 20 61 20 66 61 63 74 6f 72 20  ows by a factor 
265a0 6f 66 20 31 30 20 61 6e 64 20 65 61 63 68 20 61  of 10 and each a
265b0 64 64 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a  dditional term.*
265c0 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  * reduces the nu
265d0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
265e0 6f 77 73 20 62 79 20 73 71 72 74 28 32 29 2e 0a  ows by sqrt(2)..
265f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
26600 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
26610 6a 75 73 74 28 57 68 65 72 65 43 6c 61 75 73 65  just(WhereClause
26620 20 2a 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70   *pWC, WhereLoop
26630 20 2a 70 4c 6f 6f 70 29 7b 0a 20 20 57 68 65 72   *pLoop){.  Wher
26640 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
26650 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  X;.  Bitmask not
26660 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f  Allowed = ~(pLoo
26670 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d  p->prereq|pLoop-
26680 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e  >maskSelf);.  in
26690 74 20 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21  t i, j;..  if( !
266a0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
266b0 6c 65 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  led(pWC->pWInfo-
266c0 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  >pParse->db, SQL
266d0 49 54 45 5f 41 64 6a 75 73 74 4f 75 74 45 73 74  ITE_AdjustOutEst
266e0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
266f0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43  .  }.  for(i=pWC
26700 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70  ->nTerm, pTerm=p
26710 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  WC->a; i>0; i--,
26720 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
26730 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  f( (pTerm->wtFla
26740 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
26750 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  L)!=0 ) break;. 
26760 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
26770 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
26780 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29  ->maskSelf)==0 )
26790 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
267a0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
267b0 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65  qAll & notAllowe
267c0 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  d)!=0 ) continue
267d0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f  ;.    for(j=pLoo
267e0 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d  p->nLTerm-1; j>=
267f0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; j--){.      p
26800 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  X = pLoop->aLTer
26810 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
26820 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pX==0 ) continue
26830 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
26840 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
26850 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61       if( pX->iPa
26860 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43  rent>=0 && (&pWC
26870 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d  ->a[pX->iParent]
26880 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b  )==pTerm ) break
26890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
268a0 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  j<0 ){.      pLo
268b0 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 54 65  op->nOut += (pTe
268c0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
268d0 20 3f 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50   ? pTerm->truthP
268e0 72 6f 62 20 3a 20 2d 31 29 3b 0a 20 20 20 20 7d  rob : -1);.    }
268f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65  .  }.}../*.** We
26900 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
26910 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
26920 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
26930 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
26940 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
26950 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
26960 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
26970 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26980 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
26990 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
269a0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
269b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
269c0 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
269d0 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
269e0 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
269f0 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
26a00 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
26a10 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
26a20 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
26a30 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
26a40 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
26a50 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
26a60 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
26a70 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
26a80 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
26a90 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
26aa0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
26ab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
26ac0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
26ad0 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
26ae0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
26af0 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
26b00 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
26b10 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
26b20 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
26b30 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
26b40 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
26b50 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
26b60 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b80 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
26b90 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
26ba0 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
26bb0 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
26bc0 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
26bd0 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
26be0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
26bf0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
26c00 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
26c10 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
26c20 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
26c30 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
26c40 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
26c50 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
26c60 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
26c70 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
26c80 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
26c90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
26ca0 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
26cb0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
26cc0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
26cd0 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
26ce0 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
26cf0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
26d00 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
26d10 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
26d20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
26d30 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
26d40 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
26d50 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
26d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
26d70 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
26d80 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
26d90 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
26da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26db0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
26dc0 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
26dd0 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
26de0 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
26df0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
26e00 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
26e10 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
26e20 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
26e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
26e40 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
26e50 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
26e60 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e80 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
26e90 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
26ea0 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
26eb0 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20   saved_nSkip;   
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ed0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
26ee0 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
26ef0 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73  nSkip */.  u32 s
26f00 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
26f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
26f20 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
26f30 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
26f40 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f  .  LogEst saved_
26f50 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
26f60 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
26f70 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
26f80 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ut */.  int iCol
26f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26fa0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
26fb0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   of the column i
26fc0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
26fd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26fe0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
26ff0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
27000 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
27010 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
27020 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68       /* Logarith
27030 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20  m of table size 
27040 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
27050 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20  pTop = 0, *pBtm 
27060 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20  = 0; /* Top and 
27070 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e  bottom range con
27080 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70  straints */..  p
27090 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
270a0 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pNew;.  if( db->
270b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
270c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
270d0 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  EM;..  assert( (
270e0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
270f0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
27100 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
27110 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
27120 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
27130 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
27140 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
27150 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
27160 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
27170 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
27180 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62   }else if( pProb
27190 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70  e->tnum<=0 || (p
271a0 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
271b0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
271c0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
271d0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
271e0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
271f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
27200 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
27210 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  IN|WO_ISNULL|WO_
27220 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
27230 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  O_LE;.  }.  if( 
27240 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
27250 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e  ed ) opMask &= ~
27260 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  (WO_GT|WO_GE|WO_
27270 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73  LT|WO_LE);..  as
27280 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
27290 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d  ree.nEq<=pProbe-
272a0 3e 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 69 66  >nKeyCol );.  if
272b0 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
272c0 6e 45 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 4b  nEq < pProbe->nK
272d0 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 69 43 6f  eyCol ){.    iCo
272e0 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  l = pProbe->aiCo
272f0 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72  lumn[pNew->u.btr
27300 65 65 2e 6e 45 71 5d 3b 0a 20 20 7d 65 6c 73 65  ee.nEq];.  }else
27310 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b  {.    iCol = -1;
27320 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77  .  }.  pTerm = w
27330 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
27340 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  an, pBuilder->pW
27350 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  C, pSrc->iCursor
27360 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  , iCol,.        
27370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27380 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  opMask, pProbe);
27390 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70  .  saved_nEq = p
273a0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
273b0 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20  ;.  saved_nSkip 
273c0 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
273d0 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e  nSkip;.  saved_n
273e0 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c  LTerm = pNew->nL
273f0 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73  Term;.  saved_ws
27400 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73  Flags = pNew->ws
27410 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70  Flags;.  saved_p
27420 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72  rereq = pNew->pr
27430 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f  ereq;.  saved_nO
27440 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ut = pNew->nOut;
27450 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
27460 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  = 0;.  rLogSize 
27470 3d 20 65 73 74 4c 6f 67 28 70 50 72 6f 62 65 2d  = estLog(pProbe-
27480 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29  >aiRowLogEst[0])
27490 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  ;..  /* Consider
274a0 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63   using a skip-sc
274b0 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  an if there are 
274c0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
274d0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
274e0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
274f0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
27500 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ms of the index,
27510 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72   and if the aver
27520 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
27530 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68  of repeats in th
27540 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
27550 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38  s is at least 18
27560 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
27570 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38   magic number 18
27580 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20   is selected on 
27590 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73  the basis that s
275a0 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a  canning 17 rows.
275b0 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61    ** is almost a
275c0 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68  lways quicker th
275d0 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b  an an index seek
275e0 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66   (even though if
275f0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
27600 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
27610 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65  han 2^17 rows we
27620 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73   assume otherwis
27630 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73  e in other parts
27640 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64   of.  ** the cod
27650 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66  e). And, even if
27660 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73   it is not, it s
27670 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f  hould not be too
27680 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20   much slower. . 
27690 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
276a0 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61   hand, the extra
276b0 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64   seeks could end
276c0 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66   up being signif
276d0 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72  icantly.  ** mor
276e0 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f  e expensive.  */
276f0 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73  .  assert( 42==s
27700 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29  qlite3LogEst(18)
27710 20 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d   );.  if( pTerm=
27720 3d 30 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  =0.   && saved_n
27730 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
27740 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
27750 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
27760 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
27770 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
27780 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
27790 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
277a0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
277b0 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
277c0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
277d0 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
277e0 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
277f0 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
27800 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
27810 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27820 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ++;.    pNew->u.
27830 62 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20  btree.nSkip++;. 
27840 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
27850 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
27860 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
27870 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27880 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
27890 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ter = pProbe->ai
278a0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
278b0 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
278c0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
278d0 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65  _nEq+1];.    pNe
278e0 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72  w->nOut -= nIter
278f0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41  ;.    whereLoopA
27900 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
27910 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
27920 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e  obe, nIter + nIn
27930 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Mul);.    pNew->
27940 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
27950 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72  t;.  }.  for(; r
27960 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27970 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20  pTerm!=0; pTerm 
27980 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
27990 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36  &scan)){.    u16
279a0 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f   eOp = pTerm->eO
279b0 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68  perator;   /* Sh
279c0 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72  orthand for pTer
279d0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  m->eOperator */.
279e0 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
279f0 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20  Idx;.    LogEst 
27a00 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20  nOutUnadjusted; 
27a10 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62         /* nOut b
27a20 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57  efore IN() and W
27a30 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73  HERE adjustments
27a40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20   */.    int nIn 
27a50 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
27a60 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
27a70 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74  OR_STAT4.    int
27a80 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
27a90 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
27aa0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
27ab0 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   (eOp==WO_ISNULL
27ac0 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   || (pTerm->wtFl
27ad0 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21  ags&TERM_VNULL)!
27ae0 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f  =0).     && (iCo
27af0 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61  l<0 || pSrc->pTa
27b00 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
27b10 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20  tNull).    ){.  
27b20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
27b30 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d   ignore IS [NOT]
27b40 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
27b50 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  s on NOT NULL co
27b60 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
27b70 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
27b80 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
27b90 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
27ba0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77  tinue;..    pNew
27bb0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
27bc0 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
27bd0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27be0 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
27bf0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
27c00 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
27c10 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
27c20 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
27c30 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
27c40 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
27c50 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
27c60 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
27c70 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
27c80 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
27c90 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
27ca0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
27cb0 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
27cc0 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73  skSelf;..    ass
27cd0 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  ert( nInMul==0. 
27ce0 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
27cf0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27d00 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30  _COLUMN_NULL)!=0
27d10 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
27d20 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
27d30 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d  ERE_COLUMN_IN)!=
27d40 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  0 .        || (p
27d50 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
27d60 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d  HERE_SKIPSCAN)!=
27d70 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  0 .    );..    i
27d80 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  f( eOp & WO_IN )
27d90 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
27da0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
27db0 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
27dc0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27dd0 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
27de0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
27df0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
27e00 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
27e10 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
27e20 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
27e30 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
27e40 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
27e50 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  s */.        nIn
27e60 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
27e70 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  46==sqlite3LogEs
27e80 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d  t(25) );.      }
27e90 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
27ea0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26  pExpr->x.pList &
27eb0 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
27ec0 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
27ed0 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61      /* "x IN (va
27ee0 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
27ef0 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e  " */.        nIn
27f00 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
27f10 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
27f20 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
27f30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
27f40 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
27f50 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
27f60 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
27f70 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20    ** changes "x 
27fa0 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d  IN (?)" into "x=
27fb0 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73  ?". */..    }els
27fc0 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
27fd0 45 51 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  EQ) ){.      pNe
27fe0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
27ff0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
28000 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
28010 7c 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26  || (nInMul==0 &&
28020 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28030 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
28040 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Col-1) ){.      
28050 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
28060 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72   pProbe->onError
28070 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  ==OE_None ){.   
28080 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
28090 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
280a0 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20  Q_WANTED;.      
280b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
280c0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
280d0 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
280e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
280f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
28100 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
28110 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  L ){.      pNew-
28120 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28130 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
28140 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
28150 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
28160 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
28170 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20  se( eOp & WO_GT 
28180 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
28190 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29  e( eOp & WO_GE )
281a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
281b0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
281c0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
281d0 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
281e0 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
281f0 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
28200 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28210 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
28220 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
28230 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28240 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
28250 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28260 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
28270 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
28280 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
28290 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
282a0 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
282b0 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pTop = pTerm;.  
282c0 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77      pBtm = (pNew
282d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
282e0 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20  E_BTM_LIMIT)!=0 
282f0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
28300 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
28310 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
28320 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a  -2] : 0;.    }..
28330 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
28340 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  oint pNew->nOut 
28350 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
28360 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
28370 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  ected to.    ** 
28380 62 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68  be visited by th
28390 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66  e index scan bef
283a0 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ore considering 
283b0 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74  term pTerm, or t
283c0 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
283d0 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d   of nIn and nInM
283e0 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ul. In other wor
283f0 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ds, assuming tha
28400 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78  t all .    ** "x
28410 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20   IN(...)" terms 
28420 61 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74  are replaced wit
28430 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20  h "x = ?". This 
28440 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20  block updates.  
28450 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
28460 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20  f pNew->nOut to 
28470 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72  account for pTer
28480 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e  m (but not nIn/n
28490 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20  InMul).  */.    
284a0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
284b0 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
284c0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ;.    if( pNew->
284d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
284e0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
284f0 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
28500 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33  nOut using stat3
28510 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c  /stat4 data. Or,
28520 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
28530 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20  stat3/stat4.    
28540 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67    ** data, using
28550 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69   some other esti
28560 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mate.  */.      
28570 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
28580 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
28590 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  er, pBtm, pTop, 
285a0 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pNew);.    }else
285b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  {.      int nEq 
285c0 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65  = ++pNew->u.btre
285d0 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73  e.nEq;.      ass
285e0 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49  ert( eOp & (WO_I
285f0 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49  SNULL|WO_EQ|WO_I
28600 4e 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  N) );..      ass
28610 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
28620 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
28630 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
28640 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
28650 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
28660 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
28670 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
28680 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
28690 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
286a0 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
286b0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
286c0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
286d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
286e0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
286f0 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
28700 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
28710 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20  3_OR_STAT4.     
28720 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
28730 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
28740 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20   nInMul==0 .    
28750 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
28760 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
28770 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
28780 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
28790 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
287a0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
287b0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
287c0 51 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20  QLITE_Stat3) .  
287d0 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20         && ((eOp 
287e0 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21  & WO_IN)==0 || !
287f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
28800 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
28810 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20  _xIsSelect)).   
28820 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
28830 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
28840 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
28850 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
28860 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
28870 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ULL))!=0 ){.    
28880 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28890 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b  ( eOp & WO_EQ );
288a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
288b0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
288c0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
288d0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
288e0 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
288f0 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
28900 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
28910 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
28920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28930 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53     rc = whereInS
28940 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
28950 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
28960 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b  x.pList, &nOut);
28970 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
28990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
289a0 6e 4f 75 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  nOut>0 );.      
289b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
289c0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63  TE_NOTFOUND ) rc
289d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
289e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
289f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
28a00 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  k;          /* J
28a10 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70  ump out of the p
28a20 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  Term loop */.   
28a30 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20         if( nOut 
28a40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
28a50 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69  New->nOut = sqli
28a60 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b  te3LogEst(nOut);
28a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28a80 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65   pNew->nOut>save
28a90 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e  d_nOut ) pNew->n
28aa0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
28ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  ;.            pN
28ac0 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
28ad0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
28af0 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e  f( nOut==0 ).#en
28b00 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
28b10 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
28b20 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61  ut += (pProbe->a
28b30 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20  iRowLogEst[nEq] 
28b40 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  - pProbe->aiRowL
28b50 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20  ogEst[nEq-1]);. 
28b60 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70           if( eOp
28b70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
28b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28b90 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
28ba0 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64  is no likelihood
28bb0 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65  () value, assume
28bc0 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 20   that a .       
28bd0 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20       ** "col IS 
28be0 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e  NULL" expression
28bf0 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20 61   matches twice a
28c00 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20  s many rows .   
28c10 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28           ** as (
28c20 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20  col=?). */.     
28c30 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
28c40 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20  t += 10;.       
28c50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28c60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
28c70 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64    /* Set rCostId
28c80 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66  x to the cost of
28c90 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74   visiting select
28ca0 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78  ed rows in index
28cb0 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20  . Add.    ** it 
28cc0 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77  to pNew->rRun, w
28cd0 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c  hich is currentl
28ce0 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73  y set to the cos
28cf0 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20  t of the index. 
28d00 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e     ** seek only.
28d10 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69   Then, if this i
28d20 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  s a non-covering
28d30 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20   index, add the 
28d40 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76  cost of.    ** v
28d50 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73  isiting the rows
28d60 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
28d70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73  le.  */.    rCos
28d80 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  tIdx = pNew->nOu
28d90 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f  t + 1 + (15*pPro
28da0 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53  be->szIdxRow)/pS
28db0 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52  rc->pTab->szTabR
28dc0 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52  ow;.    pNew->rR
28dd0 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
28de0 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20  stAdd(rLogSize, 
28df0 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69  rCostIdx);.    i
28e00 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
28e10 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
28e20 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d  NLY|WHERE_IPK))=
28e30 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  =0 ){.      pNew
28e40 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
28e50 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
28e60 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74  rRun, pNew->nOut
28e70 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 0a 20   + 16);.    }.. 
28e80 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65     nOutUnadjuste
28e90 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  d = pNew->nOut;.
28ea0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
28eb0 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
28ec0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
28ed0 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
28ee0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
28ef0 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64  putAdjust(pBuild
28f00 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a  er->pWC, pNew);.
28f10 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
28f20 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
28f30 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69  r, pNew);..    i
28f40 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
28f50 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
28f60 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 70  RANGE ){.      p
28f70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
28f80 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  d_nOut;.    }els
28f90 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  e{.      pNew->n
28fa0 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75  Out = nOutUnadju
28fb0 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  sted;.    }..   
28fc0 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
28fd0 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
28fe0 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26  LIMIT)==0.     &
28ff0 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
29000 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq<(pProbe->nKe
29010 79 43 6f 6c 20 2b 20 28 70 50 72 6f 62 65 2d 3e  yCol + (pProbe->
29020 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29  zName!=0)).    )
29030 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
29040 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
29050 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
29060 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49  Probe, nInMul+nI
29070 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  n);.    }.    pN
29080 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
29090 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51  _nOut;.#ifdef SQ
290a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
290b0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70  3_OR_STAT4.    p
290c0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
290d0 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
290e0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65  #endif.  }.  pNe
290f0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65  w->prereq = save
29100 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77  d_prereq;.  pNew
29110 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
29120 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65  saved_nEq;.  pNe
29130 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  w->u.btree.nSkip
29140 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a   = saved_nSkip;.
29150 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
29160 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
29170 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20  .  pNew->nOut = 
29180 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e  saved_nOut;.  pN
29190 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
291a0 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74  ed_nLTerm;.  ret
291b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
291c0 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   Return True if 
291d0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
291e0 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74  hat pIndex might
291f0 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a   be useful in.**
29200 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
29210 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
29220 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a  e in pBuilder..*
29230 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73  *.** Return Fals
29240 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f  e if pBuilder do
29250 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
29260 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
29270 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  e or.** if there
29280 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70   is no way for p
29290 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66  Index to be usef
292a0 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69  ul in implementi
292b0 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52  ng that.** ORDER
292c0 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73   BY clause..*/.s
292d0 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d  tatic int indexM
292e0 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
292f0 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  rBy(.  WhereLoop
29300 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
29310 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  r,.  Index *pInd
29320 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f  ex,.  int iCurso
29330 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  r.){.  ExprList 
29340 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20  *pOB;.  int ii, 
29350 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65  jj;..  if( pInde
29360 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  x->bUnordered ) 
29370 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
29380 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d  (pOB = pBuilder-
29390 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  >pWInfo->pOrderB
293a0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)==0 ) return 0
293b0 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
293c0 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  <pOB->nExpr; ii+
293d0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
293e0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
293f0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42  rSkipCollate(pOB
29400 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a  ->a[ii].pExpr);.
29410 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
29420 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
29430 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
29440 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
29450 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
29460 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
29470 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
29480 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
29490 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
294a0 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
294b0 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
294c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
294d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
294e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
294f0 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65   a bitmask where
29500 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61   1s indicate tha
29510 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
29520 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  ing column of.**
29530 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73   the table is us
29540 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20  ed by an index. 
29550 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
29560 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63  63 columns are c
29570 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74  onsidered..*/.st
29580 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c  atic Bitmask col
29590 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65  umnsInIndex(Inde
295a0 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d  x *pIdx){.  Bitm
295b0 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74  ask m = 0;.  int
295c0 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78   j;.  for(j=pIdx
295d0 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d  ->nColumn-1; j>=
295e0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; j--){.    int
295f0 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
29600 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
29610 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  x>=0 ){.      te
29620 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
29630 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
29640 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a  se( x==BMS-2 );.
29650 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
29660 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54  1 ) m |= MASKBIT
29670 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (x);.    }.  }. 
29680 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
29690 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
296a0 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
296b0 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65 78   with pPartIndex
296c0 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73 65  Where can be use
296d0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  d.** in the curr
296e0 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74 75  ent query.  Retu
296f0 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61  rn true if it ca
29700 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69  n be and false i
29710 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
29720 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65   int whereUsable
29730 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74  PartialIndex(int
29740 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75   iTab, WhereClau
29750 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
29760 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Where){.  int i;
29770 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
29780 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  erm;.  for(i=0, 
29790 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
297a0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
297b0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
297c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  f( sqlite3ExprIm
297d0 70 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d 2d  pliesExpr(pTerm-
297e0 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20  >pExpr, pWhere, 
297f0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
29800 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
29810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
29820 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
29830 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ects for a singl
29840 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
29850 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61  oin where the ta
29860 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69  ble.** is idenfi
29870 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
29880 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
29890 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
298a0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
298b0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
298c0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
298d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
298e0 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
298f0 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
29900 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
29910 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
29920 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
29930 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
29940 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
29950 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
29960 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
29970 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
29980 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
29990 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
299a0 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
299b0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
299c0 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
299d0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299f0 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
29a00 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
29a10 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
29a20 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
29a30 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
29a40 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
29a50 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
29a60 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
29a70 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
29a80 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
29a90 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
29aa0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
29ab0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
29ac0 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
29ad0 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
29ae0 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
29af0 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
29b00 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
29b10 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
29b20 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
29b30 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
29b40 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
29b50 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
29b60 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
29b70 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
29b80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
29b90 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
29ba0 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
29bb0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
29bc0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
29bd0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
29be0 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
29bf0 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
29c00 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
29c10 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
29c20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
29c30 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
29c40 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
29c50 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
29c60 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
29c70 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
29c80 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
29c90 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
29ca0 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
29cb0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
29cc0 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
29cd0 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
29ce0 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
29cf0 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2f 0a   skip-scans..*/.
29d00 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
29d10 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20  LoopAddBtree(.  
29d20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
29d30 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57   *pBuilder, /* W
29d40 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
29d50 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
29d60 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20  mask mExtra     
29d70 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
29d80 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20  a prerequesites 
29d90 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74  for using this t
29da0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
29db0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
29dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
29dd0 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
29de0 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
29df0 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20  Probe;          
29e00 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
29e10 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
29e20 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b  g */.  Index sPk
29e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29e40 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64     /* A fake ind
29e50 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  ex object for th
29e60 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
29e70 0a 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45  .  LogEst aiRowE
29e80 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f  stPk[2];       /
29e90 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73  * The aiRowLogEs
29ea0 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  t[] value for th
29eb0 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
29ec0 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20   i16 aiColumnPk 
29ed0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  = -1;        /* 
29ee0 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61  The aColumn[] va
29ef0 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
29f00 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69  index */.  SrcLi
29f10 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
29f20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
29f30 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  OM clause */.  s
29f40 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
29f50 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68  em *pSrc;  /* Th
29f60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74  e FROM clause bt
29f70 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20  ree term to add 
29f80 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
29f90 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
29fa0 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
29fb0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
29fc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29fd0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
29fe0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
29ff0 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20  .  int iSortIdx 
2a000 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
2a010 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  * Index number *
2a020 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20  /.  int b;      
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  /* A boolean val
2a050 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  ue */.  LogEst r
2a060 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2a070 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
2a080 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2a090 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  le */.  LogEst r
2a0a0 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
2a0b0 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
2a0c0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
2a0d0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2a0e0 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ble */.  WhereCl
2a0f0 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
2a100 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2a110 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ed WHERE clause 
2a120 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
2a130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a140 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
2a150 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20  queried */.  .  
2a160 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2a170 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20  >pNew;.  pWInfo 
2a180 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2a190 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  fo;.  pTabList =
2a1a0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2a1b0 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62  t;.  pSrc = pTab
2a1c0 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
2a1d0 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70  iTab;.  pTab = p
2a1e0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
2a1f0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
2a200 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56  ;.  assert( !IsV
2a210 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61  irtual(pSrc->pTa
2a220 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72  b) );..  if( pSr
2a230 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  c->pIndex ){.   
2a240 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
2a250 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
2a260 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a270 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
2a280 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72      pProbe = pSr
2a290 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c  c->pIndex;.  }el
2a2a0 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64  se if( !HasRowid
2a2b0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50  (pTab) ){.    pP
2a2c0 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e  robe = pTab->pIn
2a2d0 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
2a2e0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
2a2f0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2a300 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
2a310 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
2a320 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
2a330 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
2a340 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
2a350 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
2a360 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
2a370 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
2a380 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
2a390 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
2a3a0 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
2a3b0 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
2a3c0 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
2a3d0 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
2a3e0 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a400 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
2a410 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
2a420 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
2a430 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
2a440 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
2a450 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b  sPk.nKeyCol = 1;
2a460 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
2a470 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
2a480 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f  .    sPk.aiRowLo
2a490 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  gEst = aiRowEstP
2a4a0 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
2a4b0 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
2a4c0 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
2a4d0 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e  = pTab;.    sPk.
2a4e0 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d  szIdxRow = pTab-
2a4f0 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61  >szTabRow;.    a
2a500 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
2a510 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
2a520 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
2a530 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72  1] = 0;.    pFir
2a540 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  st = pSrc->pTab-
2a550 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  >pIndex;.    if(
2a560 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
2a570 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
2a580 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
2a590 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
2a5a0 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
2a5b0 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
2a5c0 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
2a5d0 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
2a5e0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
2a5f0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
2a600 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
2a610 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
2a620 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
2a630 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61   }.  rSize = pTa
2a640 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
2a650 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
2a660 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
2a670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a680 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
2a690 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
2a6a0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
2a6b0 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
2a6c0 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  t.   && (pWInfo-
2a6d0 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  >pParse->db->fla
2a6e0 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f  gs & SQLITE_Auto
2a6f0 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20  Index)!=0.   && 
2a700 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pSrc->pIndex==0.
2a710 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61     && !pSrc->via
2a720 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20  Coroutine.   && 
2a730 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65  !pSrc->notIndexe
2a740 64 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64  d.   && HasRowid
2a750 28 70 54 61 62 29 0a 20 20 20 26 26 20 21 70 53  (pTab).   && !pS
2a760 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  rc->isCorrelated
2a770 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73  .   && !pSrc->is
2a780 52 65 63 75 72 73 69 76 65 0a 20 20 29 7b 0a 20  Recursive.  ){. 
2a790 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
2a7a0 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c  uto-index WhereL
2a7b0 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72  oops */.    Wher
2a7c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
2a7d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
2a7e0 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
2a7f0 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66  WC->nTerm;.    f
2a800 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
2a810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a820 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  & pTerm<pWCEnd; 
2a830 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
2a840 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
2a850 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
2a860 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
2a870 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  ue;.      if( te
2a880 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
2a890 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20  pTerm, pSrc, 0) 
2a8a0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2a8b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31  >u.btree.nEq = 1
2a8c0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2a8d0 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20  u.btree.nSkip = 
2a8e0 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
2a8f0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
2a900 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
2a910 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
2a920 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
2a930 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
2a940 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
2a950 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74  G: One-time cost
2a960 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74   for computing t
2a970 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
2a980 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  ex is.        **
2a990 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 37   approximately 7
2a9a0 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65  *N*log2(N) where
2a9b0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
2a9c0 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20   of rows in.    
2a9d0 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
2a9e0 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 2e 20   being indexed. 
2a9f0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
2aa00 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69  >rSetup = rLogSi
2aa10 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 32 38 3b  ze + rSize + 28;
2aa20 20 20 61 73 73 65 72 74 28 20 32 38 3d 3d 73 71    assert( 28==sq
2aa30 6c 69 74 65 33 4c 6f 67 45 73 74 28 37 29 20 29  lite3LogEst(7) )
2aa40 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
2aa50 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20  ING: Each index 
2aa60 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30  lookup yields 20
2aa70 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2aa80 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20  le.  This.      
2aa90 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61    ** is more tha
2aaa0 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73  n the usual gues
2aab0 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69  s of 10 rows, si
2aac0 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77  nce we have no w
2aad0 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ay.        ** of
2aae0 20 6b 6e 6f 77 6e 69 6e 67 20 68 6f 77 20 73 65   knowning how se
2aaf0 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  lective the inde
2ab00 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  x will ultimatel
2ab10 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a  y be.  It would.
2ab20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
2ab30 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74  e unreasonable t
2ab40 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75  o make this valu
2ab50 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a  e much larger. *
2ab60 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
2ab70 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65  nOut = 43;  asse
2ab80 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 43==sqlite3L
2ab90 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20  ogEst(20) );.   
2aba0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2abb0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2abc0 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
2abd0 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
2abe0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2abf0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
2ac00 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
2ac10 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61  >prereq = mExtra
2ac20 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
2ac30 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
2ac40 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
2ac50 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2ac60 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
2ac70 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
2ac80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2ac90 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
2aca0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
2acb0 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f  all indices.  */
2acc0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
2acd0 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
2ace0 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
2acf0 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78  >pNext, iSortIdx
2ad00 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
2ad10 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
2ad20 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
2ad30 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
2ad40 6c 49 6e 64 65 78 28 70 4e 65 77 2d 3e 69 54 61  lIndex(pNew->iTa
2ad50 62 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e  b, pWC, pProbe->
2ad60 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29  pPartIdxWhere) )
2ad70 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
2ad80 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e  ;  /* Partial in
2ad90 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74  dex inappropriat
2ada0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
2adb0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53   */.    }.    rS
2adc0 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
2add0 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
2ade0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2adf0 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  nEq = 0;.    pNe
2ae00 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  w->u.btree.nSkip
2ae10 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
2ae20 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  nLTerm = 0;.    
2ae30 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2ae40 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53   0;.    pNew->rS
2ae50 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  etup = 0;.    pN
2ae60 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
2ae70 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  tra;.    pNew->n
2ae80 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
2ae90 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
2aea0 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a  Index = pProbe;.
2aeb0 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67      b = indexMig
2aec0 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
2aed0 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f  y(pBuilder, pPro
2aee0 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  be, pSrc->iCurso
2aef0 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f  r);.    /* The O
2af00 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 66  NEPASS_DESIRED f
2af10 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72  lags never occur
2af20 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  s together with 
2af30 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20  ORDER BY */.    
2af40 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d  assert( (pWInfo-
2af50 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2af60 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2af70 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20  RED)==0 || b==0 
2af80 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  );.    if( pProb
2af90 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20  e->tnum<=0 ){.  
2afa0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70      /* Integer p
2afb0 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
2afc0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
2afd0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2afe0 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  IPK;..      /* F
2aff0 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
2b000 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53  /.      pNew->iS
2b010 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
2b020 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20  rtIdx : 0;.     
2b030 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
2b040 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73   of full table s
2b050 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20  can is (N*3.0). 
2b060 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  */.      pNew->r
2b070 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36  Run = rSize + 16
2b080 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
2b090 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
2b0a0 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  C, pNew);.      
2b0b0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2b0c0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2b0d0 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  New);.      pNew
2b0e0 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
2b0f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
2b100 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
2b110 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2b120 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f  ;.      if( pPro
2b130 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29  be->isCovering )
2b140 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
2b150 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2b160 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
2b170 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
2b180 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    m = 0;.      }
2b190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20  else{.        m 
2b1a0 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
2b1b0 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
2b1c0 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  x(pProbe);.     
2b1d0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2b1e0 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45   = (m==0) ? (WHE
2b1f0 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
2b200 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45  E_INDEXED) : WHE
2b210 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
2b220 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75    }..      /* Fu
2b230 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65  ll scan via inde
2b240 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  x */.      if( b
2b250 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52  .       || !HasR
2b260 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20  owid(pTab).     
2b270 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20    || ( m==0.    
2b280 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
2b290 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20  bUnordered==0.  
2b2a0 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f 62         && (pProb
2b2b0 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62  e->szIdxRow<pTab
2b2c0 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20  ->szTabRow).    
2b2d0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2b2e0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2b2f0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2b300 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  RED)==0.        
2b310 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
2b320 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a  lConfig.bUseCis.
2b330 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
2b340 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2b350 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2b360 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72  db, SQLITE_Cover
2b370 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20  IdxScan).       
2b380 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20     ).      ){.  
2b390 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
2b3a0 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
2b3b0 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20  Idx : 0;..      
2b3c0 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66    /* The cost of
2b3d0 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e   visiting the in
2b3e0 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c  dex rows is N*K,
2b3f0 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20   where K is.    
2b400 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31      ** between 1
2b410 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65  .1 and 3.0, depe
2b420 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c  nding on the rel
2b430 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74  ative sizes of t
2b440 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
2b450 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f  dex and table ro
2b460 77 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ws. If this is a
2b470 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
2b480 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20 20 20  dex scan,.      
2b490 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20 74 68    ** also add th
2b4a0 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69  e cost of visiti
2b4b0 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20 28 4e  ng table rows (N
2b4c0 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20 20 20  *3.0).  */.     
2b4d0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2b4e0 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a  rSize + 1 + (15*
2b4f0 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
2b500 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  )/pTab->szTabRow
2b510 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21  ;.        if( m!
2b520 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b530 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
2b540 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e  ite3LogEstAdd(pN
2b550 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a 65 2b  ew->rRun, rSize+
2b560 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  16);.        }..
2b570 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
2b580 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
2b590 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  C, pNew);.      
2b5a0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2b5b0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2b5c0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
2b5d0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
2b5e0 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
2b5f0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
2b600 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
2b610 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2b620 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
2b630 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
2b640 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  e, 0);.#ifdef SQ
2b650 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
2b660 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73  3_OR_STAT4.    s
2b670 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
2b680 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70  Free(pBuilder->p
2b690 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64  Rec);.    pBuild
2b6a0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
2b6b0 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  0;.    pBuilder-
2b6c0 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69  >pRec = 0;.#endi
2b6d0 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
2b6e0 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
2b6f0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
2b700 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
2b710 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
2b720 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
2b730 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e     if( pSrc->pIn
2b740 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  dex ) break;.  }
2b750 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b760 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b770 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2b780 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  E./*.** Add all 
2b790 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2b7a0 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66  s for a table of
2b7b0 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69   the join identi
2b7c0 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c  fied by.** pBuil
2b7d0 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
2b7e0 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
2b7f0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2b800 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2b810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b820 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
2b830 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ual(.  WhereLoop
2b840 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
2b850 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  r,  /* WHERE cla
2b860 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
2b870 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  */.  Bitmask mEx
2b880 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e  tra.){.  WhereIn
2b890 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
2b8a0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
2b8b0 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
2b8c0 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
2b8d0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2b8e0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
2b8f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
2b900 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
2b910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b920 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2b930 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2b940 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20  st_item *pSrc;  
2b950 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
2b960 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
2b970 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ch */.  Table *p
2b980 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
2b990 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  db;.  sqlite3_in
2b9a0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
2b9b0 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  fo;.  struct sql
2b9c0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2b9d0 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
2b9e0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
2b9f0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2ba00 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
2ba10 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
2ba20 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Term;.  int i, j
2ba30 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d  ;.  int iTerm, m
2ba40 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f  xTerm;.  int nCo
2ba50 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20  nstraint;.  int 
2ba60 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20  seenIn = 0;     
2ba70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ba80 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   if an IN operat
2ba90 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  or is seen */.  
2baa0 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b  int seenVar = 0;
2bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bac0 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f  True if a non-co
2bad0 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e  nstant constrain
2bae0 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  t is seen */.  i
2baf0 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20  nt iPhase;      
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
2bb10 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20  : const w/o IN, 
2bb20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20  1: const, 2: no 
2bb30 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20  IN,  2: IN */.  
2bb40 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
2bb50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2bb60 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f  TE_OK;..  pWInfo
2bb70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2bb80 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
2bb90 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
2bba0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2bbb0 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
2bbc0 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
2bbd0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2bbe0 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
2bbf0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2bc00 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
2bc10 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
2bc20 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  b;.  assert( IsV
2bc30 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a  irtual(pTab) );.
2bc40 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c    pIdxInfo = all
2bc50 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70  ocateIndexInfo(p
2bc60 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
2bc70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  , pBuilder->pOrd
2bc80 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64  erBy);.  if( pId
2bc90 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  xInfo==0 ) retur
2bca0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2bcb0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2bcc0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74   0;.  pNew->rSet
2bcd0 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
2bce0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2bcf0 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
2bd00 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
2bd10 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
2bd20 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2bd30 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
2bd40 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
2bd50 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61  sage;.  nConstra
2bd60 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
2bd70 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
2bd80 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
2bd90 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f  ze(db, pNew, nCo
2bda0 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20  nstraint) ){.   
2bdb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2bdc0 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
2bdd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bde0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f  NOMEM;.  }..  fo
2bdf0 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61  r(iPhase=0; iPha
2be00 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29  se<=3; iPhase++)
2be10 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49  {.    if( !seenI
2be20 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21  n && (iPhase&1)!
2be30 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61  =0 ){.      iPha
2be40 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  se++;.      if( 
2be50 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b  iPhase>3 ) break
2be60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2be70 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61  !seenVar && iPha
2be80 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  se>1 ) break;.  
2be90 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
2bea0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2beb0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
2bec0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
2bed0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72  straint;.    for
2bee0 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
2bef0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
2bf00 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
2bf10 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43  .      j = pIdxC
2bf20 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
2bf30 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
2bf40 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2bf50 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65    switch( iPhase
2bf60 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
2bf70 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   0:    /* Consta
2bf80 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f  nts without IN o
2bf90 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
2bfa0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2bfb0 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  sable = 0;.     
2bfc0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2bfd0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2bfe0 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
2bff0 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31        seenIn = 1
2c000 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c010 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
2c020 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d  m->prereqRight!=
2c030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c040 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20   seenVar = 1;.  
2c050 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c060 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2c070 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  tor & WO_IN)==0 
2c080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2c090 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2c0a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
2c0b0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2c0c0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31  ;.        case 1
2c0d0 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74  :    /* Constant
2c0e0 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74  s with IN operat
2c0f0 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ors */.         
2c100 20 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20   assert( seenIn 
2c110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
2c120 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2c130 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
2c140 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20  ght==0);.       
2c150 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c160 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20    case 2:    /* 
2c170 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75  Variables withou
2c180 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  t IN */.        
2c190 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
2c1a0 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
2c1b0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
2c1c0 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  = (pTerm->eOpera
2c1d0 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b  tor & WO_IN)==0;
2c1e0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2c1f0 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ;.        defaul
2c200 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  t:   /* Variable
2c210 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20  s with IN */.   
2c220 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2c230 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e  eenVar && seenIn
2c240 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
2c250 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2c260 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
2c270 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2c280 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55   }.    memset(pU
2c290 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
2c2a0 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49  pUsage[0])*pIdxI
2c2b0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
2c2c0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  );.    if( pIdxI
2c2d0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2c2e0 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
2c2f0 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
2c300 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78  dxStr);.    pIdx
2c310 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
2c320 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2c330 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
2c340 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2c350 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
2c360 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
2c370 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
2c380 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2c390 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
2c3a0 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
2c3b0 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20  / (double)2;.   
2c3c0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
2c3d0 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20  atedRows = 25;. 
2c3e0 20 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74     rc = vtabBest
2c3f0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54  Index(pParse, pT
2c400 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
2c410 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2c420 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
2c430 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78  b_exit;.    pIdx
2c440 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
2c450 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
2c460 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
2c470 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2c480 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  t;.    pNew->pre
2c490 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
2c4a0 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
2c4b0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2c4c0 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
2c4d0 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28  aint );.    for(
2c4e0 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
2c4f0 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61  nt; i++) pNew->a
2c500 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  LTerm[i] = 0;.  
2c510 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
2c520 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  mitMask = 0;.   
2c530 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
2c540 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
2c550 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
2c560 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
2c570 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
2c580 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
2c590 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
2c5a0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
2c5b0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2c5c0 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
2c5d0 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20          || j<0. 
2c5e0 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57          || j>=pW
2c5f0 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
2c600 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
2c610 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
2c620 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2c630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2c640 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  OR;.          sq
2c650 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2c660 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49  arse, "%s.xBestI
2c670 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69  ndex() malfuncti
2c680 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  on", pTab->zName
2c690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2c6a0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
2c6b0 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ab_exit;.       
2c6c0 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
2c6d0 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e  ase( iTerm==nCon
2c6e0 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20  straint-1 );.   
2c6f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
2c700 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
2c710 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
2c720 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
2c730 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
2c740 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[j];.        
2c750 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
2c760 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2c770 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
2c780 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e  rt( iTerm<pNew->
2c790 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
2c7a0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
2c7b0 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
2c7c0 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
2c7d0 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
2c7e0 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
2c7f0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2c800 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20  m==15 );.       
2c810 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
2c820 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20  ==16 );.        
2c830 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
2c840 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
2c850 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
2c860 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
2c870 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2c880 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2c890 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
2c8a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2c8b0 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30  Usage[i].omit==0
2c8c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c8d0 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
2c8e0 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63  t to use an IN c
2c8f0 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65  onstraint if the
2c900 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
2c910 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
2c920 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69  ys that the equi
2c930 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72  valent EQ constr
2c940 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  aint cannot be s
2c950 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20  afely omitted.. 
2c960 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
2c970 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74   we do attempt t
2c980 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e  o use such a con
2c990 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f  straint, some ro
2c9a0 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ws might be.    
2c9b0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
2c9c0 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ted in the outpu
2c9d0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
2c9e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2c9f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
2ca00 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
2ca10 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
2ca20 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
2ca30 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
2ca40 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
2ca50 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
2ca60 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
2ca70 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
2ca80 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
2ca90 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
2caa0 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
2cab0 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
2cac0 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
2cad0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28  d.          ** (
2cae0 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70  2) Multiple outp
2caf0 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  uts from a singl
2cb00 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20  e IN value will 
2cb10 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20  not merge.      
2cb20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
2cb30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
2cb40 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2cb50 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2cb60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2cb70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2cb80 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  =nConstraint ){.
2cb90 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
2cba0 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
2cbb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
2cbc0 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
2cbd0 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2cbe0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
2cbf0 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
2cc00 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70  >idxNum;.      p
2cc10 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2cc20 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
2cc30 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2cc40 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  r;.      pIdxInf
2cc50 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2cc60 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Str = 0;.      p
2cc70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
2cc80 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
2cc90 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65  dxStr;.      pNe
2cca0 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
2ccb0 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49  red = (i8)(pIdxI
2ccc0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2ccd0 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 20 20 20  umed ?.         
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
2cd00 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
2cd10 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  : 0);.      pNew
2cd20 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
2cd30 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2cd40 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
2cd50 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
2cd60 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
2cd70 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
2cd80 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
2cd90 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73  Est(pIdxInfo->es
2cda0 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20  timatedRows);.  
2cdb0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73      whereLoopIns
2cdc0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
2cdd0 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
2cde0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2cdf0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
2ce00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2ce10 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
2ce20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2ce30 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
2ce40 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2ce50 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65    }.  }  ..where
2ce60 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74  LoopAddVtab_exit
2ce70 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  :.  if( pIdxInfo
2ce80 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2ce90 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
2cea0 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
2ceb0 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
2cec0 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66  Free(db, pIdxInf
2ced0 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  o);.  return rc;
2cee0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2cef0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2cf00 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
2cf10 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
2cf20 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
2cf30 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
2cf40 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
2cf50 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
2cf60 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
2cf70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2cf80 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65  eLoopAddOr(Where
2cf90 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
2cfa0 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d  ilder, Bitmask m
2cfb0 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49  Extra){.  WhereI
2cfc0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
2cfd0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2cfe0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2cff0 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  WC;.  WhereLoop 
2d000 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65  *pNew;.  WhereTe
2d010 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45  rm *pTerm, *pWCE
2d020 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  nd;.  int rc = S
2d030 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2d040 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61  iCur;.  WhereCla
2d050 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68  use tempWC;.  Wh
2d060 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
2d070 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72  SubBuild;.  Wher
2d080 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75  eOrSet sSum, sCu
2d090 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  r;.  struct SrcL
2d0a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2d0b0 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
2d0c0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
2d0d0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2d0e0 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
2d0f0 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
2d100 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
2d110 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2d120 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2d130 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2d140 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
2d150 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
2d160 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
2d170 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2d180 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
2d190 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
2d1a0 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
2d1b0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
2d1c0 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
2d1d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
2d1e0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
2d1f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2d200 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
2d210 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
2d220 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
2d230 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
2d240 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
2d250 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
2d260 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
2d270 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
2d280 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
2d290 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
2d2a0 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
2d2b0 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
2d2c0 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
2d2d0 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
2d2e0 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
2d2f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
2d300 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
2d310 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
2d320 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
2d330 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
2d340 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2d350 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
2d360 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  ;..      for(pOr
2d370 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
2d380 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
2d390 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
2d3a0 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
2d3b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2d3c0 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
2d3d0 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
2d3e0 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  .pWC = &pOrTerm-
2d3f0 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
2d400 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2d410 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
2d420 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
2d430 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2d440 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  .pWInfo = pWC->p
2d450 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  WInfo;.         
2d460 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d   tempWC.pOuter =
2d470 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
2d480 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
2d490 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ND;.          te
2d4a0 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
2d4b0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2d4c0 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
2d4d0 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
2d4e0 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  d.pWC = &tempWC;
2d4f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2d500 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2d510 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
2d520 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30        sCur.n = 0
2d530 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2d540 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2d550 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
2d560 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e  sVirtual(pItem->
2d570 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
2d580 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2d590 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75  pAddVirtual(&sSu
2d5a0 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
2d5b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
2d5c0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
2d5d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2d5e0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
2d5f0 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
2d600 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tra);.        }.
2d610 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
2d630 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sCur.n==0 );.  
2d640 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e        if( sCur.n
2d650 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2d660 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
2d670 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2d680 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d690 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
2d6a0 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
2d6b0 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20  Sum, &sCur);.   
2d6c0 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
2d6d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2d6e0 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f            WhereO
2d6f0 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20  rSet sPrev;.    
2d700 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
2d710 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
2d720 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
2d730 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
2d740 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
2d750 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
2d760 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2d770 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
2d780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
2d790 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
2d7a0 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
2d7b0 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
2d7c0 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
2d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
2d7f0 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
2d800 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a  ].rRun, sCur.a[j
2d810 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20  ].rRun),.       
2d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d830 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
2d840 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
2d850 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
2d860 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
2d870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d880 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d890 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
2d8a0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
2d8b0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2d8c0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2d8d0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2d8e0 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
2d8f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
2d900 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
2d910 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2d920 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
2d930 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
2d940 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
2d950 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
2d960 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d970 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
2d980 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
2d990 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75  G: Currently sSu
2d9a0 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73  m.a[i].rRun is s
2d9b0 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
2d9c0 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20   the costs.     
2d9d0 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62     ** of all sub
2d9e0 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20  -scans required 
2d9f0 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20  by the OR-scan. 
2da00 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20  However, due to 
2da10 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20  rounding.       
2da20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d   ** errors, it m
2da30 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63  ay be that the c
2da40 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63  ost of the OR-sc
2da50 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69  an is equal to i
2da60 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ts.        ** mo
2da70 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62  st expensive sub
2da80 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73  -scan. Add the s
2da90 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
2daa0 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20   penalty .      
2dab0 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74    ** (equivalent
2dac0 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20   to multiplying 
2dad0 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37  the cost by 1.07
2dae0 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
2daf0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
2db00 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  s does not happe
2db10 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  n. Otherwise, fo
2db20 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  r WHERE clauses 
2db30 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20  such as the.    
2db40 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
2db50 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20   where there is 
2db60 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a  an index on "y":
2db70 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2db80 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45      **     WHERE
2db90 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c   likelihood(x=?,
2dba0 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20   0.99) OR y=?.  
2dbb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2dbc0 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20   ** the planner 
2dbd0 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52  may elect to "OR
2dbe0 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c  " together a ful
2dbf0 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64  l-table scan and
2dc00 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
2dc10 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64  ndex lookup. And
2dc20 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79   other similarly
2dc30 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a   odd results.  *
2dc40 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
2dc50 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
2dc60 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20  .rRun + 1;.     
2dc70 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
2dc80 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a  sSum.a[i].nOut;.
2dc90 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
2dca0 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  ereq = sSum.a[i]
2dcb0 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20  .prereq;.       
2dcc0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2dcd0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2dce0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
2dcf0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2dd00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2dd10 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
2dd20 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
2dd30 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
2dd40 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
2dd50 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
2dd60 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
2dd70 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
2dd80 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
2dd90 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
2dda0 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
2ddb0 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
2ddc0 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
2ddd0 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
2dde0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2ddf0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
2de00 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2de10 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
2de20 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
2de30 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
2de40 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70  int nTabList = p
2de50 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
2de60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2de70 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a  _OK;.  u8 priorJ
2de80 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57  oinType = 0;.  W
2de90 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2dea0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
2deb0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
2dec0 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66  e join, from lef
2ded0 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20  t to right */.  
2dee0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2def0 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f  >pNew;.  whereLo
2df00 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20  opInit(pNew);.  
2df10 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65  for(iTab=0, pIte
2df20 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
2df30 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54  Tab<nTabList; iT
2df40 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a  ab++, pItem++){.
2df50 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d      pNew->iTab =
2df60 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d   iTab;.    pNew-
2df70 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
2df80 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
2df90 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43  skSet, pItem->iC
2dfa0 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
2dfb0 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  ((pItem->jointyp
2dfc0 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29  e|priorJoinType)
2dfd0 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
2dfe0 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20  ROSS))!=0 ){.   
2dff0 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69     mExtra = mPri
2e000 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72  or;.    }.    pr
2e010 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49  iorJoinType = pI
2e020 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
2e030 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
2e040 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
2e050 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2e060 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2e070 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
2e080 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e090 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2e0a0 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
2e0b0 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2e0c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2e0d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e0e0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2e0f0 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
2e100 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
2e110 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
2e120 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
2e130 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
2e140 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
2e150 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72  reak;.  }.  wher
2e160 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
2e170 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
2e180 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
2e190 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
2e1a0 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
2e1b0 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
2e1c0 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
2e1d0 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   5th.** paramete
2e1e0 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
2e1f0 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
2e200 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
2e210 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
2e220 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
2e230 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
2e240 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
2e250 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a  tion.  Return N:
2e260 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20  .** .**   N>0:  
2e270 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20   N terms of the 
2e280 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2e290 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
2e2a0 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72     N==0:  No ter
2e2b0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
2e2c0 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
2e2d0 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30  tisfied.**   N<0
2e2e0 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20  :   Unknown yet 
2e2f0 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f  how many terms o
2e300 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74  f ORDER BY might
2e310 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20   be satisfied.  
2e320 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
2e330 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
2e340 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
2e350 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
2e360 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
2e370 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
2e380 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2e390 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
2e3a0 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
2e3b0 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
2e3c0 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
2e3d0 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
2e3e0 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
2e3f0 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
2e400 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f  d DISTINCT do no
2e410 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
2e420 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
2e430 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
2e440 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
2e450 71 75 69 76 65 6c 65 6e 74 20 72 6f 77 73 20 61  quivelent rows a
2e460 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
2e470 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
2e480 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
2e490 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
2e4a0 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
2e4b0 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
2e4c0 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
2e4d0 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
2e4e0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
2e4f0 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
2e500 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
2e510 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
2e520 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65  .static i8 where
2e530 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
2e540 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
2e550 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
2e560 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2e570 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
2e580 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
2e590 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
2e5a0 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
2e5b0 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
2e5c0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2e5d0 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
2e5e0 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
2e5f0 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
2e600 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
2e610 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69   /* Might contai
2e620 6e 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  n WHERE_GROUPBY 
2e630 6f 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  or WHERE_DISTINC
2e640 54 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f  TBY */.  u16 nLo
2e650 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  op,            /
2e660 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
2e670 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c  ies in pPath->aL
2e680 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  oop[] */.  Where
2e690 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20  Loop *pLast,    
2e6a0 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65   /* Add this Whe
2e6b0 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e  reLoop to the en
2e6c0 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  d of pPath->aLoo
2e6d0 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  p[] */.  Bitmask
2e6e0 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f   *pRevMask     /
2e6f0 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57  * OUT: Mask of W
2e700 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e  hereLoops to run
2e710 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
2e720 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76  r */.){.  u8 rev
2e730 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Set;            
2e740 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69  /* True if rev i
2e750 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20  s known */.  u8 
2e760 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
2e770 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20     /* Composite 
2e780 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2e790 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20  u8 revIdx;      
2e7a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
2e7b0 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
2e7c0 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  8 isOrderDistinc
2e7d0 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f  t;   /* All prio
2e7e0 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65  r WhereLoops are
2e7f0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
2e800 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74  */.  u8 distinct
2e810 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72  Columns;   /* Tr
2e820 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68  ue if the loop h
2e830 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55  as UNIQUE NOT NU
2e840 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
2e850 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20  u8 isMatch;     
2e860 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e        /* iColumn
2e870 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20   matches a term 
2e880 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
2e890 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
2e8a0 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
2e8b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
2e8c0 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49  ey columns in pI
2e8d0 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43  ndex */.  u16 nC
2e8e0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
2e8f0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2e900 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d  of ordered colum
2e910 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
2e920 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42  */.  u16 nOrderB
2e930 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
2e940 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68  mber terms in th
2e950 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2e960 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  e */.  int iLoop
2e970 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2e980 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f  Index of WhereLo
2e990 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e  op in pPath bein
2e9a0 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  g processed */. 
2e9b0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
2e9c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2e9d0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2e9e0 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
2e9f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2ea00 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ber for current 
2ea10 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69  WhereLoop */.  i
2ea20 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
2ea30 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
2ea40 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
2ea50 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57  able iCur */.  W
2ea60 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
2ea70 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  = 0; /* Current 
2ea80 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20  WhereLoop being 
2ea90 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20  processed. */.  
2eaa0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2eab0 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c  ;     /* A singl
2eac0 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
2ead0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2eae0 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20  Expr *pOBExpr;  
2eaf0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
2eb00 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
2eb10 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2eb20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
2eb30 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f  oll;       /* CO
2eb40 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66  LLATE function f
2eb50 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20  rom an ORDER BY 
2eb60 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
2eb70 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
2eb80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2eb90 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
2eba0 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73  ith pLoop */.  s
2ebb0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
2ebc0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
2ebd0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2ebe0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  nnection */.  Bi
2ebf0 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b  tmask obSat = 0;
2ec00 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f      /* Mask of O
2ec10 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61  RDER BY terms sa
2ec20 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a  tisfied so far *
2ec30 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f  /.  Bitmask obDo
2ec40 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ne;       /* Mas
2ec50 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  k of all ORDER B
2ec60 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  Y terms */.  Bit
2ec70 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e  mask orderDistin
2ec80 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b  ctMask;  /* Mask
2ec90 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64   of all well-ord
2eca0 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  ered loops */.  
2ecb0 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20  Bitmask ready;  
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2ecd0 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f  ask of inner loo
2ece0 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ps */..  /*.  **
2ecf0 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
2ed00 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
2ed10 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74  w" if it generat
2ed20 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  es no more than 
2ed30 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  one.  ** row of 
2ed40 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65  output.  A Where
2ed50 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20  Loop is one-row 
2ed60 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2ed70 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2ed80 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
2ed90 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
2eda0 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
2edb0 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
2edc0 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
2edd0 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79   unique.  ** Any
2ede0 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
2edf0 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  an WHERE_COLUMN_
2ee00 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  EQ constraint on
2ee10 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e   the rowid is on
2ee20 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72  e-row..  ** Ever
2ee30 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
2ee40 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68  oop will have th
2ee50 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62  e WHERE_ONEROW b
2ee60 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67  it set in wsFlag
2ee70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  s..  **.  ** We 
2ee80 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
2ee90 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74  p is "order-dist
2eea0 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74  inct" if the set
2eeb0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d   of columns from
2eec0 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65  .  ** that Where
2eed0 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e  Loop that are in
2eee0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2eef0 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65  ause are differe
2ef00 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a  nt for every.  *
2ef10 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65  * row of the Whe
2ef20 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f  reLoop.  Every o
2ef30 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2ef40 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
2ef50 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73  y.  ** order-dis
2ef60 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65  tinct.   A Where
2ef70 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f  Loop that has no
2ef80 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2ef90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
2efa0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65    ** is not orde
2efb0 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62  r-distinct. To b
2efc0 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2efd0 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68   is not quite th
2efe0 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a  e same as being.
2eff0 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63    ** UNIQUE sinc
2f000 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d  e a UNIQUE colum
2f010 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68  n or index can h
2f020 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ave multiple row
2f030 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65  s that .  ** are
2f040 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76   NULL and NULL v
2f050 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61  alues are equiva
2f060 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  lent for the pur
2f070 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69  pose of order-di
2f080 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20  stinct..  ** To 
2f090 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
2f0a0 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d  t, the columns m
2f0b0 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e  ust be UNIQUE an
2f0c0 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  d NOT NULL..  **
2f0d0 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  .  ** The rowid 
2f0e0 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61  for a table is a
2f0f0 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64  lways UNIQUE and
2f100 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65   NOT NULL so whe
2f110 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72  never the.  ** r
2f120 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20  owid appears in 
2f130 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2f140 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  use, the corresp
2f150 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  onding WhereLoop
2f160 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74   is.  ** automat
2f170 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73  ically order-dis
2f180 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61  tinct..  */..  a
2f190 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
2f1a0 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f  =0 );.  if( nLoo
2f1b0 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
2f1c0 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
2f1d0 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
2f1e0 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
2f1f0 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
2f200 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
2f210 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64    testcase( nOrd
2f220 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  erBy==BMS-1 );. 
2f230 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d   if( nOrderBy>BM
2f240 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  S-1 ) return 0; 
2f250 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d   /* Cannot optim
2f260 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65  ize overly large
2f270 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20   ORDER BYs */.  
2f280 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2f290 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20  = 1;.  obDone = 
2f2a0 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79  MASKBIT(nOrderBy
2f2b0 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74  )-1;.  orderDist
2f2c0 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  inctMask = 0;.  
2f2d0 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72  ready = 0;.  for
2f2e0 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65  (iLoop=0; isOrde
2f2f0 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53  rDistinct && obS
2f300 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f  at<obDone && iLo
2f310 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  op<=nLoop; iLoop
2f320 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f  ++){.    if( iLo
2f330 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20  op>0 ) ready |= 
2f340 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
2f350 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f  .    pLoop = iLo
2f360 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68  op<nLoop ? pPath
2f370 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a  ->aLoop[iLoop] :
2f380 20 70 4c 61 73 74 3b 0a 20 20 20 20 69 66 28 20   pLast;.    if( 
2f390 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2f3a0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2f3b0 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  BLE ){.      if(
2f3c0 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
2f3d0 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61 74  sOrdered ) obSat
2f3e0 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20   = obDone;.     
2f3f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f400 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d    iCur = pWInfo-
2f410 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
2f420 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f  op->iTab].iCurso
2f430 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  r;..    /* Mark 
2f440 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59  off any ORDER BY
2f450 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20   term X that is 
2f460 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
2f470 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
2f480 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
2f490 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65   for which there
2f4a0 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20   is term in the 
2f4b0 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61  WHERE.    ** cla
2f4c0 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
2f4d0 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f  X IS NULL or X=?
2f4e0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
2f4f0 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a  only outer.    *
2f500 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a  * loops..    */.
2f510 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2f520 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
2f530 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
2f540 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
2f550 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f  ntinue;.      pO
2f560 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
2f570 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2f580 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2f590 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
2f5a0 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
2f5b0 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
2f5c0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  e;.      if( pOB
2f5d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
2f5e0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2f5f0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
2f600 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73  dTerm(&pWInfo->s
2f610 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70  WC, iCur, pOBExp
2f620 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
2f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f640 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51     ~ready, WO_EQ
2f650 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a  |WO_ISNULL, 0);.
2f660 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
2f670 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2f680 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2f690 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51  >eOperator&WO_EQ
2f6a0 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d  )!=0 && pOBExpr-
2f6b0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
2f6c0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2f6d0 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20  r *z1, *z2;.    
2f6e0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2f6f0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2f700 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2f710 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2f720 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
2f730 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
2f740 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
2f750 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
2f760 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
2f770 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2f780 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2f790 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2f7a0 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pTerm->pExpr);. 
2f7b0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2f7c0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2f7d0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2f7e0 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z2 = pColl->z
2f7f0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
2f800 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2f810 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f  (z1, z2)!=0 ) co
2f820 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
2f830 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
2f840 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d  ASKBIT(i);.    }
2f850 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
2f860 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2f870 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a  E_ONEROW)==0 ){.
2f880 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
2f890 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2f8a0 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  _IPK ){.        
2f8b0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
2f8c0 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b      nKeyCol = 0;
2f8d0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  .        nColumn
2f8e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
2f8f0 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20  e if( (pIndex = 
2f900 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2f910 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e  Index)==0 || pIn
2f920 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
2f930 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2f940 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
2f950 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  {.        nKeyCo
2f960 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  l = pIndex->nKey
2f970 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  Col;.        nCo
2f980 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  lumn = pIndex->n
2f990 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
2f9a0 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
2f9b0 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48  =nKeyCol+1 || !H
2f9c0 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
2f9d0 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20  pTable) );.     
2f9e0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
2f9f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
2fa00 75 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20  umn-1]==(-1) || 
2fa10 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
2fa20 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  ->pTable));.    
2fa30 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
2fa40 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  nct = pIndex->on
2fa50 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a  Error!=OE_None;.
2fa60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2fa70 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
2fa80 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
2fa90 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c  e index and deal
2faa0 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20   with the ones. 
2fab0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
2fac0 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
2fad0 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20   by == or IN..  
2fae0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76      */.      rev
2faf0 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20   = revSet = 0;. 
2fb00 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
2fb10 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  umns = 0;.      
2fb20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75  for(j=0; j<nColu
2fb30 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
2fb40 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a    u8 bOnce;   /*
2fb50 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65   True to run the
2fb60 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68   ORDER BY search
2fb70 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20   loop */..      
2fb80 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d    /* Skip over =
2fb90 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65  = and IS NULL te
2fba0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  rms */.        i
2fbb0 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  f( j<pLoop->u.bt
2fbc0 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
2fbd0 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   && pLoop->u.btr
2fbe0 65 65 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20  ee.nSkip==0.    
2fbf0 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c       && ((i = pL
2fc00 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e  oop->aLTerm[j]->
2fc10 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f  eOperator) & (WO
2fc20 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21  _EQ|WO_ISNULL))!
2fc30 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2fc40 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20          if( i & 
2fc50 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
2fc60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2fc70 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
2fc80 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct );.          
2fc90 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2fca0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2fcb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
2fcc0 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20  tinue;  .       
2fcd0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
2fce0 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  et the column nu
2fcf0 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
2fd00 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20  e (iColumn) and 
2fd10 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20  sort order.     
2fd20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66     ** (revIdx) f
2fd30 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  or the j-th colu
2fd40 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
2fd50 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2fd60 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29      if( pIndex )
2fd70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
2fd80 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
2fd90 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
2fda0 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49       revIdx = pI
2fdb0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
2fdc0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [j];.          i
2fdd0 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  f( iColumn==pInd
2fde0 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ex->pTable->iPKe
2fdf0 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  y ) iColumn = -1
2fe00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2fe10 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
2fe20 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
2fe30 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20     revIdx = 0;. 
2fe40 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2fe50 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72    /* An unconstr
2fe60 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61  ained column tha
2fe70 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
2fe80 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a  means that this.
2fe90 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65          ** Where
2fea0 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c  Loop is not well
2feb0 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  -ordered.       
2fec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2fed0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a  isOrderDistinct.
2fee0 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c           && iCol
2fef0 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  umn>=0.         
2ff00 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  && j>=pLoop->u.b
2ff10 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
2ff20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61    && pIndex->pTa
2ff30 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2ff40 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20  n].notNull==0.  
2ff50 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2ff60 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2ff70 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2ff80 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  }..        /* Fi
2ff90 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  nd the ORDER BY 
2ffa0 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73  term that corres
2ffb0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74  ponds to the j-t
2ffc0 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  h column.       
2ffd0 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
2ffe0 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f   and mark that O
2fff0 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66  RDER BY term off
30000 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
30010 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a       bOnce = 1;.
30020 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
30030 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
30040 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69  (i=0; bOnce && i
30050 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
30060 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d  .          if( M
30070 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
30080 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
30090 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20          pOBExpr 
300a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
300b0 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
300c0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
300d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
300e0 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
300f0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
30100 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
30110 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
30120 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
30130 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  TBY );.         
30140 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
30150 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42   & (WHERE_GROUPB
30160 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  Y|WHERE_DISTINCT
30170 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20  BY))==0 ) bOnce 
30180 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
30190 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
301a0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
301b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
301c0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
301d0 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
301e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
301f0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
30200 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
30210 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30220 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
30230 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
30240 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
30250 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
30260 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
30270 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
30280 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
30290 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
302a0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
302b0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
302c0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
302d0 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
302e0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
302f0 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j])!=0 ) continu
30300 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
30310 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68           isMatch
30320 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
30330 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
30340 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
30350 61 74 63 68 20 26 26 20 28 70 57 49 6e 66 6f 2d  atch && (pWInfo-
30360 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
30370 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20  ERE_GROUPBY)==0 
30380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
30390 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  Make sure the so
303a0 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70  rt order is comp
303b0 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44  atible in an ORD
303c0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
303d0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20          ** Sort 
303e0 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76  order is irrelev
303f0 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20  ant for a GROUP 
30400 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20  BY clause. */.  
30410 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53          if( revS
30420 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
30430 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76    if( (rev ^ rev
30440 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e  Idx)!=pOrderBy->
30450 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
30460 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
30470 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30480 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20 3d             rev =
30490 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72   revIdx ^ pOrder
304a0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
304b0 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  er;.            
304c0 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d  if( rev ) *pRevM
304d0 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  ask |= MASKBIT(i
304e0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Loop);.         
304f0 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20     revSet = 1;. 
30500 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
30520 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20   isMatch ){.    
30530 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
30540 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
30550 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73     testcase( dis
30560 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20  tinctColumns==0 
30570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  );.            d
30580 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
30590 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
305a0 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
305b0 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
305c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
305d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61          /* No ma
305e0 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20  tch found */.   
305f0 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
30600 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a  || j<nKeyCol ){.
30610 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
30620 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
30630 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  tinct!=0 );.    
30640 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
30650 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
30660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
30680 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65    }.      } /* e
30690 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  nd Loop over all
306a0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a   index columns *
306b0 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74  /.      if( dist
306c0 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20  inctColumns ){. 
306d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
306e0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
306f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
30700 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
30710 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
30720 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20  } /* end-if not 
30730 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20  one-row */..    
30740 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20  /* Mark off any 
30750 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74  other ORDER BY t
30760 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65  erms that refere
30770 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20  nce pLoop */.   
30780 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
30790 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72  inct ){.      or
307a0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
307b0 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
307c0 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lf;.      for(i=
307d0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
307e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
307f0 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69  r *p;.        Bi
30800 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20  tmask mTerm;.   
30810 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
30820 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
30830 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
30840 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  p = pOrderBy->a[
30850 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
30860 20 20 6d 54 65 72 6d 20 3d 20 65 78 70 72 54 61    mTerm = exprTa
30870 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f  bleUsage(&pWInfo
30880 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20  ->sMaskSet,p);. 
30890 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d         if( mTerm
308a0 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  ==0 && !sqlite3E
308b0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29  xprIsConstant(p)
308c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
308d0 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26       if( (mTerm&
308e0 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
308f0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
30900 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
30910 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
30920 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30930 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
30940 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
30950 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
30960 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
30970 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
30980 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
30990 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29  ne ) return (i8)
309a0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
309b0 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
309c0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f   ){.    for(i=nO
309d0 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69  rderBy-1; i>0; i
309e0 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
309f0 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69  sk m = MASKBIT(i
30a00 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  ) - 1;.      if(
30a10 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20   (obSat&m)==m ) 
30a20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a  return i;.    }.
30a30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
30a40 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
30a50 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
30a60 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
30a70 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  ag is set in the
30a80 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20   mask passed to 
30a90 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
30aa0 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e  n(),.** the plan
30ab0 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74  ner assumes that
30ac0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
30ad0 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20  OrderBy list is 
30ae0 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50  actually a GROUP
30af0 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20  .** BY clause - 
30b00 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72  and so any order
30b10 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77   that groups row
30b20 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61  s as required sa
30b30 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72  tisfies the.** r
30b40 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  equest..**.** No
30b50 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20  rmally, in this 
30b60 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
30b70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
30b80 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d  caller to determ
30b90 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
30ba0 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61  r not the rows a
30bb0 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20  re really being 
30bc0 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72  delivered in sor
30bd0 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a  ted order, or.**
30be0 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74   just in some ot
30bf0 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70  her order that p
30c00 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75  rovides the requ
30c10 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48  ired grouping. H
30c20 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68  owever,.** if th
30c30 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  e WHERE_SORTBYGR
30c40 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  OUP flag is also
30c50 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
30c60 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20  e3WhereBegin(), 
30c70 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  then.** this fun
30c80 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
30c90 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72  led on the retur
30ca0 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62  ned WhereInfo ob
30cb0 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73  ject. It returns
30cc0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
30cd0 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c  rows really will
30ce0 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68   be sorted in th
30cf0 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65  e specified orde
30d00 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f  r, or false.** o
30d10 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
30d20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
30d30 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  uming:.**.**   C
30d40 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
30d50 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a  N t1(x, Y);.**.*
30d60 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53  * then.**.**   S
30d70 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
30d80 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44  GROUP BY x,y ORD
30d90 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20  ER BY x,y;   -- 
30da0 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a  IsSorted()==1.**
30db0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
30dc0 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78   t1 GROUP BY y,x
30dd0 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20   ORDER BY y,x;  
30de0 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
30df0 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  0.*/.int sqlite3
30e00 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68  WhereIsSorted(Wh
30e10 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
30e20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
30e30 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
30e40 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
30e50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
30e60 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
30e70 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
30e80 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  UP );.  return p
30e90 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d  WInfo->sorted;.}
30ea0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
30eb0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
30ec0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
30ed0 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
30ee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
30ef0 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
30f00 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
30f10 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
30f20 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
30f30 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
30f40 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
30f50 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
30f60 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
30f70 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
30f80 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
30f90 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
30fa0 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
30fb0 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
30fc0 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
30fd0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
30fe0 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20   Given the list 
30ff0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  of WhereLoop obj
31000 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e  ects at pWInfo->
31010 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75  pLoops, this rou
31020 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tine.** attempts
31030 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77   to find the low
31040 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68  est cost path th
31050 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57  at visits each W
31060 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65  hereLoop.** once
31070 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20  .  This path is 
31080 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f  then loaded into
31090 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d   the pWInfo->a[]
310a0 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a  .pWLoop fields..
310b0 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61  **.** Assume tha
310c0 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  t the total numb
310d0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
310e0 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
310f0 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a   to be sorted.**
31100 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74   will be nRowEst
31110 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32   (in the 10*log2
31120 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29   representation)
31130 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f  .  Or, ignore so
31140 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69  rting.** costs i
31150 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a  f nRowEst==0..**
31160 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
31170 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
31180 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
31190 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  of a memory allo
311a0 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20  cation.** error 
311b0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
311c0 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
311d0 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20  olver(WhereInfo 
311e0 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20  *pWInfo, LogEst 
311f0 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20  nRowEst){.  int 
31200 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20  mxChoice;       
31210 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
31220 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c   number of simul
31230 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72  taneous paths tr
31240 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  acked */.  int n
31250 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
31260 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
31270 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a  f terms in the j
31280 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  oin */.  Parse *
31290 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
312a0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
312b0 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
312c0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
312d0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
312e0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
312f0 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
31300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31310 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f  * Loop counter o
31320 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  ver the terms of
31330 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69   the join */.  i
31340 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20  nt ii, jj;      
31350 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
31360 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
31370 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20  nt mxI = 0;     
31380 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
31390 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20  x of next entry 
313a0 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20  to replace */.  
313b0 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
313c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
313d0 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
313e0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a  clause terms */.
313f0 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20    LogEst rCost; 
31400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
31410 6f 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f  ost of a path */
31420 0a 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20  .  LogEst nOut; 
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31440 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
31450 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
31460 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Cost = 0;       
31470 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74   /* Maximum cost
31480 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74   of a set of pat
31490 68 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  hs */.  int nTo,
314a0 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
314b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
314c0 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
314d0 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
314e0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
314f0 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
31500 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
31510 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
31520 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
31530 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
31540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31550 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
31560 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
31570 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
31580 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
31590 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
315a0 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
315b0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
315c0 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
315d0 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
315e0 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
315f0 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
31600 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
31610 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
31620 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
31630 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
31640 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
31650 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
31660 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
31670 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
31680 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
31690 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  ry */.  char *pS
316a0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
316b0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d    /* Temporary m
316c0 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
316d0 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  is routine */.. 
316e0 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
316f0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
31700 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
31710 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
31720 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
31730 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
31740 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
31750 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
31760 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
31770 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
31780 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
31790 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
317a0 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
317b0 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
317c0 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
317d0 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
317e0 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d  hoice = (nLoop<=
317f0 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
31800 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
31810 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
31820 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
31830 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
31840 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
31850 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
31860 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  \n"));..  /* All
31870 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
31880 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
31890 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a  To and aFrom */.
318a0 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57    ii = (sizeof(W
318b0 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
318c0 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
318d0 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
318e0 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
318f0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
31900 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70  , ii);.  if( pSp
31910 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
31920 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
31930 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68  aTo = (WherePath
31940 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f  *)pSpace;.  aFro
31950 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65  m = aTo+mxChoice
31960 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d  ;.  memset(aFrom
31970 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f  , 0, sizeof(aFro
31980 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28  m[0]));.  pX = (
31990 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72  WhereLoop**)(aFr
319a0 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20  om+mxChoice);.  
319b0 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a  for(ii=mxChoice*
319c0 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69  2, pFrom=aTo; ii
319d0 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b  >0; ii--, pFrom+
319e0 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b  +, pX += nLoop){
319f0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  .    pFrom->aLoo
31a00 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f  p = pX;.  }..  /
31a10 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
31a20 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
31a30 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
31a40 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
31a50 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oops..  **.  ** 
31a60 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c  TUNING: Do not l
31a70 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
31a80 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61   iterations go a
31a90 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68 65  bove 25.  If the
31aa0 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f   cost.  ** of co
31ab0 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d  mputing an autom
31ac0 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f  atic index is no
31ad0 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68  t paid back with
31ae0 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 35 0a  in the first 25.
31af0 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
31b00 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61  do not use the a
31b10 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20  utomatic index. 
31b20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52  */.  aFrom[0].nR
31b30 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d  ow = MIN(pParse-
31b40 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29  >nQueryLoop, 46)
31b50 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73  ;  assert( 46==s
31b60 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29  qlite3LogEst(25)
31b70 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b   );.  nFrom = 1;
31b80 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74  ..  /* Precomput
31b90 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f  e the cost of so
31ba0 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  rting the final 
31bb0 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20 74  result set, if t
31bc0 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 74  he caller.  ** t
31bd0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
31be0 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65 72  gin() was concer
31bf0 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69 6e  ned about sortin
31c00 67 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66  g */.  if( pWInf
31c10 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
31c20 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
31c30 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f      aFrom[0].isO
31c40 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20  rdered = 0;.    
31c50 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
31c60 7d 65 6c 73 65 7b 0a 20 20 20 20 61 46 72 6f 6d  }else{.    aFrom
31c70 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  [0].isOrdered = 
31c80 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 31  nLoop>0 ? -1 : 1
31c90 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  ;.    nOrderBy =
31ca0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
31cb0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20  y->nExpr;.  }.. 
31cc0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63   /* Compute succ
31cd0 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20  essively longer 
31ce0 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67  WherePaths using
31cf0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65   the previous ge
31d00 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66  neration.  ** of
31d10 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74   WherePaths as t
31d20 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65  he basis for the
31d30 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61   next.  Keep tra
31d40 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69  ck of the mxChoi
31d50 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74  ce.  ** best pat
31d60 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72  hs at each gener
31d70 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69  ation */.  for(i
31d80 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
31d90 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
31da0 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20     nTo = 0;.    
31db0 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d  for(ii=0, pFrom=
31dc0 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b  aFrom; ii<nFrom;
31dd0 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b   ii++, pFrom++){
31de0 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f  .      for(pWLoo
31df0 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  p=pWInfo->pLoops
31e00 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70  ; pWLoop; pWLoop
31e10 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f  =pWLoop->pNextLo
31e20 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  op){.        Bit
31e30 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20  mask maskNew;.  
31e40 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65        Bitmask re
31e50 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  vMask = 0;.     
31e60 20 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20     i8 isOrdered 
31e70 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
31e80 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
31e90 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20  (pWLoop->prereq 
31ea0 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f  & ~pFrom->maskLo
31eb0 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
31ec0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
31ed0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
31ee0 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   & pFrom->maskLo
31ef0 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
31f00 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  e;.        /* At
31f10 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c   this point, pWL
31f20 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61  oop is a candida
31f30 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78  te to be the nex
31f40 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20  t loop. .       
31f50 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20   ** Compute its 
31f60 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  cost */.        
31f70 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
31f80 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d  ogEstAdd(pWLoop-
31f90 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e  >rSetup,pWLoop->
31fa0 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52  rRun + pFrom->nR
31fb0 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 43 6f  ow);.        rCo
31fc0 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
31fd0 73 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72  stAdd(rCost, pFr
31fe0 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20  om->rCost);.    
31ff0 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d      nOut = pFrom
32000 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d  ->nRow + pWLoop-
32010 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d  >nOut;.        m
32020 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e  askNew = pFrom->
32030 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
32040 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
32050 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
32060 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed<0 ){.        
32070 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68    isOrdered = wh
32080 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
32090 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a  OrderBy(pWInfo,.
320a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320b0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
320c0 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20  OrderBy, pFrom, 
320d0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
320e0 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
320f0 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70             iLoop
32100 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61  , pWLoop, &revMa
32110 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  sk);.          i
32120 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  f( isOrdered>=0 
32130 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72  && isOrdered<nOr
32140 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
32150 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
32160 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f  Estimated cost o
32170 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61  f a full externa
32180 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20  l sort, where N 
32190 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  is .            
321a0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
321b0 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73   rows to sort is
321c0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  :.            **
321d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
321e0 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
321f0 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 20  N * log(N))..   
32200 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20           ** .   
32210 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20           ** Or, 
32220 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  if the order-by 
32230 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72  clause has X ter
32240 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20  ms but only the 
32250 6c 61 73 74 20 59 20 0a 20 20 20 20 20 20 20 20  last Y .        
32260 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65      ** terms are
32270 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74   out of order, t
32280 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e  hen block-sortin
32290 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68  g will reduce th
322a0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e .            *
322b0 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74  * sorting cost t
322c0 6f 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  o:.            *
322d0 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
322e0 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
322f0 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28   N * log(N)) * (
32300 59 2f 58 29 0a 20 20 20 20 20 20 20 20 20 20 20  Y/X).           
32310 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
32320 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72  ** The (Y/X) ter
32330 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  m is implemented
32340 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72   using stack var
32350 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 20  iable rScale.   
32360 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 6c 6f           ** belo
32370 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  w.  */.         
32380 20 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65     LogEst rScale
32390 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 20  , rSortCost;.   
323a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
323b0 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36   nOrderBy>0 && 6
323c0 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
323d0 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 20  (100) );.       
323e0 20 20 20 20 20 72 53 63 61 6c 65 20 3d 20 73 71       rScale = sq
323f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72  lite3LogEst((nOr
32400 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29  derBy-isOrdered)
32410 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d  *100/nOrderBy) -
32420 20 36 36 3b 0a 20 20 20 20 20 20 20 20 20 20 20   66;.           
32430 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
32440 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52  wEst + estLog(nR
32450 6f 77 45 73 74 29 20 2b 20 72 53 63 61 6c 65 20  owEst) + rScale 
32460 2b 20 31 36 3b 0a 0a 20 20 20 20 20 20 20 20 20  + 16;..         
32470 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68     /* TUNING: Th
32480 65 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d  e cost of implem
32490 65 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20  enting DISTINCT 
324a0 75 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69  using a B-TREE i
324b0 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
324c0 20 73 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74   similar but wit
324d0 68 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74  h a larger const
324e0 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f  ant of proportio
324f0 6e 61 6c 69 74 79 2e 20 0a 20 20 20 20 20 20 20  nality. .       
32500 20 20 20 20 20 2a 2a 20 4d 75 6c 74 69 70 6c 79       ** Multiply
32510 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61   by an additiona
32520 6c 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30 2e  l factor of 3.0.
32530 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
32540 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
32550 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
32560 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
32570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
32580 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a  SortCost += 16;.
32590 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
325a0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
325b0 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20  RACE(0x002,.    
325c0 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d             ("---
325d0 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
325e0 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73   (%d/%d) increas
325f0 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25  es cost %3d to %
32600 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  -3d\n",.        
32610 20 20 20 20 20 20 20 20 72 53 6f 72 74 43 6f 73          rSortCos
32620 74 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f  t, (nOrderBy-isO
32630 72 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42  rdered), nOrderB
32640 79 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  y, rCost,.      
32650 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32660 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73 74  3LogEstAdd(rCost
32670 2c 72 53 6f 72 74 43 6f 73 74 29 29 29 3b 0a 20  ,rSortCost)));. 
32680 20 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74             rCost
32690 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
326a0 41 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72 74  Add(rCost, rSort
326b0 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Cost);.         
326c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
326d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d  {.          revM
326e0 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
326f0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Loop;.        }.
32700 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
32710 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f   to see if pWLoo
32720 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65  p should be adde
32730 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f 69 63  d to the mxChoic
32740 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  e best so far */
32750 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  .        for(jj=
32760 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e  0, pTo=aTo; jj<n
32770 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  To; jj++, pTo++)
32780 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
32790 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d  pTo->maskLoop==m
327a0 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20  askNew.         
327b0 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72    && ((pTo->isOr
327c0 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29  dered^isOrdered)
327d0 26 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  &80)==0.        
327e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
327f0 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
32800 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
32810 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
32820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32830 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
32840 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
32850 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
32860 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78  ice && rCost>=mx
32870 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57  Cost ){.#ifdef W
32880 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
32890 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
328a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
328b0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
328c0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
328d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
328e0 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73  rintf("Skip   %s
328f0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
32900 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
32910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
32920 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
32930 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
32940 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
32950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32960 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
32970 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
32980 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
32990 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
329a0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
329b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
329c0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61          /* Add a
329d0 20 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65   new Path to the
329e0 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20   aTo[] set */.  
329f0 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
32a00 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
32a10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
32a20 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
32a30 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
32a40 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
32a50 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
32a60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
32a80 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
32a90 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
32aa0 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
32ab0 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
32ac0 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
32ad0 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20   mxI;.          
32ae0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
32af0 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
32b00 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
32b10 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
32b20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
32b30 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
32b40 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
32b50 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
32b60 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
32b70 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
32b80 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
32b90 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
32ba0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
32bb0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
32bc0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
32bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
32be0 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
32bf0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
32c00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
32c10 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
32c20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
32c30 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72  f( pTo->rCost<=r
32c40 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57  Cost ){.#ifdef W
32c50 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
32c60 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
32c70 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
32c80 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
32c90 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
32ca0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
32cb0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
32cc0 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20           "Skip  
32cd0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
32ce0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
32cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
32d00 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
32d10 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
32d20 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
32d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32d40 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
32d50 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
32d60 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
32d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
32d80 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20  ugPrintf("   vs 
32d90 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20  %s cost=%-3d,%d 
32da0 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
32dc0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
32dd0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
32de0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
32df0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
32e00 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
32e10 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d  rdered>=0 ? pTo-
32e20 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a  >isOrdered+'0' :
32e30 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
32e40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32e50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32e60 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
32e70 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ost );.         
32e80 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
32e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32ea0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
32eb0 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31  ->rCost==rCost+1
32ec0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
32ed0 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65   A new and bette
32ee0 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72  r score for a pr
32ef0 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64  eviously created
32f00 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68   equivalent path
32f10 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
32f20 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
32f30 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
32f40 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
32f50 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
32f60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
32f70 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
32f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
32f90 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25  Update %s cost=%
32fa0 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
32fb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
32fc0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
32fd0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
32fe0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
32ff0 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
33000 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
33010 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
33020 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
33030 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
33040 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20  ugPrintf("  was 
33050 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
33060 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
33070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
33080 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
33090 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
330a0 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
330b0 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
330c0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
330d0 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73  red>=0 ? pTo->is
330e0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
330f0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
33100 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
33110 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f  .        /* pWLo
33120 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20  op is a winner. 
33130 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73   Add it to the s
33140 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61  et of best so fa
33150 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  r */.        pTo
33160 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72  ->maskLoop = pFr
33170 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
33180 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
33190 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65  .        pTo->re
331a0 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b  vLoop = revMask;
331b0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52  .        pTo->nR
331c0 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20  ow = nOut;.     
331d0 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20     pTo->rCost = 
331e0 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70  rCost;.        p
331f0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
33200 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
33210 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
33220 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
33230 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
33240 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
33250 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
33260 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
33270 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
33280 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
33290 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
332a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  0;.          mxC
332b0 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
332c0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
332d0 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
332e0 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
332f0 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
33300 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
33310 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
33320 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
33330 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d     mxCost = pTo-
33340 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
33350 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a        mxI = jj;.
33360 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
33370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33380 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
33390 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
333a0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a  RACE_ENABLED  /*
333b0 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20   >=2 */.    if( 
333c0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
333d0 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71  e>=2 ){.      sq
333e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
333f0 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75  ("---- after rou
33400 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69  nd %d ----\n", i
33410 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Loop);.      for
33420 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20  (ii=0, pTo=aTo; 
33430 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54  ii<nTo; ii++, pT
33440 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  o++){.        sq
33450 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
33460 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20  (" %s cost=%-3d 
33470 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d  nrow=%-3d order=
33480 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
33490 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
334a0 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
334b0 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
334c0 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
334d0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
334e0 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  >=0 ? (pTo->isOr
334f0 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27  dered+'0') : '?'
33500 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
33510 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20  To->isOrdered>0 
33520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
33530 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
33540 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c  " rev=0x%llx\n",
33550 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a   pTo->revLoop);.
33560 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
33570 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33580 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
33590 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
335a0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
335b0 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74  f..    /* Swap t
335c0 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f  he roles of aFro
335d0 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68  m and aTo for th
335e0 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f  e next generatio
335f0 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d  n */.    pFrom =
33600 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20   aTo;.    aTo = 
33610 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d  aFrom;.    aFrom
33620 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46   = pFrom;.    nF
33630 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a  rom = nTo;.  }..
33640 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29    if( nFrom==0 )
33650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
33660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
33670 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e  o query solution
33680 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ");.    sqlite3D
33690 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
336a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
336b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
336c0 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65    .  /* Find the
336d0 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
336e0 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62  h.  pFrom will b
336f0 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  e left pointing 
33700 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a  to that path */.
33710 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b    pFrom = aFrom;
33720 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c  .  for(ii=1; ii<
33730 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nFrom; ii++){.  
33740 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f    if( pFrom->rCo
33750 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f  st>aFrom[ii].rCo
33760 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46  st ) pFrom = &aF
33770 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61  rom[ii];.  }.  a
33780 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
33790 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a  Level==nLoop );.
337a0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f    /* Load the lo
337b0 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69  west cost path i
337c0 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20  nto pWInfo */.  
337d0 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
337e0 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
337f0 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
33800 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49  el *pLevel = pWI
33810 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a  nfo->a + iLoop;.
33820 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f      pLevel->pWLo
33830 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46  op = pWLoop = pF
33840 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  rom->aLoop[iLoop
33850 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ];.    pLevel->i
33860 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69  From = pWLoop->i
33870 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Tab;.    pLevel-
33880 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66  >iTabCur = pWInf
33890 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
338a0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43  Level->iFrom].iC
338b0 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  ursor;.  }.  if(
338c0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
338d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
338e0 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20  T_DISTINCT)!=0. 
338f0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
33900 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
33910 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a  _DISTINCTBY)==0.
33920 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44     && pWInfo->eD
33930 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44  istinct==WHERE_D
33940 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20  ISTINCT_NOOP.   
33950 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a  && nRowEst.  ){.
33960 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55      Bitmask notU
33970 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  sed;.    int rc 
33980 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
33990 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
339a0 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  fo, pWInfo->pRes
339b0 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20  ultSet, pFrom,. 
339c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
339e0 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
339f0 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
33a00 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
33a10 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d   if( rc==pWInfo-
33a20 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78  >pResultSet->nEx
33a30 70 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  pr ){.      pWIn
33a40 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
33a50 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
33a60 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  RDERED;.    }.  
33a70 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
33a80 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
33a90 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
33aa0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
33ab0 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20  ISTINCTBY ){.   
33ac0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73     if( pFrom->is
33ad0 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d  Ordered==pWInfo-
33ae0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
33af0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
33b00 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
33b10 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
33b20 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a  RDERED;.      }.
33b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33b40 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
33b50 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
33b60 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  ed;.      if( pW
33b70 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 30 20 29  Info->nOBSat<0 )
33b80 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
33b90 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  = 0;.      pWInf
33ba0 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72  o->revMask = pFr
33bb0 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
33bc0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e   }.    if( (pWIn
33bd0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
33be0 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
33bf0 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70  UP).        && p
33c00 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70  WInfo->nOBSat==p
33c10 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
33c20 3e 6e 45 78 70 72 0a 20 20 20 20 29 7b 0a 20 20  >nExpr.    ){.  
33c30 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55      Bitmask notU
33c40 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  sed = 0;.      i
33c50 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72  nt nOrder = wher
33c60 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
33c70 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
33c80 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
33c90 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
33ca0 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  , 0, nLoop-1, pF
33cb0 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
33cc0 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 0a 20 20  -1], &notUsed.  
33cd0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
33ce0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72  ert( pWInfo->sor
33cf0 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ted==0 );.      
33d00 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d  pWInfo->sorted =
33d10 20 28 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f   (nOrder==pWInfo
33d20 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
33d30 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  r);.    }.  }...
33d40 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
33d50 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b  t = pFrom->nRow;
33d60 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70  ..  /* Free temp
33d70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64  orary memory and
33d80 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20   return success 
33d90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
33da0 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
33db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33dc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73  OK;.}../*.** Mos
33dd0 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e  t queries use on
33de0 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
33df0 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20  e (they are not 
33e00 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a  joins) and have.
33e10 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e  ** simple == con
33e20 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74  straints against
33e30 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e   indexed fields.
33e40 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
33e50 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c  ttempts.** to pl
33e60 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20  an those simple 
33e70 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68  cases using much
33e80 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74   less ceremony t
33e90 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72  han the.** gener
33ea0 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
33eb0 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68   planner, and th
33ec0 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74  ereby yield fast
33ed0 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  er sqlite3_prepa
33ee0 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f  re().** times fo
33ef0 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
33f00 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
33f10 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63  non-zero on succ
33f20 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65  ess, if this que
33f30 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65  ry can be handle
33f40 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d  d by this.** no-
33f50 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61  frills query pla
33f60 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65  nner.  Return ze
33f70 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ro if this query
33f80 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67   needs the .** g
33f90 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
33fa0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f  uery planner..*/
33fb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
33fc0 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c  eShortCut(WhereL
33fd0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
33fe0 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
33ff0 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74  fo *pWInfo;.  st
34000 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
34010 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72  m *pItem;.  Wher
34020 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
34030 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
34040 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
34050 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72  Loop;.  int iCur
34060 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62  ;.  int j;.  Tab
34070 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
34080 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57  x *pIdx;.  .  pW
34090 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
340a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  >pWInfo;.  if( p
340b0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
340c0 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
340d0 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30  TABLE ) return 0
340e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
340f0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
34100 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d  rc>=1 );.  pItem
34110 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
34120 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d  ist->a;.  pTab =
34130 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
34140 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
34150 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
34160 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e    if( pItem->zIn
34170 64 65 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  dex ) return 0;.
34180 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
34190 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d  iCursor;.  pWC =
341a0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
341b0 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65   pLoop = pBuilde
341c0 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70  r->pNew;.  pLoop
341d0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ->wsFlags = 0;. 
341e0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
341f0 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65  nSkip = 0;.  pTe
34200 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
34210 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
34220 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28  WO_EQ, 0);.  if(
34230 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c   pTerm ){.    pL
34240 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
34250 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
34260 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
34270 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
34280 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
34290 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
342a0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
342b0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
342c0 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
342d0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
342e0 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
342f0 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
34300 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
34310 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
34320 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
34330 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
34340 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
34350 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
34360 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
34370 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ert( pLoop->aLTe
34380 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e  rmSpace==pLoop->
34390 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  aLTerm );.      
343a0 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
343b0 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53  e(pLoop->aLTermS
343c0 70 61 63 65 29 3d 3d 34 20 29 3b 0a 20 20 20 20  pace)==4 );.    
343d0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
343e0 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 0a 20 20  ror==OE_None .  
343f0 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50       || pIdx->pP
34400 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a  artIdxWhere!=0 .
34410 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
34420 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a  nKeyCol>ArraySiz
34430 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53  e(pLoop->aLTermS
34440 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63  pace) .      ) c
34450 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
34460 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
34470 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
34480 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66         pTerm = f
34490 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
344a0 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  r, pIdx->aiColum
344b0 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20  n[j], 0, WO_EQ, 
344c0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
344d0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
344e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  eak;.        pLo
344f0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
34500 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
34510 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
34520 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
34530 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
34540 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
34550 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
34560 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
34570 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
34580 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72  f( pIdx->isCover
34590 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63  ing || (pItem->c
345a0 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
345b0 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d  sInIndex(pIdx))=
345c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
345d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
345e0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
345f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
34600 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b  oop->nLTerm = j;
34610 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
34620 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20  btree.nEq = j;. 
34630 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
34640 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
34650 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  x;.      /* TUNI
34660 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e  NG: Cost of a un
34670 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ique index looku
34680 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20  p is 15 */.     
34690 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
346a0 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74  9;  /* 39==sqlit
346b0 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a  e3LogEst(15) */.
346c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
346d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
346e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20  op->wsFlags ){. 
346f0 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d     pLoop->nOut =
34700 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20   (LogEst)1;.    
34710 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
34720 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
34730 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
34740 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   = getMask(&pWIn
34750 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
34760 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ur);.    pWInfo-
34770 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20  >a[0].iTabCur = 
34780 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  iCur;.    pWInfo
34790 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20  ->nRowOut = 1;. 
347a0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
347b0 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
347c0 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e  ->nOBSat =  pWIn
347d0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
347e0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  xpr;.    if( pWI
347f0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
34800 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
34810 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
34820 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
34830 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
34840 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
34850 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
34860 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63  BUG.    pLoop->c
34870 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66  Id = '0';.#endif
34880 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
34890 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
348a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
348b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
348c0 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20  f the loop used 
348d0 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
348e0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20   processing..** 
348f0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
34900 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
34910 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63   an opaque struc
34920 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ture that contai
34930 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ns.** informatio
34940 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d  n needed to term
34950 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
34960 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c   Later, the call
34970 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  ing routine.** s
34980 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
34990 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
349a0 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76  ith the return v
349b0 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
349c0 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65  ction.** in orde
349d0 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
349e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
349f0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
34a00 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
34a10 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  urs, this routin
34a20 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  e returns NULL..
34a30 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20  **.** The basic 
34a40 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20  idea is to do a 
34a50 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65  nested loop, one
34a60 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74   loop for each t
34a70 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  able in.** the F
34a80 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
34a90 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54  select.  (INSERT
34aa0 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74   and UPDATE stat
34ab0 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a  ements are the.*
34ac0 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45  * same as a SELE
34ad0 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73  CT with only a s
34ae0 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
34af0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29  he FROM clause.)
34b00 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65    For.** example
34b10 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20  , if the SQL is 
34b20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
34b30 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
34b40 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
34b50 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...;.**.** Then
34b60 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
34b70 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61  ted is conceptua
34b80 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c  lly like the fol
34b90 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
34ba0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
34bb0 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c  in t1 do       \
34bc0 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
34bd0 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72  ed.**        for
34be0 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
34bf0 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73  do      |-- by s
34c00 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
34c10 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ().**          f
34c20 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74  oreach row3 in t
34c30 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20  3 do   /.**     
34c40 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
34c50 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
34c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
34c70 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
34c80 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64  ed.**        end
34c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ca0 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73          |-- by s
34cb0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
34cc0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20  .**      end    
34cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ce0 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74       /.**.** Not
34cf0 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73  e that the loops
34d00 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65   might not be ne
34d10 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  sted in the orde
34d20 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a  r in which they.
34d30 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ** appear in the
34d40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20   FROM clause if 
34d50 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
34d60 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65  r is better able
34d70 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20   to make.** use 
34d80 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  of indices.  Not
34d90 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e  e also that when
34da0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
34db0 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74   appears in.** t
34dc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
34dd0 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74   it might result
34de0 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   in additional n
34df0 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a  ested loops for.
34e00 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  ** scanning thro
34e10 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ugh all values o
34e20 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
34e30 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e   side of the IN.
34e40 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
34e50 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61   Btree cursors a
34e60 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
34e70 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75  ach table.  t1 u
34e80 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ses cursor.** nu
34e90 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  mber pTabList->a
34ea0 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32  [0].iCursor.  t2
34eb0 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72   uses the cursor
34ec0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e   pTabList->a[1].
34ed0 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20  iCursor..** And 
34ee0 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20  so forth.  This 
34ef0 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
34f00 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  s code to open t
34f10 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72  hose VDBE cursor
34f20 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  s.** and sqlite3
34f30 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72  WhereEnd() gener
34f40 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
34f50 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a   close them..**.
34f60 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
34f70 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
34f80 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c  in() generates l
34f90 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
34fa0 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54  s named.** in pT
34fb0 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  abList pointing 
34fc0 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72  at their appropr
34fd0 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54  iate entries.  T
34fe0 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a  he [...] code.**
34ff0 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75   can use OP_Colu
35000 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20  mn and OP_Rowid 
35010 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65  opcodes on these
35020 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72   cursors to extr
35030 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d  act.** data from
35040 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62   the various tab
35050 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  les of the loop.
35060 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
35070 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d  ERE clause is em
35080 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68  pty, the foreach
35090 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68   loops must each
350a0 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65   scan their.** e
350b0 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54  ntire tables.  T
350c0 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20  hus a three-way 
350d0 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33  join is an O(N^3
350e0 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  ) operation.  Bu
350f0 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  t if.** the tabl
35100 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  es have indices 
35110 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65  and there are te
35120 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
35130 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20   clause that.** 
35140 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69  refer to those i
35150 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65  ndices, a comple
35160 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61  te table scan ca
35170 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64  n be avoided and
35180 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c   the.** code wil
35190 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65  l run much faste
351a0 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  r.  Most of the 
351b0 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75  work of this rou
351c0 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67  tine is checking
351d0 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68  .** to see if th
351e0 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20  ere are indices 
351f0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
35200 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65   to speed up the
35210 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72   loop..**.** Ter
35220 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
35230 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20  clause are also 
35240 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68  used to limit wh
35250 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c  ich rows actuall
35260 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20  y.** make it to 
35270 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65  the "..." in the
35280 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c   middle of the l
35290 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68  oop.  After each
352a0 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74   "foreach",.** t
352b0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
352c0 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73  E clause that us
352d0 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20  e only terms in 
352e0 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75  that loop and ou
352f0 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65  ter.** loops are
35300 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
35310 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69  f false a jump i
35320 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c  s made around al
35330 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
35340 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20  inner loops (or 
35350 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22  around the "..."
35360 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63   if the test occ
35370 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69  urs within the i
35380 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f  nner-.** most lo
35390 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20  op).**.** OUTER 
353a0 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f  JOINS.**.** An o
353b0 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62  uter join of tab
353c0 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73  les t1 and t2 is
353d0 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64   conceptally cod
353e0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
353f0 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20  *.**    foreach 
35400 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a  row1 in t1 do.**
35410 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a        flag = 0.*
35420 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
35430 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20  ow2 in t2 do.** 
35440 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a         start:.**
35450 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
35460 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
35470 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a   1.**      end.*
35480 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d  *      if flag==
35490 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  0 then.**       
354a0 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63   move the row2 c
354b0 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20  ursor to a null 
354c0 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f  row.**        go
354d0 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20  to start.**     
354e0 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a   fi.**    end.**
354f0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41  .** ORDER BY CLA
35500 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a  USE PROCESSING.*
35510 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
35520 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
35530 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
35540 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20  e (or the GROUP 
35550 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20  BY clause.** if 
35560 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
35570 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
35580 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20   wctrlFlags) of 
35590 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
355a0 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  nt.** if there i
355b0 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
355c0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
355d0 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
355e0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
355f0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
35600 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
35610 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
35620 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
35630 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78  ..**.** The iIdx
35640 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  Cur parameter is
35650 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
35660 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20  er of an index. 
35670 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e   If .** WHERE_ON
35680 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73  ETABLE_ONLY is s
35690 65 74 2c 20 69 49 64 78 43 75 72 20 69 73 20 74  et, iIdxCur is t
356a0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
356b0 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
356c0 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c  to use for OR cl
356d0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
356e0 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
356f0 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68  se should use th
35700 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63  is.** specific c
35710 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45  ursor.  If WHERE
35720 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
35730 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49   is set, then iI
35740 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20  dxCur is.** the 
35750 66 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20  first cursor in 
35760 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72 73  an array of curs
35770 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69  ors for all indi
35780 63 65 73 2e 20 20 69 49 64 78 43 75 72 20 73 68  ces.  iIdxCur sh
35790 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20  ould.** be used 
357a0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  to compute the a
357b0 70 70 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f  ppropriate curso
357c0 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  r depending on w
357d0 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a  hich index is.**
357e0 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49   used..*/.WhereI
357f0 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
35800 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
35810 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
35820 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
35830 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
35840 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
35850 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a   /* FROM clause:
35860 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
35870 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
35880 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
35890 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
358a0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
358b0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
358c0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
358d0 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72   An ORDER BY (or
358e0 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73   GROUP BY) claus
358f0 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
35900 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c  ExprList *pResul
35910 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20  tSet, /* Result 
35920 73 65 74 20 6f 66 20 74 68 65 20 71 75 65 72 79  set of the query
35930 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
35940 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f  lags,       /* O
35950 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
35960 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20  * flags defined 
35970 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a  in sqliteInt.h *
35980 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 20  /.  int iIdxCur 
35990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
359a0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
359b0 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65  NLY is set, inde
359c0 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  x cursor number 
359d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  */.){.  int nByt
359e0 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eWInfo;         
359f0 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73     /* Num. bytes
35a00 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57   allocated for W
35a10 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20  hereInfo struct 
35a20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  */.  int nTabLis
35a30 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
35a40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
35a50 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73  ments in pTabLis
35a60 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
35a70 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
35a80 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65    /* Will become
35a90 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
35aa0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
35ab0 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  on */.  Vdbe *v 
35ac0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
35ad0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
35ae0 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
35af0 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
35b00 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
35b10 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61    /* Cursors tha
35b20 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f  t are not yet po
35b30 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68  sitioned */.  Wh
35b40 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
35b50 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  WLB;     /* The 
35b60 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65  WhereLoop builde
35b70 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  r */.  WhereMask
35b80 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
35b90 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
35ba0 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
35bb0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
35bc0 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  evel;        /* 
35bd0 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
35be0 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f  n pWInfo->a[] */
35bf0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
35c00 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  oop;          /*
35c10 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69   Pointer to a si
35c20 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ngle WhereLoop o
35c30 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
35c40 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
35c50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
35c60 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  unter */.  sqlit
35c70 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
35c80 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
35c90 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
35ca0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
35cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35cc0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
35cd0 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69  .  /* Variable i
35ce0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
35cf0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
35d00 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57  db;.  memset(&sW
35d10 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  LB, 0, sizeof(sW
35d20 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f  LB));..  /* An O
35d30 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c  RDER/GROUP BY cl
35d40 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61  ause of more tha
35d50 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f  n 63 terms canno
35d60 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a  t be optimized *
35d70 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  /.  testcase( pO
35d80 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
35d90 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31  By->nExpr==BMS-1
35da0 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   );.  if( pOrder
35db0 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e  By && pOrderBy->
35dc0 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72  nExpr>=BMS ) pOr
35dd0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c  derBy = 0;.  sWL
35de0 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  B.pOrderBy = pOr
35df0 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73  derBy;..  /* Dis
35e00 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43  able the DISTINC
35e10 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  T optimization i
35e20 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  f SQLITE_Distinc
35e30 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a  tOpt is set via.
35e40 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
35e50 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45  t_ctrl(SQLITE_TE
35e60 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
35e70 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69  IONS,...) */.  i
35e80 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
35e90 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
35ea0 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20  TE_DistinctOpt) 
35eb0 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  ){.    wctrlFlag
35ec0 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54  s &= ~WHERE_WANT
35ed0 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a  _DISTINCT;.  }..
35ee0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
35ef0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
35f00 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
35f10 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
35f20 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
35f30 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
35f40 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
35f50 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
35f60 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70  ==BMS );.  if( p
35f70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
35f80 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
35f90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
35fa0 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
35fb0 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
35fc0 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
35fd0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
35fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d  is function norm
35ff0 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61  ally generates a
36000 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72   nested loop for
36010 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a   all tables in .
36020 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20    ** pTabList.  
36030 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45  But if the WHERE
36040 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
36050 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
36060 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
36070 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
36080 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
36090 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
360a0 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
360b0 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
360c0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
360d0 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
360e0 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
360f0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
36100 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
36110 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
36120 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20  NETABLE_ONLY) ? 
36130 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  1 : pTabList->nS
36140 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  rc;..  /* Alloca
36150 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
36160 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
36170 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
36180 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
36190 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
361a0 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  . A single alloc
361b0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
361c0 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65   store the Where
361d0 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74  Info.  ** struct
361e0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
361f0 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c  f WhereInfo.a[],
36200 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
36210 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
36220 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73  and the WhereMas
36230 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20  kSet structure. 
36240 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73  Since WhereClaus
36250 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d  e contains an 8-
36260 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  byte.  ** field 
36270 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69  (type Bitmask) i
36280 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65  t must be aligne
36290 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62  d on an 8-byte b
362a0 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20  oundary on.  ** 
362b0 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72  some architectur
362c0 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f  es. Hence the RO
362d0 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20  UND8() below..  
362e0 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20  */.  nByteWInfo 
362f0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
36300 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62  WhereInfo)+(nTab
36310 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57  List-1)*sizeof(W
36320 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70  hereLevel));.  p
36330 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
36340 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
36350 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
36360 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
36370 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
36380 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
36390 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
363a0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
363b0 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
363c0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
363d0 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
363e0 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30  ->aiCurOnePass[0
363f0 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75  ] = pWInfo->aiCu
36400 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31  rOnePass[1] = -1
36410 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ;.  pWInfo->nLev
36420 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20  el = nTabList;. 
36430 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
36440 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
36450 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
36460 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
36470 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
36480 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f  rderBy;.  pWInfo
36490 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70  ->pResultSet = p
364a0 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49  ResultSet;.  pWI
364b0 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57  nfo->iBreak = pW
364c0 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
364d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
364e0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49  eLabel(v);.  pWI
364f0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
36500 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  = wctrlFlags;.  
36510 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
36520 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
36530 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
36540 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e  pMaskSet = &pWIn
36550 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20  fo->sMaskSet;.  
36560 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57  sWLB.pWInfo = pW
36570 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43  Info;.  sWLB.pWC
36580 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
36590 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28  .  sWLB.pNew = (
365a0 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68  WhereLoop*)(((ch
365b0 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74  ar*)pWInfo)+nByt
365c0 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eWInfo);.  asser
365d0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
365e0 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65  IGNMENT(sWLB.pNe
365f0 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  w) );.  whereLoo
36600 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29  pInit(sWLB.pNew)
36610 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
36620 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65  DEBUG.  sWLB.pNe
36630 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65  w->cId = '*';.#e
36640 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  ndif..  /* Split
36650 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
36660 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
36670 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
36680 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
36690 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
366a0 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
366b0 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
366c0 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
366d0 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68  (pMaskSet);.  wh
366e0 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70  ereClauseInit(&p
366f0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e  WInfo->sWC, pWIn
36700 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  fo);.  whereSpli
36710 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
36720 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
36730 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69  .    .  /* Speci
36740 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45  al case: a WHERE
36750 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
36760 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75  constant.  Evalu
36770 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70  ate the.  ** exp
36780 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68  ression and eith
36790 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c  er jump over all
367a0 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20   of the code or 
367b0 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a  fall thru..  */.
367c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73    for(ii=0; ii<s
367d0 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  WLB.pWC->nTerm; 
367e0 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e  ii++){.    if( n
367f0 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71  TabList==0 || sq
36800 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
36810 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e  antNotJoin(sWLB.
36820 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pWC->a[ii].pExpr
36830 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
36840 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
36850 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e  arse, sWLB.pWC->
36860 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57 49  a[ii].pExpr, pWI
36870 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20  nfo->iBreak,.   
36880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36890 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d        SQLITE_JUM
368a0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
368b0 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e  sWLB.pWC->a[ii].
368c0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
368d0 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
368e0 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
368f0 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61  ase: No FROM cla
36900 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  use.  */.  if( n
36910 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  TabList==0 ){.  
36920 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
36930 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
36940 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
36950 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c  r;.    if( wctrl
36960 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
36970 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
36980 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
36990 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
369a0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
369b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
369c0 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f  Assign a bit fro
369d0 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f  m the bitmask to
369e0 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
369f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
36a00 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61    **.  ** When a
36a10 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b  ssigning bitmask
36a20 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20   values to FROM 
36a30 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20  clause cursors, 
36a40 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  it must be.  ** 
36a50 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66  the case that if
36a60 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
36a70 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46  k for the N-th F
36a80 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
36a90 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69  then.  ** the bi
36aa0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52  tmask for all FR
36ab0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
36ac0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
36ad0 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a  he N-th term.  *
36ae0 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e  * is (X-1).   An
36af0 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
36b00 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
36b10 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  f a LEFT JOIN ca
36b20 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45  n use.  ** its E
36b30 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
36b40 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e  ble value to fin
36b50 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66  d the bitmask of
36b60 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
36b70 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  .  ** of the joi
36b80 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20  n.  Subtracting 
36b90 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67  one from the rig
36ba0 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b  ht table bitmask
36bb0 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69   gives a.  ** bi
36bc0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
36bd0 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
36be0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b   of the join.  K
36bf0 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61  nowing the bitma
36c00 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  sk.  ** for all 
36c10 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
36c20 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  ft of a left joi
36c30 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  n is important. 
36c40 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20   Ticket #3015.. 
36c50 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
36c60 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20  at bitmasks are 
36c70 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
36c80 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74  pTabList->nSrc t
36c90 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54  ables in.  ** pT
36ca0 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74  abList, not just
36cb0 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c   the first nTabL
36cc0 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61  ist tables.  nTa
36cd0 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c  bList is normall
36ce0 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20  y.  ** equal to 
36cf0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62  pTabList->nSrc b
36d00 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  ut might be shor
36d10 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68  tened to 1 if th
36d20 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45  e.  ** WHERE_ONE
36d30 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
36d40 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66  is set..  */.  f
36d50 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
36d60 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
36d70 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
36d80 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
36d90 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
36da0 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
36db0 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
36dc0 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
36dd0 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
36de0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
36df0 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
36e00 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
36e10 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
36e20 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
36e30 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
36e40 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31      assert( (m-1
36e50 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a  )==toTheLeft );.
36e60 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20        toTheLeft 
36e70 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  |= m;.    }.  }.
36e80 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
36e90 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
36ea0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
36eb0 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41   Note that exprA
36ec0 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20  nalyze() might. 
36ed0 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74   ** add new virt
36ee0 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74  ual terms onto t
36ef0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
36f00 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20  ERE clause.  We 
36f10 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74  do not.  ** want
36f20 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73   to analyze thes
36f30 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c  e virtual terms,
36f40 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a   so start analyz
36f50 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20  ing at the end. 
36f60 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72   ** and work for
36f70 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65  ward so that the
36f80 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74   added virtual t
36f90 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70  erms are never p
36fa0 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  rocessed..  */. 
36fb0 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
36fc0 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
36fd0 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
36fe0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
36ff0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
37000 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
37010 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ..  if( wctrlFla
37020 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
37030 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
37040 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65  if( isDistinctRe
37050 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
37060 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
37070 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53  o->sWC, pResultS
37080 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  et) ){.      /* 
37090 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72  The DISTINCT mar
370a0 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73  king is pointles
370b0 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a  s.  Ignore it. *
370c0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
370d0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
370e0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
370f0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
37100 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
37110 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
37120 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73  ORDER BY the res
37130 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20  ult set to make 
37140 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73  distinct process
37150 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20  ing easier */.  
37160 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
37170 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
37180 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
37190 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
371a0 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  By = pResultSet;
371b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
371c0 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
371d0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
371e0 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45   */.  WHERETRACE
371f0 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
37200 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
37210 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20 44 69 73  *\n"));.  /* Dis
37220 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f  play all terms o
37230 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
37240 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  se */.#if define
37250 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
37260 42 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65 64  BLED) && defined
37270 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
37280 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 69  REE_EXPLAIN).  i
37290 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
372a0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
372b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56      int i;.    V
372c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
372d0 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69  >pVdbe;.    sqli
372e0 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28  te3ExplainBegin(
372f0 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  v);.    for(i=0;
37300 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65   i<sWLB.pWC->nTe
37310 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
37320 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
37330 69 6e 74 66 28 76 2c 20 22 23 25 2d 32 64 20 22  intf(v, "#%-2d "
37340 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , i);.      sqli
37350 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76  te3ExplainPush(v
37360 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 45 78  );.      whereEx
37370 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 26 73 57  plainTerm(v, &sW
37380 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20  LB.pWC->a[i]);. 
37390 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
373a0 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20  ainPop(v);.     
373b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
373c0 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L(v);.    }.    
373d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69  sqlite3ExplainFi
373e0 6e 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c  nish(v);.    sql
373f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
37400 22 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62  "%s", sqlite3Vdb
37410 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29  eExplanation(v))
37420 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
37430 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
37440 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
37450 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
37460 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
37470 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
37480 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
37490 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
374a0 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c  .  .    /* Displ
374b0 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68  ay all of the Wh
374c0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
374d0 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73  if wheretrace is
374e0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64   enabled */.#ifd
374f0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
37500 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a  ABLED /* !=0 */.
37510 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
37520 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
37530 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
37540 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
37550 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
37560 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
37570 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
37580 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
37590 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
375a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375b0 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46           "ABCDEF
375c0 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
375d0 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72  WYXZ";.      for
375e0 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  (p=pWInfo->pLoop
375f0 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e  s, i=0; p; p=p->
37600 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b  pNextLoop, i++){
37610 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20  .        p->cId 
37620 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f  = zLabel[i%sizeo
37630 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20  f(zLabel)];.    
37640 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
37650 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b  nt(p, sWLB.pWC);
37660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
37670 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65  endif.  .    whe
37680 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
37690 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nfo, 0);.    if(
376a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
376b0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
376c0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66  ginError;.    if
376d0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
376e0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65  By ){.       whe
376f0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
37700 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  nfo, pWInfo->nRo
37710 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  wOut+1);.       
37720 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
37730 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
37740 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
37750 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
37760 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
37770 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
37780 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
37790 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  rder)!=0 ){.    
377a0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
377b0 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29   = (Bitmask)(-1)
377c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
377d0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45  se->nErr || NEVE
377e0 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  R(db->mallocFail
377f0 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ed) ){.    goto 
37800 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
37810 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52  .  }.#ifdef WHER
37820 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
37830 2a 20 21 3d 30 20 2a 2f 0a 20 20 69 66 28 20 73  * !=0 */.  if( s
37840 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
37850 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   ){.    int ii;.
37860 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
37870 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
37880 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
37890 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
378a0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
378b0 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
378c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
378d0 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
378e0 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
378f0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
37900 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
37910 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
37920 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
37930 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
37940 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
37950 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
37960 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
37970 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
37980 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
37990 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
379a0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
379b0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
379c0 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
379d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
379e0 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
379f0 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
37a00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
37a10 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
37a20 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
37a30 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
37a40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
37a50 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
37a60 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
37a70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
37a80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
37a90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
37aa0 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
37ab0 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
37ac0 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
37ad0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
37ae0 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
37af0 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
37b00 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
37b10 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70  ndif.  /* Attemp
37b20 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73  t to omit tables
37b30 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74   from the join t
37b40 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63  hat do not effec
37b50 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  t the result */.
37b60 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
37b70 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52  evel>=2.   && pR
37b80 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26  esultSet!=0.   &
37b90 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
37ba0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
37bb0 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20  _OmitNoopJoin). 
37bc0 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
37bd0 74 61 62 55 73 65 64 20 3d 20 65 78 70 72 4c 69  tabUsed = exprLi
37be0 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
37bf0 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65  skSet, pResultSe
37c00 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42  t);.    if( sWLB
37c10 2e 70 4f 72 64 65 72 42 79 20 29 20 74 61 62 55  .pOrderBy ) tabU
37c20 73 65 64 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  sed |= exprListT
37c30 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
37c40 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  et, sWLB.pOrderB
37c50 79 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  y);.    while( p
37c60 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
37c70 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
37c80 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e  erm *pTerm, *pEn
37c90 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d  d;.      pLoop =
37ca0 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66   pWInfo->a[pWInf
37cb0 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c  o->nLevel-1].pWL
37cc0 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28  oop;.      if( (
37cd0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
37ce0 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
37cf0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
37d00 45 46 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  EFT)==0 ) break;
37d10 0a 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72  .      if( (wctr
37d20 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
37d30 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30  ANT_DISTINCT)==0
37d40 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f  .       && (pLoo
37d50 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
37d60 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20  RE_ONEROW)==0.  
37d70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62      ){.        b
37d80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
37d90 20 20 20 20 69 66 28 20 28 74 61 62 55 73 65 64      if( (tabUsed
37da0 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
37db0 6c 66 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  lf)!=0 ) break;.
37dc0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c        pEnd = sWL
37dd0 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e  B.pWC->a + sWLB.
37de0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
37df0 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42    for(pTerm=sWLB
37e00 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  .pWC->a; pTerm<p
37e10 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
37e20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
37e30 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
37e40 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
37e50 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  =0.         && !
37e60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
37e70 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
37e80 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
37e90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
37ea0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
37eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37ec0 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20  f( pTerm<pEnd ) 
37ed0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45  break;.      WHE
37ee0 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20  RETRACE(0xffff, 
37ef0 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25  ("-> drop loop %
37f00 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70  c not used\n", p
37f10 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20  Loop->cId));.   
37f20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65     pWInfo->nLeve
37f30 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c  l--;.      nTabL
37f40 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ist--;.    }.  }
37f50 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
37f60 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d  ffff,("*** Optim
37f70 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a  izer Finished **
37f80 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f  *\n"));.  pWInfo
37f90 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  ->pParse->nQuery
37fa0 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e  Loop += pWInfo->
37fb0 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49  nRowOut;..  /* I
37fc0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
37fd0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
37fe0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ETE statement th
37ff0 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  at is requesting
38000 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f  .  ** to use a o
38010 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
38020 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  m, determine if 
38030 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69  this is appropri
38040 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  ate..  ** The on
38050 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
38060 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74   only works if t
38070 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
38080 63 6f 6e 73 74 72 61 69 6e 73 0a 20 20 2a 2a 20  constrains.  ** 
38090 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
380a0 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65   update a single
380b0 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
380c0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
380d0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
380e0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
380f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
38100 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
38110 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
38120 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
38130 3d 30 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66  =0 .   && (pWInf
38140 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
38150 77 73 46 6c 61 67 73 20 26 20 57 48