/ Hex Artifact Content
Login

Artifact da9c2c1d0c2ecf51ea3b7a27c826999972f24086:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
2c90: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
2ca0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
2cb0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
2cc0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
2cd0: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
2ce0: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
2cf0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d00: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
2d10: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
2d20: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
2d30: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
2d40: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66  X"..**.** If lef
2d50: 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65 6e  t/right preceden
2d60: 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e  ce rules come in
2d70: 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65 74  to play when det
2d80: 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ermining the.** 
2d90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2da0: 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45  ce, then COLLATE
2db0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 61   operators are a
2dc0: 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75 72  djusted to ensur
2dd0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  e.** that the co
2de0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2df0: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2e00: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e10: 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "Y collate NO
2e20: 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d  CASE op X" becom
2e30: 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63 61  es "X op Y" beca
2e40: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
2e50: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
2e60: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
2e70: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
2e80: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
2e90: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2ea0: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
2eb0: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
2ec0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
2ed0: 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  son the EP_Colla
2ee0: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
2ef0: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
2f00: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
2f10: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
2f20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2f30: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
2f40: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
2f50: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2f60: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
2f70: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
2f80: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
2f90: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
2fa0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
2fb0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2fc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
2fd0: 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69 67   );.  if( expRig
2fe0: 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20  ht==expLeft ){. 
2ff0: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20 61     /* Either X a
3000: 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20 43  nd Y both have C
3010: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3020: 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f  or neither do */
3030: 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67 68  .    if( expRigh
3040: 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f  t ){.      /* Bo
3050: 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65 20  th X and Y have 
3060: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
3070: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58 20  s.  Make sure X 
3080: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  is always.      
3090: 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61 72  ** used by clear
30a0: 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  ing the EP_Colla
30b0: 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20  te flag from Y. 
30c0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
30d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d  pRight->flags &=
30e0: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
30f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
3100: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
3110: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
3120: 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
3130: 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e 6f   /* Neither X no
3140: 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  r Y have COLLATE
3150: 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74 20   operators, but 
3160: 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  X has a non-defa
3170: 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ult.      ** col
3180: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
3190: 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50 5f    So add the EP_
31a0: 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f  Collate marker o
31b0: 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20 20  n X to cause.   
31c0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 73     ** it to be s
31d0: 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20 2a  earched first. *
31e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  /.      pExpr->p
31f0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
3200: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3210: 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70 72  .  }.  SWAP(Expr
3220: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3230: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3240: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3250: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3260: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3270: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
3280: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3290: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
32a0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
32b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
32c0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
32d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
32e0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
32f0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3300: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3310: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3320: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3340: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3350: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3360: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3370: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
3380: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
3390: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
33a0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
33b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
33c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
33d0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
33e0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
33f0: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3400: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3410: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
3420: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
3430: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
3440: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
3450: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
3460: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
3470: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
3480: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
3490: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
34a0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
34b0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
34c0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
34d0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34e0: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
34f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3500: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
3510: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
3520: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
3530: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
3540: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
3550: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
3560: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
3570: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3580: 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68  ext WhereTerm th
3590: 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72  at matches accor
35a0: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74  ding to the crit
35b0: 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73  eria.** establis
35c0: 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63  hed when the pSc
35d0: 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e  an object was in
35e0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65  itialized by whe
35f0: 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a  reScanInit()..**
3600: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3610: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3620: 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65  e matching Where
3630: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Terms..*/.static
3640: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
3650: 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53  eScanNext(WhereS
3660: 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69  can *pScan){.  i
3670: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
3680: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
3690: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  r on the LHS of 
36a0: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
36b0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
36c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
36d0: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
36e0: 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72  he term.  -1 for
36f0: 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a   IPK */.  Expr *
3700: 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pX;            /
3710: 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
3720: 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a  being tested */.
3730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3740: 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68  WC;    /* Shorth
3750: 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70  and for pScan->p
3760: 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  WC */.  WhereTer
3770: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
3780: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74  The term being t
3790: 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b  ested */.  int k
37a0: 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20   = pScan->k;    
37b0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72  /* Where to star
37c0: 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20  t scanning */.. 
37d0: 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69   while( pScan->i
37e0: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
37f0: 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72  quiv ){.    iCur
3800: 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76   = pScan->aEquiv
3810: 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32  [pScan->iEquiv-2
3820: 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  ];.    iColumn =
3830: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70   pScan->aEquiv[p
3840: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
3850: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57 43  .    while( (pWC
3860: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d   = pScan->pWC)!=
3870: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  0 ){.      for(p
3880: 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b  Term=pWC->a+k; k
3890: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b  <pWC->nTerm; k++
38a0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
38b0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
38c0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
38d0: 20 20 20 20 20 20 20 20 20 26 26 20 70 54 65 72           && pTer
38e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
38f0: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
3900: 20 20 26 26 20 28 70 53 63 61 6e 2d 3e 69 45 71    && (pScan->iEq
3910: 75 69 76 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48  uiv<=2 || !ExprH
3920: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
3930: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
3940: 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 20 20 29  Join)).        )
3950: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3960: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
3970: 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21 3d 30  r & WO_EQUIV)!=0
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
3990: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72  Scan->nEquiv<Arr
39a0: 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45  aySize(pScan->aE
39b0: 71 75 69 76 29 0a 20 20 20 20 20 20 20 20 20 20  quiv).          
39c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
39d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
39e0: 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78    pX = sqlite3Ex
39f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54  prSkipCollate(pT
3a00: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
3a10: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
3a20: 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
3a30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
3a40: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
3a50: 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75  0; j<pScan->nEqu
3a60: 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20  iv; j+=2){.     
3a70: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3a80: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70  an->aEquiv[j]==p
3a90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
3aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3ab0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d  n->aEquiv[j+1]==
3ac0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
3b20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
3b30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
3b40: 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69  Equiv[j] = pX->i
3b50: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
3b60: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3b70: 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43  iv[j+1] = pX->iC
3b80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
3b90: 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75       pScan->nEqu
3ba0: 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  iv += 2;.       
3bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
3bd0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3be0: 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61  or & pScan->opMa
3bf0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
3c00: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
3c10: 74 68 65 20 61 66 66 69 6e 69 74 79 20 61 6e 64  the affinity and
3c20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
3c30: 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  nce match */.   
3c40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 63           if( pSc
3c50: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26  an->zCollName &&
3c60: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
3c70: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d  or & WO_ISNULL)=
3c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3c90: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
3ca0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
3cb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3cc0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
3cd0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
3ce0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
3cf0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
3d00: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3d10: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3d20: 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78  k(pX, pScan->idx
3d30: 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  aff) ){.        
3d40: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3d60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3d70: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3d90: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3da0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
3db0: 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20 20 20  lSeq(pParse,.   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3df0: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
3e00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
3e10: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
3e20: 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  0 ) pColl = pPar
3e30: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
3e40: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l;.             
3e50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3e60: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
3e70: 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  , pScan->zCollNa
3e80: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  me) ){.         
3e90: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
3ed0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3ee0: 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
3ef0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f10: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3f20: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3f30: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3f40: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3f50: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3f60: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3f70: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
3f80: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
3f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fc0: 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b      pScan->k = k
3fd0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1;.            
3fe0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
3ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4010: 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70    pScan->pWC = p
4020: 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65  Scan->pWC->pOute
4030: 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  r;.      k = 0;.
4040: 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d      }.    pScan-
4050: 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f  >pWC = pScan->pO
4060: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
4070: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
4080: 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  uiv += 2;.  }.  
4090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
40a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
40b0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 63 61  WHERE clause sca
40c0: 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20 52 65  nner object.  Re
40d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
40e0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  o the.** first m
40f0: 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20 4e 55  atch.  Return NU
4100: 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  LL if there are 
4110: 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  no matches..**.*
4120: 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20 77 69  * The scanner wi
4130: 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20  ll be searching 
4140: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4150: 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c   pWC.  It will l
4160: 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73  ook.** for terms
4170: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4180: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
4190: 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69  re X is column i
41a0: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a  Column of table.
41b0: 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20 3c 6f  ** iCur.  The <o
41c0: 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p> must be one o
41d0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
41e0: 64 65 73 63 72 69 62 65 64 20 62 79 20 6f 70 4d  described by opM
41f0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ask..**.** If th
4200: 65 20 73 65 61 72 63 68 20 69 73 20 66 6f 72 20  e search is for 
4210: 58 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  X and the WHERE 
4220: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
4230: 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
4240: 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20 74 68  form X=Y then th
4250: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
4260: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74 65 72   also return ter
4270: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ms of the form.*
4280: 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  * "Y <op> <expr>
4290: 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ".  The number o
42a0: 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 61 6e  f levels of tran
42b0: 73 69 74 69 76 69 74 79 20 69 73 20 6c 69 6d 69  sitivity is limi
42c0: 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65  ted,.** but is e
42d0: 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c 65 20  nough to handle 
42e0: 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63  most commonly oc
42f0: 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74 61 74  curring SQL stat
4300: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
4310: 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20 49 4e   X is not the IN
4320: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4330: 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20 62 65  Y then X must be
4340: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4350: 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  .** index pIdx..
4360: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
4370: 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e  erm *whereScanIn
4380: 69 74 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20  it(.  WhereScan 
4390: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a  *pScan,       /*
43a0: 20 54 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f   The WhereScan o
43b0: 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74  bject being init
43c0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
43d0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
43e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
43f0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4400: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  canned */.  int 
4410: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
4420: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
4430: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69   scan for */.  i
4440: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
4450: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
4460: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
4470: 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20    u32 opMask,   
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
4490: 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e  rator(s) to scan
44a0: 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20   for */.  Index 
44b0: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
44c0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
44d0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
44e0: 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  s index */.){.  
44f0: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d  int j;..  /* mem
4500: 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69  set(pScan, 0, si
4510: 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a  zeof(*pScan)); *
4520: 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  /.  pScan->pOrig
4530: 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61  WC = pWC;.  pSca
4540: 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  n->pWC = pWC;.  
4550: 69 66 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c  if( pIdx && iCol
4560: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53  umn>=0 ){.    pS
4570: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49  can->idxaff = pI
4580: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
4590: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
45a0: 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ty;.    for(j=0;
45b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
45c0: 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  j]!=iColumn; j++
45d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56  ){.      if( NEV
45e0: 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  ER(j>=pIdx->nKey
45f0: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Col) ) return 0;
4600: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e  .    }.    pScan
4610: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
4620: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
4630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61   }else{.    pSca
4640: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
4650: 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e     pScan->zCollN
4660: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ame = 0;.  }.  p
4670: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f  Scan->opMask = o
4680: 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e  pMask;.  pScan->
4690: 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e  k = 0;.  pScan->
46a0: 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72  aEquiv[0] = iCur
46b0: 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  ;.  pScan->aEqui
46c0: 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  v[1] = iColumn;.
46d0: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20    pScan->nEquiv 
46e0: 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45  = 2;.  pScan->iE
46f0: 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75  quiv = 2;.  retu
4700: 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74  rn whereScanNext
4710: 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pScan);.}../*.*
4720: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
4730: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
4740: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
4750: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4760: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
4770: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
4780: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
4790: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
47a0: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
47b0: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
47c0: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
47d0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
47e0: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
47f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
4800: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
4810: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
4820: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
4830: 54 68 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65  The term returne
4840: 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78  d might by Y=<ex
4850: 70 72 3e 20 69 66 20 74 68 65 72 65 20 69 73 20  pr> if there is 
4860: 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69  another constrai
4870: 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  nt in.** the WHE
4880: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 73  RE clause that s
4890: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 58 3d  pecifies that X=
48a0: 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e  Y.  Any such con
48b0: 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65  straints will be
48c0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62  .** identified b
48d0: 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62  y the WO_EQUIV b
48e0: 69 74 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d  it in the pTerm-
48f0: 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64  >eOperator field
4900: 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76  .  The.** aEquiv
4910: 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58  [] array holds X
4920: 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75   and all its equ
4930: 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65  ivalents, with e
4940: 61 63 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ach SQL variable
4950: 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77  .** taking up tw
4960: 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69  o slots in aEqui
4970: 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20  v[].  The first 
4980: 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20  slot is for the 
4990: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a  cursor number.**
49a0: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
49b0: 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  is for the colum
49c0: 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65  n number.  There
49d0: 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e   are 22 slots in
49e0: 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20   aEquiv[].** so 
49f0: 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61  that means we ca
4a00: 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75  n look for X plu
4a10: 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72  s up to 10 other
4a20: 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75   equivalent valu
4a30: 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73  es..** Hence a s
4a40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
4a50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
4a60: 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32  f X=A1 and A1=A2
4a70: 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e   and A2=A3.** an
4a80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
4a90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
4aa0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
4ab0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
4ac0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
4ad0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
4ae0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
4af0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
4b00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
4b10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
4b20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
4b30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
4b40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
4b50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
4b60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
4b70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
4b80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
4b90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
4ba0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
4bb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
4bc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
4bd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
4be0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
4bf0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
4c00: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
4c10: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
4c20: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
4c30: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
4c40: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
4c50: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74   WO_EQUIV..*/.st
4c60: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
4c70: 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72  findTerm(.  Wher
4c80: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4c90: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
4ca0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72  lause to be sear
4cb0: 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ched */.  int iC
4cc0: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
4cd0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
4ce0: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74   of LHS */.  int
4cf0: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
4d00: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
4d10: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
4d20: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
4d30: 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73  ,     /* RHS mus
4d40: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69  t not overlap wi
4d50: 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a  th this mask */.
4d60: 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20    u32 op,       
4d70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
4d80: 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20  of WO_xx values 
4d90: 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61  describing opera
4da0: 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  tor */.  Index *
4db0: 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f  pIdx           /
4dc0: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
4dd0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
4de0: 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  ndex, if not NUL
4df0: 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  L */.){.  WhereT
4e00: 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30  erm *pResult = 0
4e10: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
4e20: 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  ;.  WhereScan sc
4e30: 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65  an;..  p = where
4e40: 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
4e50: 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75  pWC, iCur, iColu
4e60: 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20  mn, op, pIdx);. 
4e70: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
4e80: 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52   if( (p->prereqR
4e90: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
4ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
4eb0: 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d   p->prereqRight=
4ec0: 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61  =0 && (p->eOpera
4ed0: 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b  tor&WO_EQ)!=0 ){
4ee0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4ef0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
4f00: 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20   if( pResult==0 
4f10: 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20  ) pResult = p;. 
4f20: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65     }.    p = whe
4f30: 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
4f40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4f50: 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46  pResult;.}../* F
4f60: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
4f70: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
4f80: 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c  exprAnalyze(SrcL
4f90: 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73  ist*, WhereClaus
4fa0: 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  e*, int);../*.**
4fb0: 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a   Call exprAnalyz
4fc0: 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69  e on all terms i
4fd0: 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
4fe0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .  .*/.static vo
4ff0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
5000: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
5010: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
5020: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
5030: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
5040: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
5050: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
5060: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
5070: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
5080: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
5090: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
50a0: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
50b0: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
50c0: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
50d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
50e0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
50f0: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
5100: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
5110: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
5120: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
5130: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
5140: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
5150: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
5160: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
5170: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5180: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
5190: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
51a0: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
51b0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
51c0: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
51d0: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
51e0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
51f0: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
5200: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
5210: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
5220: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
5230: 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20  OrGlob(.  Parse 
5240: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
5250: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5260: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5270: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
5280: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
5290: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
52a0: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  n */.  Expr **pp
52b0: 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e  Prefix,  /* Poin
52c0: 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47  ter to TK_STRING
52d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
52e0: 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78 20   pattern prefix 
52f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d  */.  int *pisCom
5300: 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69  plete, /* True i
5310: 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63  f the only wildc
5320: 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20  ard is % in the 
5330: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a  last character *
5340: 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65  /.  int *pnoCase
5350: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5360: 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71   uppercase is eq
5370: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
5380: 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rcase */.){.  co
5390: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
53b0: 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b  ng on RHS of LIK
53c0: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
53d0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
53e0: 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69  Left;      /* Ri
53f0: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a  ght and left siz
5400: 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74  e of LIKE operat
5410: 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  or */.  ExprList
5420: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
5430: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70     /* List of op
5440: 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49  erands to the LI
5450: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
5460: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
5470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5480: 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ne character in 
5490: 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  z[] */.  int cnt
54a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
54c0: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
54d0: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
54e0: 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b  */.  char wc[3];
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61 72  /* Wildcard char
5510: 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  acters */.  sqli
5520: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5530: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
5540: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
5550: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5560: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pVal = 0;.  in
5570: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
5580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
5590: 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a  de of pRight */.
55a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
55b0: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
55c0: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
55d0: 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74  , wc) ){.    ret
55e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65  urn 0;.  }.#ifde
55f0: 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a  f SQLITE_EBCDIC.
5600: 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29    if( *pnoCase )
5610: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
5620: 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  f.  pList = pExp
5630: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c  r->x.pList;.  pL
5640: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
5650: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
5660: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
5670: 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  UMN .   || sqlit
5680: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
5690: 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46  Left)!=SQLITE_AF
56a0: 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73  F_TEXT .   || Is
56b0: 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70  Virtual(pLeft->p
56c0: 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  Tab).  ){.    /*
56d0: 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39   IMP: R-02065-49
56e0: 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  465 The left-han
56f0: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49  d side of the LI
5700: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
5710: 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  tor must.    ** 
5720: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
5730: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
5740: 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e   with TEXT affin
5750: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
5760: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
5770: 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  rt( pLeft->iColu
5780: 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42  mn!=(-1) ); /* B
5790: 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72  ecause IPK never
57a0: 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f   has AFF_TEXT */
57b0: 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c  ..  pRight = sql
57c0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
57d0: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ate(pList->a[0].
57e0: 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70  pExpr);.  op = p
57f0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
5800: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
5810: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52   ){.    Vdbe *pR
5820: 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73  eprepare = pPars
5830: 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20  e->pReprepare;. 
5840: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52     int iCol = pR
5850: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  ight->iColumn;. 
5860: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
5870: 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
5880: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
5890: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
58a0: 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70  NONE);.    if( p
58b0: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
58c0: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
58d0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
58e0: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
58f0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5900: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
5910: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5920: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
5930: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
5940: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
5950: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
5960: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
5970: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
5980: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5990: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
59a0: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
59b0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
59c0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
59d0: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
59e0: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
59f0: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
5a00: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
5a10: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
5a20: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
5a30: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
5a40: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
5a50: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
5a60: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
5a70: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
5a80: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
5a90: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
5aa0: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
5ab0: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
5ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
5ad0: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
5ae0: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
5af0: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
5b00: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
5b10: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
5b20: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
5b30: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
5b40: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
5b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
5b60: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
5b70: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
5b80: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
5b90: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
5ba0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
5bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
5bc0: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
5bd0: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
5be0: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
5bf0: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
5c00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
5c10: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
5c20: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
5c30: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
5c40: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
5c50: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
5c60: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
5c70: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
5c80: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
5c90: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
5ca0: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
5cb0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
5cc0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
5cd0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
5ce0: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
5cf0: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround th
5d00: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
5d10: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
5d20: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
5d30: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
5d40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5d50: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5d60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5d70: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
5d80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5da0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
5db0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
5dc0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
5dd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
5de0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5df0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5e00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5e10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5e20: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
5e30: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
5e40: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
5e50: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
5e60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5e70: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5e80: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
5e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5ea0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5eb0: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
5ec0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5ed0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5ee0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
5ef0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
5f00: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
5f10: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
5f20: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
5f30: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
5f40: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
5f50: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
5f60: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
5f70: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
5f80: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
5f90: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
5fa0: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
5fb0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
5fc0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
5fd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
5fe0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5ff0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
6000: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
6010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6020: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
6030: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
6040: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
6050: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6060: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
6070: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
6080: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
60a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
60b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
60c0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
60d0: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
60e0: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
60f0: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
6100: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
6110: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
6120: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
6130: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
6140: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
6150: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
6160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6170: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
6180: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
6190: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
61a0: 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65  ){.  if( pDerive
61b0: 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65  d ){.    pDerive
61c0: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
61d0: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
61e0: 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72  omJoin;.    pDer
61f0: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6200: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6210: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6220: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
6230: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6240: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
6250: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6260: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6270: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
6280: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
6290: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
62a0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
62b0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
62c0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
62d0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
62e0: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
62f0: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
6300: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
6330: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
6340: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
6350: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
6360: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
6370: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
6380: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
6390: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
63a0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
63b0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
63c0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
63d0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
63e0: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
63f0: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
6400: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
6410: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
6420: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
6430: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
6440: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6450: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
6460: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
6470: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
6480: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
6490: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
64a0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
64b0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
64c0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
64d0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
64e0: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
64f0: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
6500: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
6510: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
6520: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
6530: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
6540: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
6550: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
6560: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
6570: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
6580: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
6590: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
65a0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
65b0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
65c0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
65d0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
65e0: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
65f0: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
6600: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
6610: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
6620: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
6630: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
6640: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
6650: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
6660: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
6670: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6680: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
6690: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
66a0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
66b0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
66c0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
66d0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
66e0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
66f0: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
6700: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
6710: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
6720: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
6730: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
6740: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
6750: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
6760: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
6770: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
6780: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
6790: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
67a0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
67b0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
67c0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
67d0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
67e0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
67f0: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
6800: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
6810: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
6820: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
6830: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
6840: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
6850: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
6860: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
6870: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
6880: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
6890: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
68a0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
68b0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
68c0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
68d0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
68e0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
68f0: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
6900: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
6910: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
6920: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
6930: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
6940: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
6950: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
6960: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
6970: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
6980: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
6990: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
69a0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
69b0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
69c0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
69d0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
69e0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
69f0: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
6a00: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
6a10: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
6a20: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
6a30: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
6a40: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
6a50: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6a60: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
6a70: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
6a80: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
6a90: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
6aa0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
6ab0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
6ac0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
6ad0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
6ae0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
6af0: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
6b00: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
6b10: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
6b20: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
6b30: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
6b40: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
6b50: 64 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72  decided elsewher
6b60: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
6b70: 73 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20  s only looks at 
6b80: 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73  whether subterms
6b90: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
6ba0: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
6bb0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
6bc0: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
6bd0: 20 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79   E above satisfy
6be0: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
6bf0: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
6c00: 73 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20  statisfies case 
6c10: 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65  1 (such as B) we
6c20: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
6c30: 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a  ptimizer will.**
6c40: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63   always prefer c
6c50: 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61  ase 1, so in tha
6c60: 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e  t case we preten
6c70: 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73  d that case 2 is
6c80: 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65   not.** satisfie
6c90: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68  d..**.** It migh
6ca0: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
6cb0: 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  at multiple tabl
6cc0: 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  es are indexable
6cd0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  .  For example,.
6ce0: 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20  ** (E) above is 
6cf0: 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62  indexable on tab
6d00: 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e  les P, Q, and R.
6d10: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61  .**.** Terms tha
6d20: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
6d30: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
6d40: 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73  for lookup by us
6d50: 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ing.** separate 
6d60: 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20  indices to find 
6d70: 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20  rowids for each 
6d80: 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70  subterm and comp
6d90: 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69  osing.** the uni
6da0: 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73  on of all rowids
6db0: 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20   using a RowSet 
6dc0: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73  object.  This is
6dd0: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22   similar.** to "
6de0: 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20  bitmap indices" 
6df0: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
6e00: 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a  e engines..**.**
6e10: 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a   OTHERWISE:.**.*
6e20: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73  * If neither cas
6e30: 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61  e 1 nor case 2 a
6e40: 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65  pply, then leave
6e50: 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73   the eOperator s
6e60: 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20  et to.** zero.  
6e70: 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  This term is not
6e80: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72   useful for sear
6e90: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
6ea0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  id exprAnalyzeOr
6eb0: 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
6ec0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
6ed0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
6ee0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
6ef0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
6f00: 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c      /* the compl
6f10: 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ete WHERE clause
6f20: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
6f30: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
6f40: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
6f50: 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  OR-term to be an
6f60: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
6f70: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
6f80: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
6f90: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
6fa0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
6fb0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  g context */.  P
6fc0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
6fd0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
6fe0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
6ff0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
7000: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7010: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
7020: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7030: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
7040: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7050: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7060: 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65  Term];    /* The
7070: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
7080: 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  yzed */.  Expr *
7090: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
70a0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
70b0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
70c0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ion of the term 
70d0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7100: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
7110: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7120: 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20  pOrWc;       /* 
7130: 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d  Breakup of pTerm
7140: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
7150: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
7160: 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a  OrTerm;       /*
7170: 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68   A Sub-term with
7180: 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a  in the pOrWc */.
7190: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
71a0: 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41  OrInfo;     /* A
71b0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
71c0: 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ation associated
71d0: 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20   with pTerm */. 
71e0: 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49   Bitmask chngToI
71f0: 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  N;         /* Ta
7200: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
7210: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a  satisfy case 1 *
7220: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
7230: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  xable;        /*
7240: 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   Tables that are
7250: 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69   indexable, sati
7260: 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f  sfying case 2 */
7270: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61  ..  /*.  ** Brea
7280: 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  k the OR clause 
7290: 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74  into its separat
72a0: 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65  e subterms.  The
72b0: 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20   subterms are.  
72c0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57  ** stored in a W
72d0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
72e0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
72f0: 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65  within the Where
7300: 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65  OrInfo.  ** obje
7310: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
7320: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
7330: 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65  nal OR clause te
7340: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rm..  */.  asser
7350: 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
7360: 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d  gs & (TERM_DYNAM
7370: 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54  IC|TERM_ORINFO|T
7380: 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30  ERM_ANDINFO))==0
7390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
73a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
73b0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  ;.  pTerm->u.pOr
73c0: 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d  Info = pOrInfo =
73d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
73e0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
73f0: 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66  *pOrInfo));.  if
7400: 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72  ( pOrInfo==0 ) r
7410: 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e  eturn;.  pTerm->
7420: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7430: 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20  ORINFO;.  pOrWc 
7440: 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  = &pOrInfo->wc;.
7450: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
7460: 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29  t(pOrWc, pWInfo)
7470: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
7480: 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f  OrWc, pExpr, TK_
7490: 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79  OR);.  exprAnaly
74a0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57  zeAll(pSrc, pOrW
74b0: 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
74c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
74d0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
74e0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29  OrWc->nTerm>=2 )
74f0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d  ;..  /*.  ** Com
7500: 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20  pute the set of 
7510: 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  tables that migh
7520: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20  t satisfy cases 
7530: 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69  1 or 2..  */.  i
7540: 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74  ndexable = ~(Bit
7550: 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f  mask)0;.  chngTo
7560: 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  IN = ~(Bitmask)0
7570: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
7580: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
7590: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
75a0: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
75b0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
75c0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
75d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
75e0: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
75f0: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
7600: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
7610: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54     assert( (pOrT
7620: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7630: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52  TERM_ANDINFO|TER
7640: 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  M_ORINFO))==0 );
7650: 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20  .      chngToIN 
7660: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49  = 0;.      pAndI
7670: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7680: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
7690: 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b  eof(*pAndInfo));
76a0: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49  .      if( pAndI
76b0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57  nfo ){.        W
76c0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
76d0: 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  WC;.        Wher
76e0: 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b  eTerm *pAndTerm;
76f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7700: 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
7710: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
7720: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
7730: 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20  fo = pAndInfo;. 
7740: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
7750: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7760: 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20  ANDINFO;.       
7770: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
7780: 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20  tor = WO_AND;.  
7790: 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26        pAndWC = &
77a0: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
77b0: 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73        whereClaus
77c0: 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57  eInit(pAndWC, pW
77d0: 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  C->pWInfo);.    
77e0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
77f0: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
7800: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
7810: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
7820: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
7830: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
7840: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
7850: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
7860: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
7870: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
7880: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
7890: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
78a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
78b0: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
78c0: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
78d0: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
78e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
78f0: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
7900: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
7910: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
7920: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
7930: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
7940: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
7950: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7960: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  ->sMaskSet, pAnd
7970: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
7990: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
79a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
79b0: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
79c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
79d0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
79e0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
79f0: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
7a00: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
7a10: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
7a20: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
7a30: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
7a40: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
7a50: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
7a60: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
7a70: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
7a80: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
7a90: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
7aa0: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
7ab0: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
7ac0: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
7ad0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
7ae0: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
7af0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
7b00: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
7b10: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
7b20: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
7b30: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
7b40: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68  ->sMaskSet, pOth
7b50: 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  er->leftCursor);
7b60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7b70: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
7b80: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
7b90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ba0: 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_EQ)==0 ){.    
7bb0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
7bc0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7bd0: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
7be0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
7bf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
7c00: 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65  ** Record the se
7c10: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
7c20: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
7c30: 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20    The set might 
7c40: 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20  be.  ** empty.. 
7c50: 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69   */.  pOrInfo->i
7c60: 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78  ndexable = index
7c70: 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  able;.  pTerm->e
7c80: 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78  Operator = index
7c90: 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f  able==0 ? 0 : WO
7ca0: 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _OR;..  /*.  ** 
7cb0: 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61  chngToIN holds a
7cc0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
7cd0: 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69  hat *might* sati
7ce0: 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74  sfy case 1.  But
7cf0: 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
7d00: 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f   do some additio
7d10: 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  nal checking to 
7d20: 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65  see if case 1 re
7d30: 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74  ally.  ** is sat
7d40: 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  isfied..  **.  *
7d50: 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20  * chngToIN will 
7d60: 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31  hold either 0, 1
7d70: 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68  , or 2 bits.  Th
7d80: 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61  e 0-bit case mea
7d90: 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ns.  ** that the
7da0: 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69  re is no possibi
7db0: 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72  lity of transfor
7dc0: 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75  ming the OR clau
7dd0: 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20  se into an.  ** 
7de0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61  IN operator beca
7df0: 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  use one or more 
7e00: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20  terms in the OR 
7e10: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20  clause contain. 
7e20: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   ** something ot
7e30: 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61  her than == on a
7e40: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73   column in the s
7e50: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
7e60: 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73  e 1-bit.  ** cas
7e70: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65  e means that eve
7e80: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
7e90: 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  R clause is of t
7ea0: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61  he form.  ** "ta
7eb0: 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22  ble.column=expr"
7ec0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
7ed0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65   table.  The one
7ee0: 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74   bit that is set
7ef0: 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65  .  ** will corre
7f00: 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d  spond to the com
7f10: 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73  mon table.  We s
7f20: 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65  till need to che
7f30: 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ck to make.  ** 
7f40: 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f  sure the same co
7f50: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20  lumn is used on 
7f60: 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20  all terms.  The 
7f70: 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68  2-bit case is wh
7f80: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20  en.  ** the all 
7f90: 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65  terms are of the
7fa0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f   form "table1.co
7fb0: 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75  lumn=table2.colu
7fc0: 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69  mn".  It.  ** mi
7fd0: 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  ght be possible 
7fe0: 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70  to form an IN op
7ff0: 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68  erator with eith
8000: 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  er table1.column
8010: 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e  .  ** or table2.
8020: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48  column as the LH
8030: 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63  S if either is c
8040: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
8050: 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  erm of.  ** the 
8060: 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OR clause..  **.
8070: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
8080: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
8090: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d   "table.column1=
80a0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28  table.column2" (
80b0: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
80c0: 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65  ble on both size
80d0: 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e  s of the ==) can
80e0: 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  not be optimized
80f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ..  */.  if( chn
8100: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74  gToIN ){.    int
8110: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8120: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8130: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
8140: 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20   to IN is valid 
8150: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
8160: 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  mn = -1;        
8170: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78   /* Column index
8180: 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70   on lhs of IN op
8190: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e  erator */.    in
81a0: 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20  t iCursor = -1; 
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
81c0: 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74   cursor common t
81d0: 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20  o all terms */. 
81e0: 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20     int j = 0;   
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8200: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8210: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
8220: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63  or a table and c
8230: 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61  olumn that appea
8240: 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f  rs on one side o
8250: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  r the.    ** oth
8260: 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65  er of the == ope
8270: 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73  rator in every s
8280: 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61  ubterm.  That ta
8290: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20  ble and column. 
82a0: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
82b0: 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f  corded in iCurso
82c0: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20  r and iColumn.  
82d0: 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20  There might not 
82e0: 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  be any.    ** su
82f0: 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ch table and col
8300: 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68  umn.  Set okToCh
8310: 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70  ngToIN if an app
8320: 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20  ropriate table. 
8330: 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e     ** and column
8340: 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65   is found but le
8350: 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  ave okToChngToIN
8360: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f   false if not fo
8370: 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  und..    */.    
8380: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20  for(j=0; j<2 && 
8390: 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a  !okToChngToIN; j
83a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65  ++){.      pOrTe
83b0: 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20  rm = pOrWc->a;. 
83c0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
83d0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
83e0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
83f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8400: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8410: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
8420: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8430: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8440: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8450: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8460: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8470: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
8480: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
8490: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
84a0: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
84b0: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
84c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
84d0: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
84e0: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
84f0: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
8500: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
8510: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8520: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
8530: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8550: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
8560: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
8570: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
8580: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d  ->leftCursor))==
8590: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
85a0: 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74  * This term must
85b0: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
85c0: 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65  t1.a==t2.b where
85d0: 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20   t2 is in the.  
85e0: 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54          ** chngT
85f0: 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69  oIN set but t1 i
8600: 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72  s not.  This ter
8610: 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72  m will be either
8620: 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20   preceeded.     
8630: 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77       ** or follw
8640: 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65  ed by an inverte
8650: 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31  d copy (t2.b==t1
8660: 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20  .a).  Skip this 
8670: 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20  term .          
8680: 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69  ** and use its i
8690: 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  nversion. */.   
86a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
86b0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
86c0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
86d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
86e0: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
86f0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
8700: 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
8710: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
8720: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
8730: 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d  TERM_COPIED|TERM
8740: 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20  _VIRTUAL) );.   
8750: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8760: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8770: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72     iColumn = pOr
8780: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
8790: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72  mn;.        iCur
87a0: 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c  sor = pOrTerm->l
87b0: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
87c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
87d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20  }.      if( i<0 
87e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
87f0: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
8800: 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e  +column was foun
8810: 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  d.  This can onl
8820: 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20  y occur.        
8830: 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** on the second
8840: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
8850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
8860: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
8870: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
8880: 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a  wo(chngToIN) );.
8890: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
88a0: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
88b0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
88c0: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
88d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
88e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
88f0: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
8900: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
8910: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
8920: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
8930: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
8940: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
8950: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
8960: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
8970: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
8980: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
8990: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
89a0: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
89b0: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
89c0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
89d0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
89e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
89f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8a00: 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
8a10: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
8a20: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
8a30: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
8a40: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8a50: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
8a60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
8a70: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
8a80: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
8a90: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
8aa0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8ab0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
8ad0: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
8ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
8af0: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
8b00: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
8b10: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
8b20: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
8b30: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
8b40: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
8b50: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
8b60: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
8b70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
8b80: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
8b90: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
8ba0: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
8bb0: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
8bc0: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
8bd0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
8be0: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
8bf0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
8c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
8c10: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
8c20: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
8c30: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
8c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8c50: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
8c60: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
8c70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
8c80: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
8c90: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
8ca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8cb0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8cc0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
8cd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8cf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
8d00: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
8d10: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
8d20: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
8d30: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
8d40: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
8d50: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
8d60: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
8d70: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
8d80: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
8d90: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
8da0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
8db0: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
8dc0: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
8dd0: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
8de0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
8df0: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
8e00: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
8e10: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8e20: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
8e30: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
8e40: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8e50: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
8e60: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
8e70: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
8e80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
8e90: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
8ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8eb0: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
8ec0: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
8ed0: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
8ee0: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
8ef0: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
8f00: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
8f10: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
8f20: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8f30: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
8f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8f50: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8f60: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8f70: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
8f80: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
8f90: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
8fa0: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
8fb0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
8fc0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
8fd0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
8fe0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
8ff0: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9000: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9010: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9020: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9030: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e  rListAppend(pWIn
9040: 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  fo->pParse, pLis
9050: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
9060: 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72    pLeft = pOrTer
9070: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  m->pExpr->pLeft;
9080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
9090: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
90a0: 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20  );.      pDup = 
90b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
90c0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
90d0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
90e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
90f0: 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20  TK_IN, pDup, 0, 
9100: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
9110: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ew ){.        in
9120: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
9130: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
9140: 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78  rkings(pNew, pEx
9150: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  pr);.        ass
9160: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9170: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
9180: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
9190: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
91a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
91b0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
91c0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
91d0: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
91e0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
91f0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MIC);.        te
9200: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
9210: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  0 );.        exp
9220: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
9230: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
9240: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
9250: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9260: 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64         pWC->a[id
9270: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
9280: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
9290: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
92a0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
92b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
92c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
92d0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  b, pList);.     
92e0: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
92f0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e  eOperator = WO_N
9300: 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20  OOP;  /* case 1 
9310: 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f  trumps case 2 */
9320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
9330: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
9340: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
9350: 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  ION && !SQLITE_O
9360: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
9370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
9380: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
9390: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
93a0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
93b0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
93c0: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
93d0: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
93e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
93f0: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
9400: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
9410: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
9420: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
9430: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
9440: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
9450: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9460: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
9470: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
9480: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
9490: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
94a0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
94b0: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
94c0: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
94d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
94e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
94f0: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
9500: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
9510: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
9520: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
9530: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
9540: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
9550: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
9560: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
9570: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
9580: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
9590: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
95a0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
95b0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
95c0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
95d0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
95e0: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
95f0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
9600: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
9610: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
9620: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
9630: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
9640: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
9650: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
9660: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
9670: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
9680: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
9690: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
96a0: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
96b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
96c0: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
96d0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
96e0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
96f0: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
9700: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
9710: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
9720: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
9730: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9740: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
9750: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
9760: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
9770: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
9780: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
9790: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
97a0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
97b0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
97c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
97d0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20   = pWC->pWInfo; 
97e0: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
97f0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
9800: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
9810: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
9820: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9830: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
9840: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
9850: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
9860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
9870: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
9880: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
9890: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
98b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
98c0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
98d0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
98e0: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
98f0: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
9900: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
9910: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
9920: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9940: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
9950: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
9960: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
9970: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
9980: 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63   Extra dependenc
9990: 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e  ies on LEFT JOIN
99a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72   */.  Expr *pStr
99b0: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
99c0: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
99d0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
99e0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  tor */.  int isC
99f0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  omplete = 0;    
9a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
9a10: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e   of LIKE/GLOB en
9a20: 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64  ds with wildcard
9a30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65   */.  int noCase
9a40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9a50: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47         /* LIKE/G
9a60: 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65  LOB distinguishe
9a70: 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  s case */.  int 
9a80: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9aa0: 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74  Top-level operat
9ab0: 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a  or.  pExpr->op *
9ac0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
9ad0: 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
9ae0: 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  se;  /* Parsing 
9af0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
9b00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9b10: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a  e->db;        /*
9b20: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9b30: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64  tion */..  if( d
9b40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9b50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
9b60: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
9b70: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9b80: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
9b90: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
9ba0: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
9bb0: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
9bc0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
9bd0: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d  S && pExpr->op!=
9be0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
9bf0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
9c00: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
9c10: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
9c20: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
9c30: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
9c40: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
9c50: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
9c60: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
9c70: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9c80: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9c90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
9ca0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9cb0: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
9cc0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
9cd0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
9ce0: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
9cf0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9d00: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9d10: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
9d20: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9d30: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
9d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
9d50: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
9d60: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9d70: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
9d80: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
9d90: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9da0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9db0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
9dc0: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
9dd0: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
9de0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9df0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
9e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
9e10: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
9e20: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
9e30: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
9e40: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
9e50: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
9e60: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
9e70: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
9e80: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
9e90: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
9ea0: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
9eb0: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
9ee0: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
9ef0: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
9f00: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
9f10: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
9f20: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
9f30: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
9f40: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
9f50: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
9f60: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
9f70: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
9f80: 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70  p(op) ){.    Exp
9f90: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
9fa0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
9fb0: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
9fc0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
9fd0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
9fe0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
9ff0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75  ->pRight);.    u
a000: 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65  16 opMask = (pTe
a010: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
a020: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
a030: 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45   ? WO_ALL : WO_E
a040: 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c  QUIV;.    if( pL
a050: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
a060: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
a070: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
a080: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
a090: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
a0a0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a0b0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a0c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a0d0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
a0e0: 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  (op) & opMask;. 
a0f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
a100: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
a110: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a120: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
a130: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
a140: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75  r *pDup;.      u
a150: 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b  16 eExtraOp = 0;
a160: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
a170: 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e   bits for pNew->
a180: 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
a190: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a1a0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
a1b0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
a1c0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
a1d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a1e0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
a1f0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
a200: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a210: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a220: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a230: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
a240: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a250: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
a260: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
a270: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
a280: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a290: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a2a0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
a2b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a2c0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
a2d0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
a2e0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
a2f0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
a300: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
a310: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
a320: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
a330: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
a340: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
a350: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
a360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
a370: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20  xpr->op==TK_EQ. 
a380: 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
a390: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a3a0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
a3b0: 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
a3c0: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
a3d0: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  db, SQLITE_Trans
a3e0: 69 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29  itive).        )
a3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  {.          pTer
a400: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20  m->eOperator |= 
a410: 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20  WO_EQUIV;.      
a420: 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57      eExtraOp = W
a430: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
a440: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
a450: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
a460: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
a470: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
a480: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
a490: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
a4a0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
a4b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
a4c0: 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e  ipCollate(pDup->
a4d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
a4e0: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
a4f0: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
a500: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
a510: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a520: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a530: 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72   testcase( (prer
a540: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
a550: 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65  ght) != prereqLe
a560: 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ft );.      pNew
a570: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
a580: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74  prereqLeft | ext
a590: 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70  raRight;.      p
a5a0: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
a5b0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
a5c0: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
a5d0: 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73  r = (operatorMas
a5e0: 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45  k(pDup->op) + eE
a5f0: 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b  xtraOp) & opMask
a600: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
a610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a620: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
a630: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
a640: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
a650: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
a660: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
a670: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
a680: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
a690: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
a6a0: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
a6b0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
a6c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
a6d0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
a6e0: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
a6f0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
a700: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
a710: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
a720: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
a730: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
a740: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
a750: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
a760: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
a770: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
a780: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
a790: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
a7a0: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
a7b0: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
a7c0: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
a7d0: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
a7e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
a7f0: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
a800: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
a810: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
a820: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
a830: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
a840: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
a850: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
a860: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
a870: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
a880: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
a890: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
a8a0: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
a8b0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
a8c0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
a8d0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
a8e0: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
a8f0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
a900: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
a910: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
a920: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
a930: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a940: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
a950: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
a960: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
a970: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
a980: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
a990: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
a9a0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
a9b0: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
a9c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a9f0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
aa00: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
aa30: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
aa40: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
aa50: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
aa60: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
aa70: 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  xpr, pExpr);.   
aa80: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
aa90: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
aaa0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
aab0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
aac0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
aad0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
aae0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
aaf0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
ab00: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
ab10: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
ab20: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
ab30: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
ab40: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
ab50: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
ab60: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
ab70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
ab80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
ab90: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
aba0: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
abb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
abc0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
abd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
abe0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
abf0: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
ac00: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
ac10: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
ac20: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
ac30: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
ac40: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
ac50: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
ac60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
ac70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ac80: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
ac90: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
aca0: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
acb0: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
acc0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
acd0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
ace0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
acf0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ad00: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
ad10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
ad20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
ad30: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
ad40: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
ad50: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
ad60: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
ad70: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
ad80: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
ad90: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
ada0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
adb0: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
adc0: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
add0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
ade0: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
adf0: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
ae00: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
ae10: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
ae20: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
ae30: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
ae40: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
ae50: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
ae60: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
ae70: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
ae80: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
ae90: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
aea0: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
aeb0: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
aec0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
aed0: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
aee0: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
aef0: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
af00: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
af10: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
af20: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
af30: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
af40: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
af50: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
af60: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
af70: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
af80: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
af90: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
afa0: 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
afb0: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
afc0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
afd0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
afe0: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
aff0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b000: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b010: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b020: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b030: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b040: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b050: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b060: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
b070: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b080: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
b090: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
b0a0: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
b0b0: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
b0c0: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
b0d0: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
b0e0: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
b0f0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
b100: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
b110: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
b120: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
b130: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b140: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
b150: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
b160: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
b170: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
b180: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
b190: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
b1a0: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
b1b0: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
b1c0: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
b1d0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
b1e0: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
b1f0: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
b200: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
b210: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
b220: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
b230: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
b240: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
b250: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
b260: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
b270: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
b280: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
b290: 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lete = 0;.      
b2a0: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70    c = sqlite3Upp
b2b0: 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20  erToLower[c];.  
b2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20      }.      *pC 
b2d0: 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  = c + 1;.    }. 
b2e0: 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e     sCollSeqName.
b2f0: 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  z = noCase ? "NO
b300: 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
b310: 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61  ;.    sCollSeqNa
b320: 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e  me.n = 6;.    pN
b330: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
b340: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
b350: 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
b360: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
b370: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b380: 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  GE, .           
b390: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b3a0: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b3b0: 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f  e,pNewExpr1,&sCo
b3c0: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b3d0: 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
b3e0: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b3f0: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b400: 78 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr1, pExpr);.  
b410: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
b420: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b430: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
b440: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b450: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b460: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
b470: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b480: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b490: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
b4a0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
b4b0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b4c0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
b4d0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
b4e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b4f0: 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
b500: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
b510: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
b520: 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f  e,pNewExpr2,&sCo
b530: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
b540: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
b550: 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f  ;.    transferJo
b560: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45  inMarkings(pNewE
b570: 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20  xpr2, pExpr);.  
b580: 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72    idxNew2 = wher
b590: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b5a0: 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45  C, pNewExpr2, TE
b5b0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
b5c0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
b5d0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d  stcase( idxNew2=
b5e0: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
b5f0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b600: 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
b610: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b620: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
b630: 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
b640: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
b650: 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew1].iParent = i
b660: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57  dxTerm;.      pW
b670: 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50  C->a[idxNew2].iP
b680: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
b690: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
b6a0: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  hild = 2;.    }.
b6b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
b6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
b6d0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
b6e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b700: 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d  .  /* Add a WO_M
b710: 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74  ATCH auxiliary t
b720: 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74  erm to the const
b730: 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65  raint set if the
b740: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78  .  ** current ex
b750: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
b760: 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e  he form:  column
b770: 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a   MATCH expr..  *
b780: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
b790: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
b7a0: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
b7b0: 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72  hods of.  ** vir
b7c0: 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68  tual tables.  Th
b7d0: 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f  e native query o
b7e0: 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f  ptimizer does no
b7f0: 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74  t attempt.  ** t
b800: 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69  o do anything wi
b810: 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f  th MATCH functio
b820: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ns..  */.  if( i
b830: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70  sMatchOfColumn(p
b840: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
b850: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70   idxNew;.    Exp
b860: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
b870: 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  t;.    WhereTerm
b880: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20   *pNewTerm;.    
b890: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f  Bitmask prereqCo
b8a0: 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72  lumn, prereqExpr
b8b0: 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ;..    pRight = 
b8c0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b8d0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
b8e0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
b8f0: 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
b900: 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78  pr;.    prereqEx
b910: 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  pr = exprTableUs
b920: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
b930: 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65  ight);.    prere
b940: 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61  qColumn = exprTa
b950: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
b960: 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  t, pLeft);.    i
b970: 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26  f( (prereqExpr &
b980: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d   prereqColumn)==
b990: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
b9a0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
b9b0: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
b9c0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b9d0: 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20   TK_MATCH, .    
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c            0, sql
ba00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ba10: 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a  pRight, 0), 0);.
ba20: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
ba30: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
ba40: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
ba50: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
ba60: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
ba70: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
ba80: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew==0 );.      p
ba90: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
baa0: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
bab0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
bac0: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45  qRight = prereqE
bad0: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  xpr;.      pNewT
bae0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
baf0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
bb00: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
bb10: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
bb20: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
bb30: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
bb40: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
bb50: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
bb60: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
bb70: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
bb80: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
bb90: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
bba0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
bbb0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
bbc0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
bbd0: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
bbe0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
bbf0: 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
bc00: 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
bc10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
bc20: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
bc30: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
bc40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
bc50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57  _OR_STAT4.  /* W
bc60: 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33  hen sqlite_stat3
bc70: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
bc80: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20  is available an 
bc90: 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a  operator of the.
bca0: 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20    ** form "x IS 
bcb0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f  NOT NULL" can so
bcc0: 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75  metimes be evalu
bcd0: 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69  ated more effici
bce0: 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78  ently.  ** as "x
bcf0: 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e  >NULL" if x is n
bd00: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
bd10: 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63  IMARY KEY.  So c
bd20: 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20  onstruct a.  ** 
bd30: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20  virtual term of 
bd40: 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a  that form..  **.
bd50: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
bd60: 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
bd70: 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77  must be tagged w
bd80: 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20  ith TERM_VNULL. 
bd90: 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f   This.  ** TERM_
bda0: 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73  VNULL tag will s
bdb0: 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d  uppress the not-
bdc0: 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68  null check at th
bdd0: 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
bde0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57   of the loop.  W
bdf0: 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f  ithout the TERM_
be00: 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20  VNULL flag, the 
be10: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
be20: 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  t.  ** the start
be30: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
be40: 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65  l prevent any re
be50: 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  sults from being
be60: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
be70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
be80: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
be90: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
bea0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
beb0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
bec0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  ->iColumn>=0.   
bed0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
bee0: 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
bef0: 45 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20  E_Stat3).  ){.  
bf00: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
bf10: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
bf20: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
bf30: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
bf40: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
bf50: 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20  *pNewTerm;..    
bf60: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
bf70: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bf80: 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_GT,.         
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
bfb0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c  p(db, pLeft, 0),
bfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
bfe0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bff0: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
c000: 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64   0), 0);..    id
c010: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c020: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
c030: 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  ewExpr,.        
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55        TERM_VIRTU
c060: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  AL|TERM_DYNAMIC|
c070: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20  TERM_VNULL);.   
c080: 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20   if( idxNew ){. 
c090: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20       pNewTerm = 
c0a0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
c0b0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c0c0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
c0d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c0e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
c0f0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
c100: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
c110: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
c120: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
c130: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
c140: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a  erator = WO_GT;.
c150: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c160: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
c170: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
c180: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
c190: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
c1a0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
c1b0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
c1c0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
c1d0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c1e0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
c1f0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
c200: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
c210: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
c220: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
c230: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
c240: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
c250: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
c260: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
c270: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
c280: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
c290: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
c2a0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
c2b0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
c2c0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
c2d0: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ht;.}../*.** Thi
c2e0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
c2f0: 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20  hes pList for a 
c300: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
c310: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
c320: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
c330: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
c340: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
c350: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
c360: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
c370: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
c380: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
c390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
c3a0: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
c3b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c3c0: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
c3d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c3f0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
c400: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c410: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
c420: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
c430: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
c440: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
c450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c460: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
c470: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
c480: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
c490: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
c4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c4b0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
c4c0: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
c4d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
c500: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
c510: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
c520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c530: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
c540: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
c550: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
c560: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c570: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
c580: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
c590: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
c5a0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
c5b0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
c5c0: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
c5d0: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
c5e0: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
c5f0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
c600: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
c610: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
c620: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
c630: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
c640: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
c650: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
c660: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
c670: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
c680: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
c690: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c6a0: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
c6b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c6c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   -1;.}../*.** Re
c6d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
c6e0: 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
c6f0: 73 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64  sion-list passed
c700: 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
c710: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64  gument.** is red
c720: 75 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  undant..**.** A 
c730: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73  DISTINCT list is
c740: 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68   redundant if th
c750: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
c760: 69 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20  ins some subset 
c770: 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  of.** columns th
c780: 61 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e  at are unique an
c790: 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73  d non-null..*/.s
c7a0: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
c7b0: 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20  inctRedundant(. 
c7c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
c7e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c7f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
c800: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
c810: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
c820: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
c830: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
c840: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
c850: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
c860: 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20   *pDistinct     
c870: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
c880: 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74  set that needs t
c890: 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  o be DISTINCT */
c8a0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
c8b0: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
c8c0: 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65      .  int iBase
c8f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
c900: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
c910: 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73  e table or sub-s
c920: 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  elect in the FRO
c930: 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a  M clause of.  **
c940: 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
c950: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n it will not be
c960: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f   possible to sho
c970: 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  w that the DISTI
c980: 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65  NCT .  ** clause
c990: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
c9a0: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
c9b0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
c9c0: 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20  rn 0;.  iBase = 
c9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
c9e0: 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d  Cursor;.  pTab =
c9f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
ca00: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  pTab;..  /* If a
ca10: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
ca20: 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20  sions is an IPK 
ca30: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20  column on table 
ca40: 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75  iBase, then retu
ca50: 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e  rn .  ** true. N
ca60: 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61  ote: The (p->iTa
ca70: 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74  ble==iBase) part
ca80: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61   of this test ma
ca90: 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68  y be false if th
caa0: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53  e.  ** current S
cab0: 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65  ELECT is a corre
cac0: 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e  lated sub-query.
cad0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
cae0: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
caf0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
cb00: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
cb10: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
cb20: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
cb30: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
cb40: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
cb50: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
cb60: 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  Base && p->iColu
cb70: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  mn<0 ) return 1;
cb80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
cb90: 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69  through all indi
cba0: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
cbb0: 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20  , checking each 
cbc0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b  to see if it mak
cbd0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54  es.  ** the DIST
cbe0: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72  INCT qualifier r
cbf0: 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65  edundant. It doe
cc00: 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20  s so if:.  **.  
cc10: 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65  **   1. The inde
cc20: 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51  x is itself UNIQ
cc30: 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a  UE, and.  **.  *
cc40: 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68  *   2. All of th
cc50: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
cc60: 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65   index are eithe
cc70: 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44  r part of the pD
cc80: 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20  istinct.  **    
cc90: 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20    list, or else 
cca0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
ccb0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
ccc0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
ccd0: 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20  l=X",.  **      
cce0: 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e  where X is a con
ccf0: 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65  stant value. The
cd00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
cd10: 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  nces of the.  **
cd20: 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e        comparison
cd30: 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74   and select-list
cd40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
cd50: 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66  t match those of
cd60: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a   the index..  **
cd70: 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f  .  **   3. All o
cd80: 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f  f those index co
cd90: 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
cda0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
cdb0: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20   does not.  **  
cdc0: 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63      contain a "c
cdd0: 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73  ol=X" term are s
cde0: 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20  ubject to a NOT 
cdf0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e  NULL constraint.
ce00: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
ce10: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ce20: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ce30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
ce40: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
ce50: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
ce60: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
ce70: 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  i<pIdx->nKeyCol;
ce80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   i++){.      i16
ce90: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
cea0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
ceb0: 20 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d   if( 0==findTerm
cec0: 28 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f  (pWC, iBase, iCo
ced0: 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  l, ~(Bitmask)0, 
cee0: 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a  WO_EQ, pIdx) ){.
cef0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
cf00: 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43  Col = findIndexC
cf10: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
cf20: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
cf30: 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  x, i);.        i
cf40: 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
cf50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cf60: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
cf70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
cf80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
cfa0: 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  i==pIdx->nKeyCol
cfb0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
cfc0: 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20  s index implies 
cfd0: 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
cfe0: 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72  T qualifier is r
cff0: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20  edundant. */.   
d000: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d010: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d020: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73   0;.}.../*.** Es
d030: 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72  timate the logar
d040: 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
d050: 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20  t value to base 
d060: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  2..*/.static Log
d070: 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67 45 73  Est estLog(LogEs
d080: 74 20 4e 29 7b 0a 20 20 4c 6f 67 45 73 74 20 78  t N){.  LogEst x
d090: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
d0a0: 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e  (N);.  return x>
d0b0: 33 33 20 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b  33 ? x - 33 : 0;
d0c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
d0d0: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
d0e0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
d0f0: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
d100: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
d110: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
d120: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
d130: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
d140: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
d150: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
d160: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
d170: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
d180: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
d190: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
d1a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d1b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d1c0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 57 48 45  ) && defined(WHE
d1d0: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
d1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
d1f0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
d200: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d210: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d220: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
d230: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
d240: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d250: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d260: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d270: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
d280: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
d290: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
d2a0: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
d2b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
d2c0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d2d0: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
d2e0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
d2f0: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
d300: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
d310: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d320: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
d330: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
d340: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
d350: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
d360: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
d370: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d380: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
d390: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
d3a0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
d3b0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
d3c0: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
d3d0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
d3e0: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
d3f0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
d400: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
d410: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d420: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d430: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
d440: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
d450: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d460: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d470: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
d480: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
d490: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
d4a0: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
d4b0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
d4c0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
d4d0: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
d4e0: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
d4f0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
d500: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
d510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d520: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
d530: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
d540: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d550: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
d560: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
d570: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
d580: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
d590: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
d5a0: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
d5b0: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
d5c0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
d5d0: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
d5e0: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
d5f0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
d600: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
d610: 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c 64 5c  imatedRows=%lld\
d620: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
d630: 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Rows);.}.#else.#
d640: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
d650: 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
d660: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
d670: 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
d680: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d690: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
d6a0: 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  DEX./*.** Return
d6b0: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
d6c0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  RE clause term p
d6d0: 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72  Term is of a for
d6e0: 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f  m where it.** co
d6f0: 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68  uld be used with
d700: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63   an index to acc
d710: 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69  ess pSrc, assumi
d720: 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ng an appropriat
d730: 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74  e.** index exist
d740: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d750: 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  t termCanDriveIn
d760: 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d  dex(.  WhereTerm
d770: 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *pTerm,        
d780: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
d790: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68  lause term to ch
d7a0: 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eck */.  struct 
d7b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
d7c0: 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  rc,     /* Table
d7d0: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
d7e0: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69  o access */.  Bi
d7f0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d810: 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20  Tables in outer 
d820: 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69  loops of the joi
d830: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61  n */.){.  char a
d840: 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d  ff;.  if( pTerm-
d850: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72  >leftCursor!=pSr
d860: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74  c->iCursor ) ret
d870: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
d880: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
d890: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65 74   WO_EQ)==0 ) ret
d8a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
d8b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
d8c0: 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
d8d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d8e0: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
d8f0: 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e  olumn<0 ) return
d900: 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
d910: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
d920: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
d930: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
d940: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
d950: 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
d960: 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
d970: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
d980: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 1;.}.#endif...
d990: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d9a0: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
d9b0: 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  DEX./*.** Genera
d9c0: 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74  te code to const
d9d0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
d9e0: 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74  bject for an aut
d9f0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20  omatic index.** 
da00: 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68  and to set up th
da10: 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a  e WhereLevel obj
da20: 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68  ect pLevel so th
da30: 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  at the code gene
da40: 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75  rator.** makes u
da50: 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61  se of the automa
da60: 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  tic index..*/.st
da70: 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72  atic void constr
da80: 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
da90: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
daa0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
dab0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
dac0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
dad0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
dae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
daf0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
db00: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
db10: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
db20: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
db30: 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65   term to get the
db40: 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20   next index */. 
db50: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
db60: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
db70: 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
db80: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
db90: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72  ilable */.  Wher
dba0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
dbb0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
dbc0: 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20   new index here 
dbd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79  */.){.  int nKey
dbe0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dbf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dc00: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
dc10: 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65  constructed inde
dc20: 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
dc30: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
dc40: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
dc50: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
dc60: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
dc70: 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20  reTerm *pWCEnd; 
dc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
dc90: 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
dca0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcc0: 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e  Object describin
dcd0: 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  g the transient 
dce0: 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
dcf0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
dd00: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72         /* Prepar
dd10: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
dd20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
dd30: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69  */.  int addrIni
dd40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
dd50: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
dd60: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
dd70: 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f  n bypass jump */
dd80: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
dd90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
dda0: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
ddb0: 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  g indexed */.  i
ddc0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
ddd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
dde0: 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66  p of the index f
ddf0: 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ill loop */.  in
de00: 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
de10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
de20: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e  ister holding an
de30: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
de40: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de60: 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72  * Column counter
de70: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
dea0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74  r */.  int mxBit
deb0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
dec0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
ded0: 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f  lumn in pSrc->co
dee0: 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lUsed */.  CollS
def0: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
df00: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
df10: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
df20: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  on a column */. 
df30: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
df40: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
df50: 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  The Loop object 
df60: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55  */.  char *zNotU
df70: 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  sed;            
df80: 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
df90: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49  on the end of pI
dfa0: 64 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  dx */.  Bitmask 
dfb0: 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
dfc0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
dfd0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
dfe0: 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
dff0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
e000: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
e010: 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
e020: 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nal columns */. 
e030: 20 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20   u8 sentWarning 
e040: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
e050: 54 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69  True if a warnni
e060: 6e 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75  ng has been issu
e070: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
e080: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
e090: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
e0a0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
e0b0: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
e0c0: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
e0d0: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
e0e0: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
e0f0: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
e100: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
e110: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
e120: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
e130: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
e140: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
e150: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e160: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e170: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
e180: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
e190: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
e1a0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
e1b0: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
e1c0: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
e1d0: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
e1e0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
e1f0: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
e200: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
e210: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
e220: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
e230: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
e240: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
e250: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
e260: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
e270: 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
e280: 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
e290: 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
e2a0: 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
e2b0: 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
e2c0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
e2d0: 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
e2e0: 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
e2f0: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
e300: 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
e310: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
e320: 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
e330: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
e340: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
e350: 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67  if( !sentWarning
e360: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e370: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
e380: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
e390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ,.            "a
e3a0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f  utomatic index o
e3b0: 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c  n %s(%s)", pTabl
e3c0: 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  e->zName,.      
e3d0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
e3e0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b  ol[iCol].zName);
e3f0: 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61 72  .        sentWar
e400: 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ning = 1;.      
e410: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  }.      if( (idx
e420: 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
e430: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e440: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
e450: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f  pParse->db, pLoo
e460: 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 20  p, nKeyCol+1) ) 
e470: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
e480: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b  pLoop->aLTerm[nK
e490: 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d  eyCol++] = pTerm
e4a0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
e4b0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
e4c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e4d0: 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e  assert( nKeyCol>
e4e0: 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
e4f0: 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
e500: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79  p->nLTerm = nKey
e510: 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  Col;.  pLoop->ws
e520: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
e530: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
e540: 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
e550: 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
e570: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
e580: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
e590: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
e5a0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
e5b0: 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
e5c0: 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
e5d0: 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
e5e0: 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
e5f0: 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
e600: 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
e610: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
e620: 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
e630: 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
e640: 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
e650: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
e660: 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
e670: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
e680: 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
e690: 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
e6a0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
e6b0: 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
e6c0: 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
e6d0: 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
e6e0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
e6f0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
e700: 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
e710: 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
e720: 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
e730: 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
e740: 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
e750: 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
e760: 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
e770: 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
e780: 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
e790: 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
e7a0: 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
e7b0: 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
e7c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
e7d0: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
e7e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
e7f0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
e800: 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
e810: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
e820: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
e830: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
e840: 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20  ) ) nKeyCol++;. 
e850: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
e860: 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
e870: 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e  (BMS-1) ){.    n
e880: 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65  KeyCol += pTable
e890: 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
e8a0: 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77  ;.  }.  pLoop->w
e8b0: 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
e8c0: 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
e8d0: 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f  E_IDX_ONLY;..  /
e8e0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
e8f0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
e900: 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
e910: 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20  dex */.  pIdx = 
e920: 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
e930: 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73  ndexObject(pPars
e940: 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31  e->db, nKeyCol+1
e950: 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b  , 0, &zNotUsed);
e960: 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
e970: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70   return;.  pLoop
e980: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
e990: 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78 2d   = pIdx;.  pIdx-
e9a0: 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69  >zName = "auto-i
e9b0: 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70  ndex";.  pIdx->p
e9c0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
e9d0: 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f    n = 0;.  idxCo
e9e0: 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
e9f0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
ea00: 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
ea10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d  +){.    if( term
ea20: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
ea30: 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  erm, pSrc, notRe
ea40: 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ady) ){.      in
ea50: 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e  t iCol = pTerm->
ea60: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
ea70: 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73      Bitmask cMas
ea80: 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  k = iCol>=BMS ? 
ea90: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a  MASKBIT(BMS-1) :
eaa0: 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a   MASKBIT(iCol);.
eab0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
eac0: 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
ead0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
eae0: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
eaf0: 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26    if( (idxCols &
eb00: 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20   cMask)==0 ){.  
eb10: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
eb20: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
eb30: 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c         idxCols |
eb40: 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = cMask;.       
eb50: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
eb60: 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  n] = pTerm->u.le
eb70: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
eb80: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
eb90: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
eba0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
ebb0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
ebc0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49  ght);.        pI
ebd0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
ebe0: 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20  ALWAYS(pColl) ? 
ebf0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22  pColl->zName : "
ec00: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
ec10: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
ec20: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
ec30: 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d  ( (u32)n==pLoop-
ec40: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a  >u.btree.nEq );.
ec50: 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
ec60: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
ec70: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
ec80: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
ec90: 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
eca0: 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
ecb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
ecc0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
ecd0: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
ece0: 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20  ASKBIT(i) ){.   
ecf0: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
ed00: 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
ed10: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
ed20: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
ed30: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
ed40: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
ed50: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
ed60: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
ed70: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
ed80: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
ed90: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
eda0: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
edb0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
edc0: 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
edd0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
ede0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
edf0: 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49  =nKeyCol );.  pI
ee00: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
ee10: 3d 20 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  = -1;.  pIdx->az
ee20: 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
ee30: 59 22 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  Y";..  /* Create
ee40: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
ee50: 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
ee60: 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
ee70: 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c  r>=0 );.  pLevel
ee80: 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
ee90: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
eea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
eeb0: 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e  v, OP_OpenAutoin
eec0: 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  dex, pLevel->iId
eed0: 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  xCur, nKeyCol+1)
eee0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
eef0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
ef00: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62  se, pIdx);.  Vdb
ef10: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
ef20: 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
ef30: 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
ef40: 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
ef50: 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
ef60: 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
ef70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ef80: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
ef90: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
efa0: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
efb0: 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  e(v);.  regRecor
efc0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
efd0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
efe0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
eff0: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
f000: 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
f010: 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
f020: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, 0, 0, 0, 0);.
f030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f040: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
f050: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
f060: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
f070: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
f080: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f090: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
f0a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f0b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
f0c0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
f0d0: 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56  r, addrTop+1); V
f0e0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f100: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
f110: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
f120: 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
f130: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f140: 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
f150: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f160: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
f170: 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75  ord);.  .  /* Ju
f180: 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69  mp here when ski
f190: 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
f1a0: 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  lization */.  sq
f1b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f1c0: 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a  e(v, addrInit);.
f1d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f1e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
f1f0: 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e  C_INDEX */..#ifn
f200: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f210: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
f220: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
f230: 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69  populate an sqli
f240: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
f250: 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
f260: 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
f270: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
f280: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
f290: 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73  ly release the s
f2a0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70  tructure.** by p
f2b0: 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  assing the point
f2c0: 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
f2d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
f2e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
f2f0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
f300: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c  3_index_info *al
f310: 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
f320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f330: 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ,.  WhereClause 
f340: 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
f350: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
f360: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
f370: 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
f380: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
f390: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
f3a0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f3b0: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
f3c0: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
f3d0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
f3e0: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
f3f0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f400: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
f410: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
f420: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
f430: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
f440: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
f450: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
f460: 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  o;..  /* Count t
f470: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
f480: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
f490: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
f4a0: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
f4b0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
f4c0: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
f4d0: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
f4e0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
f4f0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
f500: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
f510: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
f520: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
f530: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
f540: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
f550: 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
f560: 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
f570: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f580: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f590: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
f5a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
f5b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
f5c0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
f5d0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f5e0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f5f0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
f600: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f610: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
f620: 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20 63  O_EQUIV))==0 ) c
f630: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
f640: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
f650: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
f660: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65  ontinue;.    nTe
f670: 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
f680: 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
f690: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
f6a0: 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
f6b0: 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
f6c0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
f6d0: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
f6e0: 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
f6f0: 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a  erBy part of.  *
f700: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
f710: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
f720: 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65  re..  */.  nOrde
f730: 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rBy = 0;.  if( p
f740: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
f750: 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d  nt n = pOrderBy-
f760: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
f770: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
f780: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
f790: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
f7a0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
f7b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
f7c0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
f7d0: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
f7e0: 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
f7f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f800: 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72  i==n){.      nOr
f810: 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d  derBy = n;.    }
f820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
f830: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
f840: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f850: 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ture.  */.  pIdx
f860: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
f870: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
f880: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
f890: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
f8c0: 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
f8d0: 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
f8e0: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
f900: 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
f910: 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
f920: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
f930: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f940: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f950: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
f960: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
f970: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
f980: 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74  alize the struct
f990: 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ure.  The sqlite
f9a0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
f9b0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
f9c0: 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
f9d0: 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
f9e0: 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
f9f0: 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
fa00: 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67   from.  ** chang
fa10: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
fa20: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
fa30: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
fa40: 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69  rder to.  ** ini
fa50: 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
fa60: 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  elds..  */.  pId
fa70: 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
fa80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fa90: 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
faa0: 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  nfo[1];.  pIdxOr
fab0: 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
fac0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
fad0: 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
fae0: 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
faf0: 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
fb00: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
fb10: 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
fb20: 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
fb30: 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
fb40: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
fb50: 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
fb60: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
fb70: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
fb80: 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
fb90: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
fba0: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
fbb0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
fbc0: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
fbd0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
fbe0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
fbf0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
fc00: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
fc10: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
fc20: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
fc30: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
fc40: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
fc50: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72    pUsage;..  for
fcb0: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
fcc0: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
fcd0: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
fce0: 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  ){.    u8 op;.  
fcf0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
fd00: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
fd10: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
fd20: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
fd30: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
fd40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fd50: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
fd60: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
fd70: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fd80: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
fd90: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
fda0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
fdb0: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
fdc0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
fdd0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
fde0: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
fdf0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
fe00: 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55  WO_ISNULL|WO_EQU
fe10: 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
fe20: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
fe30: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
fe40: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
fe50: 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
fe60: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
fe70: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
fe80: 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
fe90: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
fea0: 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
feb0: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
fec0: 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
fed0: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
fee0: 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
fef0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
ff00: 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20   op;.    /* The 
ff10: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
ff20: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
ff30: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
ff40: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
ff50: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
ff60: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
ff70: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
ff80: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
ff90: 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
ffa0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
ffb0: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
ffc0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ffd0: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
ffe0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
fff0: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
10000 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
10010 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10020 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
10030 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
10040 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10050 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
10060 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
10070 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10080 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
10090 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
100a0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
100b0 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
100c0 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
100d0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
100e0 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
100f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
10100 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
10110 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c  WO_IN|WO_EQ|WO_L
10120 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
10130 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
10140 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
10150 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
10160 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
10170 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
10180 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
10190 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
101a0 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
101b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
101c0 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
101d0 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
101e0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
101f0 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
10200 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
10210 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
10220 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
10230 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
10240 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
10250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
10260 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
10270 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
10280 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10290 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
102a0 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
102b0 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
102c0 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
102d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
102e0 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
102f0 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
10300 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
10310 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
10320 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10330 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
10340 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
10350 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
10360 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
10370 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
10380 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
10390 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
103a0 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
103b0 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
103c0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
103d0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
103e0 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
103f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
10400 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
10410 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
10420 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
10430 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
10440 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
10450 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
10460 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
10470 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
10480 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
10490 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
104a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
104b0 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
104c0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
104d0 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
104e0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
104f0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
10500 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
10510 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
10520 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
10530 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
10540 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44   rc;..  TRACE_ID
10550 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
10560 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
10570 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
10580 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
10590 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
105a0 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
105b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
105c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
105d0 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
105e0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
105f0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
10600 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
10610 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
10620 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10630 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
10640 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
10650 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10660 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10670 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
10680 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
10690 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
106a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
106b0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
106c0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
106d0 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
106e0 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
106f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
10700 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
10710 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
10720 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10730 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
10740 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10750 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10760 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
10770 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
10780 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
10790 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
107a0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
107b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
107c0 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
107d0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
107e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
107f0 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 0a  TUALTABLE) */...
10800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10810 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
10820 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
10830 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
10840 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
10850 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
10860 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
10870 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
10880 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
10890 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
108a0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
108b0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
108c0 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
108d0 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74  pVal.**    aStat
108e0 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
108f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
10900 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a  al to pVal.**.**
10910 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10920 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  K on success..*/
10930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10940 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
10950 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10970 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10980 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
10990 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
109a0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
109b0 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
109c0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
109d0 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
109e0 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
109f0 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
10a00 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
10a10 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
10a20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
10a30 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
10a40 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
10a50 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
10a80 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
10a90 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
10aa0 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
10ab0 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
10ac0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
10ad0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10ae0 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
10af0 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
10b00 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30  /.  int iMin = 0
10b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70  /* Smallest samp
10b30 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65  le not yet teste
10b40 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  d */.  int i = p
10b50 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 20 20  Idx->nSample;   
10b60 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
10b70 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61  ample larger tha
10b80 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52  n or equal to pR
10b90 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73  ec */.  int iTes
10ba0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10bb0 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70      /* Next samp
10bc0 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  le to test */.  
10bd0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
10be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10bf0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
10c00 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
10c10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10c20 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
10c30 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73  PARAMETER( pPars
10c40 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  e );.#endif.  as
10c50 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b  sert( pRec!=0 );
10c60 0a 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e  .  iCol = pRec->
10c70 6e 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73  nField - 1;.  as
10c80 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
10c90 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
10ca0 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
10cb0 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
10cc0 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20  nSampleCol );.  
10cd0 64 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20  do{.    iTest = 
10ce0 28 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20  (iMin+i)/2;.    
10cf0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
10d00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
10d10 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c  Sample[iTest].n,
10d20 20 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e   aSample[iTest].
10d30 70 2c 20 70 52 65 63 2c 20 30 29 3b 0a 20 20 20  p, pRec, 0);.   
10d40 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
10d50 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
10d60 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
10d70 20 20 20 20 20 69 20 3d 20 69 54 65 73 74 3b 0a       i = iTest;.
10d80 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
10d90 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 20 29 3b  res && iMin<i );
10da0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10db0 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
10dc0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
10dd0 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
10de0 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
10df0 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
10e00 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
10e10 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
10e20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
10e30 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
10e40 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
10e50 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
10e60 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  ts.  */.  if( re
10e70 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  s==0 ){.    /* I
10e80 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
10e90 75 65 2c 20 74 68 65 6e 20 73 61 6d 70 6c 65 20  ue, then sample 
10ea0 24 69 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  $i must be equal
10eb0 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 20 20   to pRec */.    
10ec0 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
10ed0 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61  nSample );.    a
10ee0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
10ef0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
10f00 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
10f10 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
10f20 52 65 63 2c 20 30 29 0a 20 20 20 20 20 20 20 20  Rec, 0).        
10f30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
10f40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
10f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
10f60 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65 63 20  Otherwise, pRec 
10f70 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
10f80 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69 20 61  than sample $i a
10f90 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20  nd larger than. 
10fa0 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28 24 69     ** sample ($i
10fb0 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  -1).  */.    ass
10fc0 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
10fd0 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
10fe0 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  || sqlite3VdbeRe
10ff0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
11000 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
11010 65 5b 69 5d 2e 70 2c 20 70 52 65 63 2c 20 30 29  e[i].p, pRec, 0)
11020 3e 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  >0.         || p
11030 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
11040 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61  cFailed );.    a
11050 73 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20  ssert( i==0.    
11060 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
11070 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
11080 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c  (aSample[i-1].n,
11090 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c   aSample[i-1].p,
110a0 20 70 52 65 63 2c 20 30 29 3c 30 0a 20 20 20 20   pRec, 0)<0.    
110b0 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
110c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
110d0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   );.  }.#endif /
110e0 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
110f0 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74  EBUG */..  /* At
11100 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61   this point, aSa
11110 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
11120 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  irst sample that
11130 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
11140 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74  .  ** or equal t
11150 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69  o pVal.  Or if i
11160 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
11170 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   then all sample
11180 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20  s are less.  ** 
11190 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61  than pVal.  If a
111a0 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c  Sample[i]==pVal,
111b0 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e 0a 20 20   then res==0..  
111c0 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  */.  if( res==0 
111d0 29 7b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20  ){.    aStat[0] 
111e0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
111f0 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74  t[iCol];.    aSt
11200 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[1] = aSample[
11210 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20  i].anEq[iCol];. 
11220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77   }else{.    tRow
11230 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  cnt iLower, iUpp
11240 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
11250 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
11260 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
11270 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
11280 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d  le[0].anLt[iCol]
11290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
112a0 20 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73     i64 nRow0 = s
112b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
112c0 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
112d0 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  Est[0]);.      i
112e0 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d  Upper = i>=pIdx-
112f0 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 52 6f 77 30  >nSample ? nRow0
11300 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   : aSample[i].an
11310 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  Lt[iCol];.      
11320 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65  iLower = aSample
11330 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d  [i-1].anEq[iCol]
11340 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   + aSample[i-1].
11350 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
11360 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  }.    aStat[1] =
11370 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e   (pIdx->nKeyCol>
11380 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e 61 41 76  iCol ? pIdx->aAv
11390 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31 29 3b 0a  gEq[iCol] : 1);.
113a0 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
113b0 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
113c0 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
113d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
113e0 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
113f0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
11400 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
11410 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
11420 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
11430 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
11440 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
11450 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
11460 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a 23   + iGap;.  }.}.#
11470 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11480 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
11490 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
114a0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
114b0 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65  L, pTerm is a te
114c0 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  rm that provides
114d0 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77   an upper or low
114e0 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61  er.** bound on a
114f0 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74   range scan. Wit
11500 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  hout considering
11510 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73   pTerm, it is es
11520 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74  timated .** that
11530 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
11540 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20  isit nNew rows. 
11550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
11560 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
11570 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f  .** estimated to
11580 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65   be visited afte
11590 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69  r taking pTerm i
115a0 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a  nto account..**.
115b0 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65  ** If the user e
115c0 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
115d0 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  ied a likelihood
115e0 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  () value for thi
115f0 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20  s term,.** then 
11600 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
11610 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   is the likeliho
11620 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  od multiplied by
11630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
11640 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74  * input rows. Ot
11650 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75  herwise, this fu
11660 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
11670 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e  hat an "IS NOT N
11680 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73  ULL" term.** has
11690 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
116a0 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f   0.50, and any o
116b0 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65  ther term a like
116c0 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a  lihood of 0.25..
116d0 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
116e0 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
116f0 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
11700 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29  rm, LogEst nNew)
11710 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20  {.  LogEst nRet 
11720 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54  = nNew;.  if( pT
11730 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  erm ){.    if( p
11740 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
11750 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
11760 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
11770 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Prob;.    }else 
11780 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
11790 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
117a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  )==0 ){.      nR
117b0 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  et -= 20;       
117c0 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
117d0 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
117e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
117f0 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn nRet;.}../*.
11800 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11810 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
11820 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
11830 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
11840 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
11850 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
11860 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
11870 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
11880 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
11890 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
118a0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
118b0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
118c0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
118d0 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
118e0 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
118f0 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
11900 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
11910 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
11920 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
11930 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
11940 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
11950 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
11960 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
11970 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
11980 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
119b0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
119d0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
11a00 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
11a10 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
11a20 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
11a30 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
11a40 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
11a50 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
11a60 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
11a70 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
11a80 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
11a90 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
11aa0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
11ab0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
11ac0 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d  e index.** colum
11ad0 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
11ae0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
11af0 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
11b00 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
11b10 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63  of.** equality c
11b20 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d  onstraints optim
11b30 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
11b40 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
11b50 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
11b60 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
11b70 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29  p is on t1(a, b)
11b80 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
11b90 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
11ba0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
11bb0 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
11bc0 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
11bd0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
11be0 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74  s set to 1 (as t
11bf0 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
11c00 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69  ted column, b, i
11c10 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
11c20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
11c30 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
11c40 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
11c50 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
11c60 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
11c70 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
11c80 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
11c90 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  Eq is set to 0..
11ca0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
11cb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11cc0 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65  ed, *pnOut is se
11cd0 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  t to the sqlite3
11ce0 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a  LogEst() of the.
11cf0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
11d00 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
11d10 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65   scan is expecte
11d20 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f  d to visit witho
11d30 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69  ut .** consideri
11d40 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  ng the range con
11d50 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71  straints. If nEq
11d60 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 74   is 0, this is t
11d70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
11d80 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
11d90 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
11da0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
11db0 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
11dc0 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
11dd0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
11de0 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74   range contraint
11df0 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
11e00 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
11e10 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
11e20 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
11e30 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
11e40 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
11e50 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68  be.** used, each
11e60 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
11e70 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
11e80 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
11e90 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
11ea0 20 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66   Hence a pair of
11eb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
11ec0 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
11ed0 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
11ee0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
11ef0 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
11f00 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a  actor of 16..*/.
11f10 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
11f20 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
11f30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11f40 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11f50 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
11f60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
11f70 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
11f80 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
11f90 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
11fa0 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
11fb0 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
11fc0 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
11fd0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
11fe0 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
11ff0 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
12000 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
12010 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
12020 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
12030 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
12040 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
12050 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
12060 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
12070 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12090 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
120a0 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
120b0 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
120c0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
120d0 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  OR_STAT4.  Index
120e0 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
120f0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
12100 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
12110 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
12120 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
12130 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69  .   && nEq==pBui
12140 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a  lder->nRecValid.
12150 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61     && nEq<p->nSa
12160 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70  mpleCol.   && Op
12170 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
12180 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
12190 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29  LITE_Stat3) .  )
121a0 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65  {.    UnpackedRe
121b0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
121c0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
121d0 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
121e0 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20     u8 aff;..    
121f0 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
12200 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
12210 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
12220 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
12230 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  rows in .    ** 
12240 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
12250 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
12260 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
12270 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
12280 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65   The.    ** lowe
12290 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
122a0 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
122b0 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
122c0 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
122d0 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
122e0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
122f0 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
12300 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
12310 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a   left-most.    *
12320 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
12330 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
12340 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
12350 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  Lower..    **.  
12360 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
12370 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
12380 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
12390 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
123a0 63 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20  cause it.    ** 
123b0 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
123c0 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65  variable or lite
123d0 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20  ral value), the 
123e0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
123f0 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
12400 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
12410 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
12420 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
12430 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
12440 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
12450 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
12460 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
12470 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
12480 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a  and .    ** ($P:
12490 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
124a0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
124b0 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73  turned values us
124c0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
124d0 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
124e0 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
124f0 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
12500 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
12510 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65  f rows.    ** le
12520 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
12530 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
12540 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
12550 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
12560 64 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  d.    ** is eith
12570 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
12580 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
12590 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
125a0 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
125b0 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72      ** of iUpper
125c0 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f   are requested o
125d0 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  f whereKeyStats(
125e0 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65  ) and the smalle
125f0 72 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  r used..    */. 
12600 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
12610 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  r;.    tRowcnt i
12620 55 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Upper;..    if( 
12630 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c 20  nEq==p->nKeyCol 
12640 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
12650 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
12660 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
12670 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61      aff = p->pTa
12680 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
12690 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69  olumn[nEq]].affi
126a0 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nity;.    }.    
126b0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
126c0 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
126d0 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
126e0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  */.    if( nEq==
126f0 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
12700 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
12710 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
12720 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f  EstToInt(p->aiRo
12730 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20  wLogEst[0]);.   
12740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
12750 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
12760 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
12770 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
12780 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
12790 20 6d 75 73 74 20 0a 20 20 20 20 20 20 2a 2a 20   must .      ** 
127a0 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
127b0 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67  ted when testing
127c0 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65   key $P in where
127d0 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20  EqualScanEst(). 
127e0 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 4b   */.      whereK
127f0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
12800 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
12810 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
12820 5b 30 5d 3b 0a 20 20 20 20 20 20 69 55 70 70 65  [0];.      iUppe
12830 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b  r = a[0] + a[1];
12840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12850 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
12860 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
12870 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
12880 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
12890 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
128a0 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128c0 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
128d0 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
128e0 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
128f0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
12900 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
12910 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
12920 73 65 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65  sert( (pLower->e
12930 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47  Operator & (WO_G
12940 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a  T|WO_GE))!=0 );.
12950 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12960 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
12970 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
12980 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
12990 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
129a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
129b0 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b  ITE_OK && bOk ){
129c0 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
129d0 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77   iNew;.        w
129e0 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
129f0 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
12a00 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65   a);.        iNe
12a10 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f  w = a[0] + ((pLo
12a20 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
12a30 20 57 4f 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a   WO_GT) ? a[1] :
12a40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
12a50 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69   iNew>iLower ) i
12a60 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20  Lower = iNew;.  
12a70 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
12a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12a90 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
12aa0 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20   improve on the 
12ab0 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20  iUpper estimate 
12ac0 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a  using ($P:$U). *
12ad0 2f 0a 20 20 20 20 69 66 28 20 70 55 70 70 65 72  /.    if( pUpper
12ae0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   ){.      int bO
12af0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
12b00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
12b10 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63   value is extrac
12b20 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
12b30 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  /.      Expr *pE
12b40 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
12b50 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
12b60 20 20 20 61 73 73 65 72 74 28 20 28 70 55 70 70     assert( (pUpp
12b70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
12b80 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  (WO_LT|WO_LE))!=
12b90 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
12ba0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
12bb0 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
12bc0 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
12bd0 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
12be0 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
12bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
12c00 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 74 52  Ok ){.        tR
12c10 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
12c20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74      whereKeyStat
12c30 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
12c40 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
12c50 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
12c60 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ((pUpper->eOpera
12c70 74 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61  tor & WO_LE) ? a
12c80 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
12c90 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65    if( iNew<iUppe
12ca0 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65  r ) iUpper = iNe
12cb0 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  w;.        nOut-
12cc0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
12cd0 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ..    pBuilder->
12ce0 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
12cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
12d10 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b  iUpper>iLower ){
12d20 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
12d30 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
12d40 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
12d50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12d60 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
12d70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
12d80 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
12d90 28 32 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (2) );.      }. 
12da0 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
12db0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  ut ){.        nO
12dc0 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
12dd0 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
12de0 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
12df0 4f 75 74 3b 0a 20 20 20 20 20 20 57 48 45 52 45  Out;.      WHERE
12e00 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61  TRACE(0x10, ("ra
12e10 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  nge scan regions
12e20 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64  : %u..%u  est=%d
12e30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
12e50 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
12e60 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
12e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12e80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
12e90 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
12ea0 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
12eb0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
12ec0 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29  AMETER(pBuilder)
12ed0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
12ee0 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
12ef0 70 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  per );.  assert(
12f00 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70   pUpper==0 || (p
12f10 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26  Upper->wtFlags &
12f20 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
12f30 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
12f40 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f  eRangeAdjust(pLo
12f50 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e  wer, nOut);.  nN
12f60 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41  ew = whereRangeA
12f70 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e  djust(pUpper, nN
12f80 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e  ew);..  /* TUNIN
12f90 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  G: If there is b
12fa0 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64  oth an upper and
12fb0 20 6c 6f 77 65 72 20 6c 69 6d 69 74 2c 20 61 73   lower limit, as
12fc0 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69  sume the range i
12fd0 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62  s.  ** reduced b
12fe0 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  y an additional 
12ff0 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  75%. This means 
13000 74 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74  that, by default
13010 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a  , an open-ended.
13020 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79    ** range query
13030 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20   (e.g. col > ?) 
13040 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61  is assumed to ma
13050 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72  tch 1/4 of the r
13060 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ows in the.  ** 
13070 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63  index. While a c
13080 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67  losed range (e.g
13090 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20  . col BETWEEN ? 
130a0 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61  AND ?) is estima
130b0 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63  ted to.  ** matc
130c0 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e  h 1/64 of the in
130d0 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70  dex. */ .  if( p
130e0 4c 6f 77 65 72 20 26 26 20 70 55 70 70 65 72 20  Lower && pUpper 
130f0 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 0a 20  ) nNew -= 20;.. 
13100 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72   nOut -= (pLower
13110 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d  !=0) + (pUpper!=
13120 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31  0);.  if( nNew<1
13130 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
13140 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
13150 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nOut = nNew;.  
13160 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
13170 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
13180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
13190 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
131a0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
131b0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
131c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
131d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
131e0 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
131f0 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
13200 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
13210 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
13220 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
13230 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
13240 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
13250 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
13260 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
13270 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
13280 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
13290 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
132a0 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
132b0 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
132c0 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
132d0 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
132e0 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
132f0 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
13300 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
13310 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
13320 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
13330 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
13340 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
13350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13360 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
13370 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
13380 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
13390 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
133a0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
133b0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
133c0 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
133d0 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
133e0 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
133f0 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
13400 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
13410 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
13420 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
13430 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
13440 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
13450 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
13460 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
13470 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
13480 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
13490 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
134a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134b0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
134c0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
134d0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
134e0 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
134f0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
13500 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
13510 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
13520 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
13530 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
13540 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
13550 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
13560 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
13570 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
13580 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
13590 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
135a0 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
135b0 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
135c0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
135d0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
135e0 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
135f0 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
13600 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
13610 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
13620 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
13630 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
13640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13650 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
13660 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13680 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
13690 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
136a0 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
136b0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
136c0 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  tics */.  int bO
136d0 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45  k;..  assert( nE
136e0 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q>=1 );.  assert
136f0 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 4b 65 79 43  ( nEq<=(p->nKeyC
13700 6f 6c 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ol+1) );.  asser
13710 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
13720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
13730 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
13740 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
13750 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
13760 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
13770 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
13780 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
13790 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
137a0 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
137b0 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
137c0 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
137d0 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
137e0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
137f0 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
13800 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
13810 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
13820 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
13830 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
13840 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
13850 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
13860 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
13870 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
13880 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
13890 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
138a0 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
138b0 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 4b 65    if( nEq>p->nKe
138c0 79 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 52  yCol ){.    *pnR
138d0 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
138e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
138f0 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  }..  aff = p->pT
13900 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
13910 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61  Column[nEq-1]].a
13920 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20  ffinity;.  rc = 
13930 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
13940 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
13950 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
13960 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26  r, aff, nEq-1, &
13970 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
13980 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
13990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
139a0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
139b0 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
139c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
139d0 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
139e0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
139f0 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
13a00 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
13a10 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
13a20 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
13a30 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
13a40 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
13a50 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70  int)a[1]));.  *p
13a60 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a  nRow = a[1];.  .
13a70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
13a80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13a90 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
13aa0 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66  STAT4 */..#ifdef
13ab0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13ac0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
13ad0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
13ae0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13af0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
13b00 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
13b10 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
13b20 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
13b30 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
13b40 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
13b50 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
13b60 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
13b70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
13b80 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
13b90 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
13ba0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
13bb0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
13bc0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
13bd0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
13be0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
13bf0 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
13c00 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
13c10 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
13c20 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
13c30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
13c40 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
13c50 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
13c60 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
13c70 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
13c80 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
13c90 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
13ca0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
13cb0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
13cc0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
13cd0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
13ce0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
13cf0 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
13d00 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
13d10 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
13d20 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
13d30 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
13d40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
13d50 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
13d60 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
13d70 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
13d80 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
13d90 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
13da0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
13db0 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
13dc0 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
13dd0 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
13de0 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
13df0 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
13e00 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
13e10 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
13e20 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
13e30 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
13e40 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
13e50 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77  ndex;.  i64 nRow
13e60 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 = sqlite3LogEs
13e70 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c  tToInt(p->aiRowL
13e80 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74  ogEst[0]);.  int
13e90 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75   nRecValid = pBu
13ea0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
13eb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13ec0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53  ITE_OK;     /* S
13ed0 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
13ee0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
13ef0 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20  cnt nEst;       
13f00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13f10 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67   rows for a sing
13f20 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f  le term */.  tRo
13f30 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30  wcnt nRowEst = 0
13f40 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69  ;    /* New esti
13f50 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
13f60 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
13f70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
13f80 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
13f90 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
13fa0 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
13fb0 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
13fc0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
13fd0 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
13fe0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73  r; i++){.    nEs
13ff0 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72  t = nRow0;.    r
14000 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
14010 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
14020 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61  uilder, pList->a
14030 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74  [i].pExpr, &nEst
14040 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b  );.    nRowEst +
14050 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69  = nEst;.    pBui
14060 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
14070 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d  = nRecValid;.  }
14080 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
140a0 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30   nRowEst > nRow0
140b0 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f   ) nRowEst = nRo
140c0 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  w0;.    *pnRow =
140d0 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
140e0 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
140f0 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
14100 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77   est=%g\n", nRow
14110 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Est));.  }.  ass
14120 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ert( pBuilder->n
14130 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61  RecValid==nRecVa
14140 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  lid );.  return 
14150 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
14160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14170 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
14180 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
14190 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
141a0 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
141b0 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
141c0 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
141d0 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
141e0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
141f0 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
14200 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
14210 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
14220 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
14230 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
14240 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
14250 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
14260 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
14270 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
14280 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
14290 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
142a0 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
142b0 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
142c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
142d0 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
142e0 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
142f0 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
14300 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
14310 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
14320 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
14330 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
14340 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
14350 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
14360 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
14370 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
14380 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
14390 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
143a0 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
143b0 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
143c0 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
143d0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
143e0 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
143f0 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
14400 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
14410 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
14420 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
14430 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
14440 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
14450 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
14460 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
14470 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
14480 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
14490 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
144a0 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
144b0 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
144c0 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
144d0 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
144e0 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
144f0 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
14500 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
14510 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
14520 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
14530 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
14540 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
14550 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
14560 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
14570 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
14580 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
14590 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
145a0 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
145b0 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
145c0 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
145d0 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
145e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
145f0 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
14600 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
14610 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
14620 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
14630 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77      && (pTerm->w
14640 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
14650 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  DED)==0.      &&
14660 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
14670 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
14680 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
14690 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
146a0 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28  oin)).      && (
146b0 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79  pLevel->notReady
146c0 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   & pTerm->prereq
146d0 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  All)==0.  ){.   
146e0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
146f0 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
14700 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50     if( pTerm->iP
14710 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20  arent>=0 ){.    
14720 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
14730 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57  her = &pTerm->pW
14740 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72  C->a[pTerm->iPar
14750 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ent];.      if( 
14760 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c  (--pOther->nChil
14770 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
14780 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
14790 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20  vel, pOther);.  
147a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
147b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
147c0 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
147d0 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65  ode to apply the
147e0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
147f0 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20   string zAff.** 
14800 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65  to the n registe
14810 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  rs starting at b
14820 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61  ase. .**.** As a
14830 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
14840 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
14850 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61  entries (which a
14860 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68  re no-ops) at th
14870 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61  e.** beginning a
14880 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61  nd end of zAff a
14890 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  re ignored.  If 
148a0 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a  all entries in z
148b0 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54  Aff are.** SQLIT
148c0 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e  E_AFF_NONE, then
148d0 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65   no code gets ge
148e0 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nerated..**.** T
148f0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
14900 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  s its own copy o
14910 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74  f zAff so that t
14920 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65  he caller is fre
14930 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a  e.** to modify z
14940 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72  Aff after this r
14950 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
14960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
14970 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
14980 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14990 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c  int base, int n,
149a0 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20   char *zAff){.  
149b0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
149c0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a  ->pVdbe;.  if( z
149d0 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Aff==0 ){.    as
149e0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
149f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14a00 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
14a10 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  }.  assert( v!=0
14a20 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74   );..  /* Adjust
14a30 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73   base and n to s
14a40 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f  kip over SQLITE_
14a50 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73  AFF_NONE entries
14a60 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
14a70 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f  g.  ** and end o
14a80 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  f the affinity s
14a90 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68  tring..  */.  wh
14aa0 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66  ile( n>0 && zAff
14ab0 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  [0]==SQLITE_AFF_
14ac0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
14ad0 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20  .    base++;.   
14ae0 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77   zAff++;.  }.  w
14af0 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66  hile( n>1 && zAf
14b00 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41  f[n-1]==SQLITE_A
14b10 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
14b20 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  --;.  }..  /* Co
14b30 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  de the OP_Affini
14b40 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65  ty opcode if the
14b50 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c  re is anything l
14b60 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20  eft to do. */.  
14b70 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73  if( n>0 ){.    s
14b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14b90 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
14ba0 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73   base, n);.    s
14bb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14bc0 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20  P4(v, -1, zAff, 
14bd0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  n);.    sqlite3E
14be0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
14bf0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62  Change(pParse, b
14c00 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  ase, n);.  }.}..
14c10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14c20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
14c30 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
14c40 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
14c50 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74  use.  An equalit
14c60 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65  y.** term can be
14c70 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f   either X=expr o
14c80 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20  r X IN (...).   
14c90 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72  pTerm is the ter
14ca0 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65  m to be .** code
14cb0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  d..**.** The cur
14cc0 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rent value for t
14cd0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
14ce0 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
14cf0 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f  r iReg..**.** Fo
14d00 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  r a constraint o
14d10 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70  f the form X=exp
14d20 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  r, the expressio
14d30 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
14d40 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74  nd its.** result
14d50 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
14d60 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73  stack.  For cons
14d70 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66  traints of the f
14d80 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a  orm X IN (...).*
14d90 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
14da0 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68  ets up a loop th
14db0 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20  at will iterate 
14dc0 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
14dd0 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of X..*/.static 
14de0 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79  int codeEquality
14df0 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
14e00 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
14e10 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
14e20 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
14e30 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
14e40 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
14e50 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
14e60 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
14e70 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
14e80 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66   /* The level of
14e90 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
14ea0 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
14eb0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c  on */.  int iEq,
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14ed0 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61  ndex of the equa
14ee0 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e  lity term within
14ef0 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
14f00 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20   int bRev,      
14f10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
14f20 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49   reverse-order I
14f30 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a  N operations */.
14f40 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20    int iTarget   
14f50 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
14f60 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74   to leave result
14f70 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  s in this regist
14f80 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  er */.){.  Expr 
14f90 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
14fa0 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  pr;.  Vdbe *v = 
14fb0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14fc0 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20   int iReg;      
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14fe0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
14ff0 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73  results */..  as
15000 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20  sert( iTarget>0 
15010 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d  );.  if( pX->op=
15020 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52  =TK_EQ ){.    iR
15030 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
15040 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
15050 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69  e, pX->pRight, i
15060 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
15070 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
15080 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52  ISNULL ){.    iR
15090 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
150a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
150b0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
150c0 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65  0, iReg);.#ifnde
150d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
150e0 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
150f0 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20      int eType;. 
15100 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
15110 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
15120 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  pIn;.    WhereLo
15130 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  op *pLoop = pLev
15140 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
15150 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
15160 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
15170 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20  TUALTABLE)==0.  
15180 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
15190 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a  btree.pIndex!=0.
151a0 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
151b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
151c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a  aSortOrder[iEq].
151d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
151e0 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b  tcase( iEq==0 );
151f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15200 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
15210 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
15220 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
15230 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
15240 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
15250 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  et;.    eType = 
15260 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
15270 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30  ex(pParse, pX, 0
15280 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  );.    if( eType
15290 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
152a0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74  _DESC ){.      t
152b0 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
152c0 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
152d0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Rev;.    }.    i
152e0 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
152f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15300 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
15310 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
15320 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
15330 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
15340 65 49 66 28 76 2c 20 62 52 65 76 29 3b 0a 20 20  eIf(v, bRev);.  
15350 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
15360 28 76 2c 20 21 62 52 65 76 29 3b 0a 20 20 20 20  (v, !bRev);.    
15370 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
15380 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15390 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a  MULTI_OR)==0 );.
153a0 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
153b0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41  gs |= WHERE_IN_A
153c0 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  BLE;.    if( pLe
153d0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
153e0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
153f0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
15400 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15410 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
15420 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
15430 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
15440 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
15450 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
15460 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
15470 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
15480 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
154b0 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
154c0 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
154d0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
154e0 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
154f0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
15500 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
15510 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
15520 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
15530 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
15540 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
15550 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
15560 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
15570 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
15580 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
15590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
155a0 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
155b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
155c0 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
155d0 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
155e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
155f0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
15600 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
15610 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f       pIn->eEndLo
15620 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  opOp = bRev ? OP
15630 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50  _PrevIfOpen : OP
15640 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20  _NextIfOpen;.   
15650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15660 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
15670 6c 2c 20 69 52 65 67 29 3b 20 56 64 62 65 43 6f  l, iReg); VdbeCo
15680 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
15690 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
156a0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
156b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
156c0 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
156d0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
156e0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
156f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15700 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
15710 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
15720 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
15730 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
15740 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20  dex scan..**.** 
15750 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
15760 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
15770 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
15780 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
15790 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
157a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
157b0 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
157c0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
157d0 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
157e0 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
157f0 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
15800 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15810 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
15820 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
15830 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
15840 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
15850 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
15860 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
15870 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
15880 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
15890 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
158a0 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
158b0 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
158c0 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
158d0 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
158e0 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
158f0 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
15900 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
15910 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
15920 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
15930 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
15940 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
15950 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
15960 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
15970 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
15980 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
15990 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
159a0 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
159b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
159c0 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
159d0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
159e0 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
159f0 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
15a00 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
15a10 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
15a20 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
15a30 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ring..**.** The 
15a40 6e 45 78 74 72 61 52 65 67 20 70 61 72 61 6d 65  nExtraReg parame
15a50 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20  ter is 0 or 1.  
15a60 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57  It is 0 if all W
15a70 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
15a80 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d  traints.** are =
15a90 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20  = or IN and are 
15aa0 63 6f 76 65 72 65 64 20 62 79 20 74 68 65 20 6e  covered by the n
15ab0 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69  Eq.  nExtraReg i
15ac0 73 20 31 20 69 66 20 74 68 65 72 65 20 69 73 0a  s 1 if there is.
15ad0 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ** an inequality
15ae0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63   constraint (suc
15af0 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41  h as the "c>=5 A
15b00 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20  ND c<10" in the 
15b10 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a  example) that.**
15b20 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68   occurs after th
15b30 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f  e nEq quality co
15b40 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a  nstraints..**.**
15b50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
15b60 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67 65 20  locates a range 
15b70 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67  of nEq+nExtraReg
15b80 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
15b90 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
15ba0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
15bb0 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  rst memory cell 
15bc0 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54  in that range. T
15bd0 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
15be0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
15bf0 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74  ne will use that
15c00 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f   memory range to
15c10 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a   store keys for.
15c20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74 65 72  ** start and ter
15c30 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69  mination conditi
15c40 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
15c50 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
15c60 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
15c70 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
15c80 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
15c90 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
15ca0 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
15cb0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
15cc0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
15cd0 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
15ce0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
15cf0 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66  returning, *pzAf
15d00 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  f is set to poin
15d10 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
15d20 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f  ntaining a.** co
15d30 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
15d40 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
15d50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c   of the index al
15d60 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
15d70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15d80 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72  (). Except, entr
15d90 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20  ies in the copy 
15da0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  of the string as
15db0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
15dc0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15dd0 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e  aints that use N
15de0 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65  ONE affinity are
15df0 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54   set to.** SQLIT
15e00 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73  E_AFF_NONE. This
15e10 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68   is to deal with
15e20 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65   SQL such as the
15e30 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
15e40 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
15e50 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41   t1(a TEXT PRIMA
15e60 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20  RY KEY, b);.**  
15e70 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
15e80 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48   t1 AS t2, t1 WH
15e90 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b  ERE t1.a = t2.b;
15ea0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
15eb0 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
15ec0 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20   index on t1(a) 
15ed0 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74  has TEXT affinit
15ee0 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20  y. But since.** 
15ef0 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73  the right hand s
15f00 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c  ide of the equal
15f10 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
15f20 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61  t2.b) has NONE a
15f30 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63  ffinity,.** no c
15f40 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64  onversion should
15f50 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65   be attempted be
15f60 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e  fore using a t2.
15f70 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20  b value as part 
15f80 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73  of.** a key to s
15f90 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e  earch the index.
15fa0 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74   Hence the first
15fb0 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74   byte in the ret
15fc0 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a  urned affinity.*
15fd0 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73  * string in this
15fe0 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62   example would b
15ff0 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
16000 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  AFF_NONE..*/.sta
16010 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
16020 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
16030 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16040 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16050 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
16060 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
16070 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
16080 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
16090 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
160a0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ng */.  int bRev
160b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
160c0 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64   Reverse the ord
160d0 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  er of IN operato
160e0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  rs */.  int nExt
160f0 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
16100 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
16110 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
16120 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
16130 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
16140 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
16150 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
16160 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
16170 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20    u16 nEq;      
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
161a0 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
161b0 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
161c0 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20  .  u16 nSkip;   
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
161f0 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
16200 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62  to skip */.  Vdb
16210 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
16220 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
16230 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
16240 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
16250 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
16260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16270 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
16280 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
16290 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
162a0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
162b0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
162c0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
162d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
162e0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
162f0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
16300 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
16310 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16330 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
16340 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
16370 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
163a0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
163b0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
163c0 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
163d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
163e0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
163f0 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
16400 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
16410 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
16420 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
16430 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
16440 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
16450 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73  l->pWLoop;.  ass
16460 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
16470 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
16480 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
16490 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  .  nEq = pLoop->
164a0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e  u.btree.nEq;.  n
164b0 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  Skip = pLoop->u.
164c0 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 70  btree.nSkip;.  p
164d0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
164e0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61  tree.pIndex;.  a
164f0 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
16500 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
16510 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
16520 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
16530 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
16540 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
16550 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
16560 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
16570 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Reg = pLoop->u.b
16580 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72  tree.nEq + nExtr
16590 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
165a0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
165b0 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
165c0 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
165d0 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
165e0 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
165f0 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
16600 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
16610 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16620 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69  ed = 1;.  }..  i
16630 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( nSkip ){.    
16640 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
16650 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
16660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16670 64 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50  dOp1(v, (bRev?OP
16680 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29  _Last:OP_Rewind)
16690 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  , iIdxCur);.    
166a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
166b0 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
166c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
166d0 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
166e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
166f0 22 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e  "begin skip-scan
16700 20 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a   on %s", pIdx->z
16710 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20  Name));.    j = 
16720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16730 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
16740 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53     pLevel->addrS
16750 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
16760 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62  eAddOp4Int(v, (b
16770 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50  Rev?OP_SeekLT:OP
16780 5f 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20  _SeekGT),.      
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30        iIdxCur, 0
167b0 2c 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70  , regBase, nSkip
167c0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
167d0 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
167e0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
167f0 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
16800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16810 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29  beJumpHere(v, j)
16820 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
16830 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20  <nSkip; j++){.  
16840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16850 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
16860 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20  mn, iIdxCur, j, 
16870 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
16880 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
16890 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29  aiColumn[j]>=0 )
168a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
168b0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
168c0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
168d0 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
168e0 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  j]].zName));.   
168f0 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a   }.  }    ..  /*
16900 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
16910 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16920 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
16930 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e  ( zAff==0 || (in
16940 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d  t)strlen(zAff)>=
16950 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e  nEq );.  for(j=n
16960 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  Skip; j<nEq; j++
16970 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
16980 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
16990 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
169a0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
169b0 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 );.    /* The 
169c0 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61  following testca
169d0 73 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 69  se is true for i
169e0 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
169f0 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
16a00 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
16a10 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
16a20 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
16a30 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
16a40 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
16a50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
16a60 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
16a70 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
16a80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
16a90 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
16aa0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
16ab0 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
16ac0 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
16ad0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
16ae0 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61  , j, bRev, regBa
16af0 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
16b00 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
16b10 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
16b20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
16b30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16b40 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
16b50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
16b60 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
16b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b90 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
16ba0 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
16bb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16bc0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
16bd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
16be0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
16bf0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
16c00 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
16c10 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
16c20 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
16c30 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
16c40 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
16c50 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
16c60 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
16c70 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ght;.      if( s
16c80 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
16c90 75 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20  ull(pRight) ){. 
16ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16cb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16cc0 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a  sNull, regBase+j
16cd0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
16ce0 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
16cf0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16d00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
16d10 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
16d20 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
16d30 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
16d40 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49  , zAff[j])==SQLI
16d50 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
16d60 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
16d70 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
16d80 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
16d90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16da0 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
16db0 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
16dc0 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20  t, zAff[j]) ){. 
16dd0 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
16de0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
16df0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
16e00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16e10 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b    *pzAff = zAff;
16e20 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73  .  return regBas
16e30 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
16e40 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
16e50 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  N./*.** This rou
16e60 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72  tine is a helper
16e70 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65   for explainInde
16e80 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a  xRange() below.*
16e90 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20  *.** pStr holds 
16ea0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
16eb0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
16ec0 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75  e are building u
16ed0 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74  p one term.** at
16ee0 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
16ef0 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65  outine adds a ne
16f00 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e  w term to the en
16f10 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  d of the express
16f20 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72  ion..** Terms ar
16f30 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41  e separated by A
16f40 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41  ND so add the "A
16f50 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63  ND" text for sec
16f60 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
16f70 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  nt.** terms only
16f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16f90 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
16fa0 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a  rm(.  StrAccum *
16fb0 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  pStr,           
16fc0 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78    /* The text ex
16fd0 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62  pression being b
16fe0 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  uilt */.  int iT
16ff0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
17000 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17010 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69  f this term.  Fi
17020 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20  rst is zero */. 
17030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
17040 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  lumn,        /* 
17050 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
17060 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
17070 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20  ar *zOp         
17080 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17090 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29  he operator */.)
170a0 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20  {.  if( iTerm ) 
170b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
170c0 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
170d0 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74  D ", 5);.  sqlit
170e0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
170f0 41 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d  All(pStr, zColum
17100 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  n);.  sqlite3Str
17110 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
17120 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
17130 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
17140 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
17150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
17160 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
17170 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
17180 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
17190 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
171a0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
171b0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
171c0 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
171d0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
171e0 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
171f0 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
17200 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
17210 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
17220 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
17230 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
17240 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
17250 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
17260 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
17270 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
17280 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
17290 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
172a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
172b0 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
172c0 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
172d0 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
172e0 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
172f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
17300 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
17310 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
17320 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
17330 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
17340 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
17350 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
17360 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
17370 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
17380 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
17390 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
173a0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
173b0 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
173c0 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
173d0 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
173e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
173f0 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
17400 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
17410 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  b, WhereLoop *pL
17420 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  oop, Table *pTab
17430 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
17440 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
17450 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31  ree.pIndex;.  u1
17460 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  6 nEq = pLoop->u
17470 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31  .btree.nEq;.  u1
17480 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d  6 nSkip = pLoop-
17490 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a  >u.btree.nSkip;.
174a0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f    int i, j;.  Co
174b0 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61  lumn *aCol = pTa
174c0 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a  b->aCol;.  i16 *
174d0 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65  aiColumn = pInde
174e0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53  x->aiColumn;.  S
174f0 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20  trAccum txt;..  
17500 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70  if( nEq==0 && (p
17510 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
17520 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
17530 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
17540 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))==0 ){.    ret
17550 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
17560 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
17570 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c  (&txt, 0, 0, SQL
17580 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b  ITE_MAX_LENGTH);
17590 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a  .  txt.db = db;.
175a0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
175b0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20  mAppend(&txt, " 
175c0 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d  (", 2);.  for(i=
175d0 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a  0; i<nEq; i++){.
175e0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 69      char *z = (i
175f0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  ==pIndex->nKeyCo
17600 6c 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  l ) ? "rowid" : 
17610 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d  aCol[aiColumn[i]
17620 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
17630 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20   i>=nSkip ){.   
17640 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
17650 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
17660 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65   "=");.    }else
17670 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20  {.      if( i ) 
17680 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
17690 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 41 4e  ppend(&txt, " AN
176a0 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73  D ", 5);.      s
176b0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
176c0 70 65 6e 64 28 26 74 78 74 2c 20 22 41 4e 59 28  pend(&txt, "ANY(
176d0 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 4);.      sql
176e0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
176f0 6e 64 41 6c 6c 28 26 74 78 74 2c 20 7a 29 3b 0a  ndAll(&txt, z);.
17700 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
17710 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
17720 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 7d  , ")", 1);.    }
17730 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
17740 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
17750 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
17760 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
17770 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d  *z = (j==pIndex-
17780 3e 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f  >nKeyCol ) ? "ro
17790 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
177a0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
177b0 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
177c0 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c  dTerm(&txt, i++,
177d0 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20   z, ">");.  }.  
177e0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
177f0 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
17800 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
17810 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
17820 6e 4b 65 79 43 6f 6c 20 29 20 3f 20 22 72 6f 77  nKeyCol ) ? "row
17830 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
17840 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
17850 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
17860 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
17870 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   "<");.  }.  sql
17880 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
17890 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
178a0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
178b0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
178c0 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&txt);.}../*.**
178d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
178e0 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
178f0 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
17900 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e  ssing an EXPLAIN
17910 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63   QUERY PLAN.** c
17920 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71  ommand. If the q
17930 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69  uery being compi
17940 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49  led is an EXPLAI
17950 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20  N QUERY PLAN, a 
17960 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64  single.** record
17970 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
17980 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72   output to descr
17990 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63  ibe the table sc
179a0 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a  an strategy in .
179b0 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ** pLevel..*/.st
179c0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
179d0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
179e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
179f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17a00 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
17a10 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
17a20 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
17a30 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
17a40 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
17a50 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
17a60 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
17a70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
17a80 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
17a90 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
17aa0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ac0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
17ad0 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
17ae0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
17af0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
17b20 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
17b30 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
17b40 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
17b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
17b60 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
17b70 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
17b80 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
17b90 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
17ba0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
17bb0 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20  n==2 ).#endif.  
17bc0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
17bd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
17be0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
17bf0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
17c00 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
17c10 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
17c20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
17c30 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
17c40 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
17c50 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
17c60 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
17c70 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
17c80 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Msg;            
17c90 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
17ca0 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74  o add to EQP out
17cb0 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  put */.    int i
17cc0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
17cd0 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
17ce0 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
17cf0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
17d00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
17d10 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
17d20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
17d30 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
17d40 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20   for SCAN. */.  
17d50 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
17d60 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
17d70 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69  /* The controlli
17d80 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ng WhereLoop obj
17d90 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66  ect */.    u32 f
17da0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
17db0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
17dc0 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
17dd0 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  this loop */..  
17de0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
17df0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c  ->pWLoop;.    fl
17e00 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46  ags = pLoop->wsF
17e10 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66  lags;.    if( (f
17e20 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
17e30 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
17e40 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
17e50 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  LE_ONLY) ) retur
17e60 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68  n;..    isSearch
17e70 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52 45   = (flags&(WHERE
17e80 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
17e90 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a  _TOP_LIMIT))!=0.
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
17eb0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52  (flags&WHERE_VIR
17ec0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26  TUALTABLE)==0 &&
17ed0 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65   (pLoop->u.btree
17ee0 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20  .nEq>0)).       
17ef0 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
17f00 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
17f10 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
17f20 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20  ERBY_MAX));..   
17f30 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
17f40 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
17f50 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43   isSearch?"SEARC
17f60 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20  H":"SCAN");.    
17f70 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
17f80 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  ct ){.      zMsg
17f90 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
17fa0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
17fb0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a   SUBQUERY %d", z
17fc0 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65  Msg,pItem->iSele
17fd0 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ctId);.    }else
17fe0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
17ff0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
18000 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42  b, zMsg, "%s TAB
18010 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  LE %s", zMsg, pI
18020 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
18030 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65   }..    if( pIte
18040 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
18050 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
18060 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
18070 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20  sg, "%s AS %s", 
18080 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
18090 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
180a0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57 48  if( (flags & (WH
180b0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49  ERE_IPK|WHERE_VI
180c0 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a  RTUALTABLE))==0.
180d0 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70       && ALWAYS(p
180e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
180f0 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ndex!=0).    ){.
18100 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
18110 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65  re = explainInde
18120 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70  xRange(db, pLoop
18130 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
18140 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
18150 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
18160 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
18170 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
18180 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
18190 29 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) ? .           
181a0 20 20 20 20 20 20 20 20 22 25 73 20 55 53 49 4e          "%s USIN
181b0 47 20 41 55 54 4f 4d 41 54 49 43 20 25 73 49 4e  G AUTOMATIC %sIN
181c0 44 45 58 25 2e 30 73 25 73 22 20 3a 0a 20 20 20  DEX%.0s%s" :.   
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 22 25 73 20 55 53 49 4e 47 20 25 73 49 4e 44 45  "%s USING %sINDE
181f0 58 20 25 73 25 73 22 29 2c 20 0a 20 20 20 20 20  X %s%s"), .     
18200 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20            zMsg, 
18210 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
18220 49 44 58 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f 56  IDX_ONLY) ? "COV
18230 45 52 49 4e 47 20 22 20 3a 20 22 22 29 2c 0a 20  ERING " : ""),. 
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
18250 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
18260 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65  dex->zName, zWhe
18270 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  re);.      sqlit
18280 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68  e3DbFree(db, zWh
18290 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ere);.    }else 
182a0 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
182b0 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66  RE_IPK)!=0 && (f
182c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
182d0 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20  STRAINT)!=0 ){. 
182e0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
182f0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
18300 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20  zMsg, "%s USING 
18310 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
18320 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20  KEY", zMsg);..  
18330 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 28 57      if( flags&(W
18340 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
18350 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20  HERE_COLUMN_IN) 
18360 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
18370 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
18380 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
18390 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67  (rowid=?)", zMsg
183a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
183b0 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
183c0 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45  BOTH_LIMIT)==WHE
183d0 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b  RE_BOTH_LIMIT ){
183e0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
183f0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
18400 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
18410 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64  owid>? AND rowid
18420 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
18430 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
18440 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
18450 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
18460 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
18470 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
18480 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a  %s (rowid>?)", z
18490 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
184a0 65 20 69 66 28 20 41 4c 57 41 59 53 28 66 6c 61  e if( ALWAYS(fla
184b0 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
184c0 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IT) ){.        z
184d0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
184e0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
184f0 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20  "%s (rowid<?)", 
18500 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMsg);.      }. 
18510 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
18520 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
18530 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69  TABLE.    else i
18540 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
18550 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
18560 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  =0 ){.      zMsg
18570 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
18580 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
18590 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
185a0 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73  NDEX %d:%s", zMs
185b0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
185c0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74       pLoop->u.vt
185d0 61 62 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70  ab.idxNum, pLoop
185e0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
185f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
18600 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
18610 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
18620 73 67 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b  sg, "%s", zMsg);
18630 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18640 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
18650 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65  lain, iId, iLeve
18660 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20  l, iFrom, zMsg, 
18670 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
18680 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
18690 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  e explainOneScan
186a0 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  (u,v,w,x,y,z).#e
186b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
186c0 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
186d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
186e0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
186f0 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c  rt of the iLevel
18700 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  -th loop in the 
18710 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
18720 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
18730 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e  escribed by pWIn
18740 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  fo..*/.static Bi
18750 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f  tmask codeOneLoo
18760 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49  pStart(.  WhereI
18770 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f  nfo *pWInfo,   /
18780 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72  * Complete infor
18790 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
187a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
187b0 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
187c0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
187d0 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f   level of pWInfo
187e0 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  ->a[] should be 
187f0 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  coded */.  Bitma
18800 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
18810 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20  /* Which tables 
18820 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76  are currently av
18830 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ailable */.){.  
18840 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20  int j, k;       
18850 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18860 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
18870 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
18880 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
18890 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
188a0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78   */.  int addrNx
188b0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  t;         /* Wh
188c0 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63  ere to jump to c
188d0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
188e0 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f   next IN case */
188f0 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65  .  int omitTable
18900 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
18910 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
18920 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e  dex only */.  in
18930 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
18940 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
18950 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
18960 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
18970 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
18980 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20  pLevel;  /* The 
18990 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62  where level to b
189a0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
189b0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
189c0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
189d0 6f 70 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  op object being 
189e0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
189f0 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
18a00 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
18a10 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57   of the entire W
18a20 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
18a30 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
18a40 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
18a50 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75   /* A WHERE clau
18a60 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72  se term */.  Par
18a70 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18a90 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
18aa0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
18ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18ac0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
18ad0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
18ae0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
18b10 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73   stmt under cons
18b20 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  tructions */.  s
18b30 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
18b40 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
18b50 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
18b60 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  rm being coded *
18b70 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b  /.  int addrBrk;
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b90 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
18ba0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
18bb0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
18bc0 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20  nt addrCont;    
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18be0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
18bf0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
18c00 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
18c10 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20   iRowidReg = 0; 
18c20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
18c30 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69  is stored in thi
18c40 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e  s register, if n
18c50 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ot zero */.  int
18c60 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30   iReleaseReg = 0
18c70 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72  ;      /* Temp r
18c80 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
18c90 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
18ca0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
18cb0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
18cc0 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
18cd0 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  dbe;.  pWC = &pW
18ce0 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20  Info->sWC;.  db 
18cf0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
18d00 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
18d10 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70  ->a[iLevel];.  p
18d20 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
18d30 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65  WLoop;.  pTabIte
18d40 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  m = &pWInfo->pTa
18d50 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
18d60 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20  >iFrom];.  iCur 
18d70 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
18d80 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e  sor;.  pLevel->n
18d90 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61  otReady = notRea
18da0 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70  dy & ~getMask(&p
18db0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
18dc0 20 69 43 75 72 29 3b 0a 20 20 62 52 65 76 20 3d   iCur);.  bRev =
18dd0 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73   (pWInfo->revMas
18de0 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20  k>>iLevel)&1;.  
18df0 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f  omitTable = (pLo
18e00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
18e10 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
18e20 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
18e30 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
18e40 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
18e50 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56  E_TABLE)==0;.  V
18e60 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
18e70 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
18e80 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 69 4c  E-loop%d: %s",iL
18e90 65 76 65 6c 2c 70 54 61 62 49 74 65 6d 2d 3e 70  evel,pTabItem->p
18ea0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  Tab->zName));.. 
18eb0 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
18ec0 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
18ed0 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
18ee0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
18ef0 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
18f00 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
18f10 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
18f20 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
18f30 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
18f40 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
18f50 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
18f60 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
18f70 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
18f80 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
18f90 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
18fa0 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
18fb0 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
18fc0 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
18fd0 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
18fe0 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
18ff0 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
19000 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
19010 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
19020 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
19030 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
19040 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
19050 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
19060 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
19070 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
19080 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
19090 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
190a0 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
190b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
190c0 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
190d0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
190e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
190f0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
19100 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
19110 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
19120 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
19130 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
19140 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
19150 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
19160 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
19170 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
19180 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
19190 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
191a0 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
191b0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
191c0 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
191d0 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
191e0 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
191f0 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
19200 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
19210 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
19220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19230 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
19240 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
19250 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
19260 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
19270 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
19280 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lag"));.  }..  /
19290 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f  * Special case o
192a0 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
192b0 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65  subquery impleme
192c0 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
192d0 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54  tine */.  if( pT
192e0 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
192f0 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
19300 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
19310 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
19320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19330 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
19340 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
19350 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d  eld, 0, pTabItem
19360 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a  ->addrFillSub);.
19370 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
19380 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19390 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
193a0 20 72 65 67 59 69 65 6c 64 2c 20 61 64 64 72 42   regYield, addrB
193b0 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  rk);.    VdbeCov
193c0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
193d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
193e0 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
193f0 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
19400 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
19410 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
19420 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a  _Goto;.  }else..
19430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19440 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
19450 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e  .  if(  (pLoop->
19460 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19470 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
19480 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
19490 31 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  1:  The table is
194a0 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65   a virtual-table
194b0 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74  .  Use the VFilt
194c0 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20  er and VNext.   
194d0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
194e0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
194f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
19500 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61  iReg;   /* P3 Va
19510 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74  lue for OP_VFilt
19520 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
19530 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20  drNotFound;.    
19540 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
19550 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b  = pLoop->nLTerm;
19560 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
19570 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
19580 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
19590 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
195a0 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
195b0 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61  traint+2);.    a
195c0 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
195d0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20  evel->addrBrk;. 
195e0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
195f0 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
19600 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67  .      int iTarg
19610 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20  et = iReg+j+2;. 
19620 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f       pTerm = pLo
19630 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20  op->aLTerm[j];. 
19640 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
19650 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
19660 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
19670 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
19680 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
19690 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
196a0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
196b0 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61  el, j, bRev, iTa
196c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61  rget);.        a
196d0 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c  ddrNotFound = pL
196e0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
196f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19710 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  ode(pParse, pTer
19720 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
19730 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
19740 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
19750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19760 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
19770 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
19780 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
19790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
197a0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
197b0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52   nConstraint, iR
197c0 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
197d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
197e0 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
197f0 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20  , addrNotFound, 
19800 69 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20  iReg,.          
19810 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
19820 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
19830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19840 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
19850 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f  .vtab.needFree ?
19860 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
19870 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 56 64  _STATIC);.    Vd
19880 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19890 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
198a0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
198b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
198c0 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31  onstraint && j<1
198d0 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  6; j++){.      i
198e0 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  f( (pLoop->u.vta
198f0 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31  b.omitMask>>j)&1
19900 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
19910 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
19920 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
19930 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19940 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
19950 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
19960 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
19970 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
19980 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
19990 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
199a0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
199b0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
199c0 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72  e, iReg, nConstr
199d0 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c  aint+2);.    sql
199e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
199f0 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73  (pParse);.  }els
19a00 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
19a10 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
19a20 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28  ABLE */..  if( (
19a30 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
19a40 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
19a50 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
19a60 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
19a70 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f  LUMN_IN|WHERE_CO
19a80 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29  LUMN_EQ))!=0.  )
19a90 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a  {.    /* Case 2:
19aa0 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
19ab0 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
19ac0 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
19ad0 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
19ae0 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
19af0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
19b00 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
19b10 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
19b20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
19b30 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
19b40 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
19b50 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
19b60 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
19b70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
19b80 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ert( pLoop->u.bt
19b90 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20  ree.nEq==1 );.  
19ba0 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
19bb0 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
19bc0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
19bd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19be0 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
19bf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
19c00 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
19c10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
19c20 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
19c30 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
19c40 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
19c50 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19c60 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
19c70 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
19c80 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
19c90 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c  pLevel, 0, bRev,
19ca0 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
19cb0 20 20 20 69 66 28 20 69 52 6f 77 69 64 52 65 67     if( iRowidReg
19cc0 21 3d 69 52 65 6c 65 61 73 65 52 65 67 20 29 20  !=iReleaseReg ) 
19cd0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19ce0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
19cf0 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20  eleaseReg);.    
19d00 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
19d10 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73  ->addrNxt;.    s
19d20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19d30 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
19d40 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64  , iRowidReg, add
19d50 72 4e 78 74 29 3b 20 56 64 62 65 43 6f 76 65 72  rNxt); VdbeCover
19d60 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19d70 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19d80 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
19d90 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52  Cur, addrNxt, iR
19da0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
19db0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19dc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
19dd0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
19de0 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
19df0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
19e00 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
19e10 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
19e20 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
19e30 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
19e40 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
19e50 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
19e60 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
19e70 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
19e80 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
19e90 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
19ea0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
19eb0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
19ec0 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
19ed0 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
19ee0 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
19ef0 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
19f00 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
19f10 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
19f20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
19f30 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
19f40 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
19f50 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
19f60 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19f70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
19f80 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
19f90 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
19fa0 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
19fb0 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
19fc0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
19fd0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
19fe0 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
19ff0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1a000 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
1a010 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1a020 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
1a030 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
1a040 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
1a050 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
1a060 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
1a070 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
1a080 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
1a090 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
1a0a0 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
1a0b0 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
1a0c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
1a0d0 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
1a0e0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1a0f0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1a100 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
1a110 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
1a120 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
1a130 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
1a140 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
1a150 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
1a160 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
1a170 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
1a180 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
1a190 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
1a1a0 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
1a1b0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
1a1c0 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
1a1d0 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
1a1e0 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
1a1f0 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
1a200 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1a210 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
1a220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1a230 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
1a240 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T,.           /*
1a250 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
1a260 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLE,.          
1a270 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
1a280 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20 20 20 20  _SeekLT,.       
1a290 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
1a2a0 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20   OP_SeekGE.     
1a2b0 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
1a2c0 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
1a2d0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
1a2e0 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
1a2f0 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
1a300 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
1a310 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
1a320 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
1a330 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
1a340 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1a350 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
1a360 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
1a370 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
1a380 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61     assert( (pSta
1a390 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1a3a0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1a3b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a3c0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1a3d0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1a3e0 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ;.      pX = pSt
1a3f0 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
1a400 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1a410 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a420 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  e( pStart->leftC
1a430 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f  ursor!=iCur ); /
1a440 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  * transitive con
1a450 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
1a460 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1a470 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1a480 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
1a490 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
1a4a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a4b0 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
1a4c0 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
1a4d0 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
1a4e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1a4f0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
1a500 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a510 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47  (v, pX->op==TK_G
1a520 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
1a530 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1a540 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20  op==TK_LE);.    
1a550 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1a560 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  (v, pX->op==TK_L
1a570 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
1a580 76 65 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e  verageIf(v, pX->
1a590 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
1a5a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a5b0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1a5c0 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
1a5d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1a5e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a5f0 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
1a600 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1a610 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
1a620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a640 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
1a650 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
1a660 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
1a670 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1a680 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d  rageIf(v, bRev==
1a690 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
1a6a0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
1a6b0 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  !=0);.    }.    
1a6c0 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
1a6d0 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
1a6e0 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
1a6f0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1a700 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1a710 20 61 73 73 65 72 74 28 20 28 70 45 6e 64 2d 3e   assert( (pEnd->
1a720 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1a730 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NULL)==0 );.    
1a740 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64    testcase( pEnd
1a750 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
1a760 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e 73 69 74  ur ); /* Transit
1a770 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ive constraints 
1a780 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
1a790 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
1a7a0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1a7b0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  );.      memEndV
1a7c0 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
1a7d0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1a7e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1a7f0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1a800 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
1a810 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
1a820 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
1a830 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
1a840 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1a850 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
1a860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a870 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1a880 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
1a890 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
1a8a0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1a8b0 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
1a8c0 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
1a8d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a8e0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1a8f0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
1a900 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
1a910 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
1a920 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1a930 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1a940 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72 74  tart;.    assert
1a950 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1a960 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f  );.    if( testO
1a970 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1a980 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1a990 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a9a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a9b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
1a9c0 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  wid, iCur, iRowi
1a9d0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1a9e0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1a9f0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1aa00 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1aa10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1aa20 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
1aa30 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c  Op, memEndValue,
1aa40 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64   addrBrk, iRowid
1aa50 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Reg);.      Vdbe
1aa60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1aa70 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  stOp==OP_Le);.  
1aa80 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1aa90 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1aaa0 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Lt);.      Vdbe
1aab0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 74 65  CoverageIf(v, te
1aac0 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  stOp==OP_Ge);.  
1aad0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1aae0 49 66 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50  If(v, testOp==OP
1aaf0 5f 47 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  _Gt);.      sqli
1ab00 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1ab10 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
1ab20 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a  MERIC | SQLITE_J
1ab30 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1ab40 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  }.  }else if( pL
1ab50 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1ab60 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
1ab70 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41      /* Case 4: A
1ab80 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
1ab90 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
1aba0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1abb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
1abc0 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
1abd0 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
1abe0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1abf0 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
1ac00 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
1ac10 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
1ac20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
1ac30 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1ac40 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
1ac50 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
1ac60 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
1ac70 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
1ac80 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
1ac90 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
1aca0 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
1acb0 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
1acc0 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
1acd0 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
1ace0 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
1acf0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1ad00 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1ad10 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
1ad20 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
1ad30 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
1ad40 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
1ad50 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
1ad60 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
1ad70 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1ad80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ad90 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
1ada0 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
1adb0 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
1adc0 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
1add0 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
1ade0 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
1ae00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1ae10 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
1ae20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ae30 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
1ae40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1ae50 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
1ae60 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
1ae70 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1ae80 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
1ae90 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1aea0 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
1aeb0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1aec0 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
1aed0 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
1aee0 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
1aef0 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
1af00 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1af10 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
1af20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1af30 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
1af40 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
1af50 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1af60 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
1af70 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
1af80 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
1af90 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
1afa0 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
1afb0 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
1afc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1afd0 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
1afe0 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
1aff0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
1b000 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1b010 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
1b020 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
1b030 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
1b040 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
1b050 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1b060 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
1b070 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
1b080 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
1b090 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
1b0a0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1b0b0 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
1b0c0 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
1b0d0 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
1b0e0 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
1b0f0 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
1b100 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
1b110 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
1b120 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b140 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
1b150 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1b160 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
1b170 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 54 2c        OP_SeekGT,
1b180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
1b190 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1b1a0 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
1b1b0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1b1c0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 20 20      OP_SeekLT,  
1b1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
1b1e0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1b1f0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1b200 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1b210 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20 20 20 20    OP_SeekGE,    
1b220 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
1b230 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1b240 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
1b250 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1b260 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20 20 20 20  OP_SeekLE       
1b270 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
1b280 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1b290 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
1b2a0 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
1b2b0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1b2c0 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
1b2d0 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20        OP_IdxGE, 
1b2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
1b2f0 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
1b300 73 20 26 26 20 21 62 52 65 76 20 26 26 20 21 65  s && !bRev && !e
1b310 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ndEq) */.      O
1b320 50 5f 49 64 78 47 54 2c 20 20 20 20 20 20 20 20  P_IdxGT,        
1b330 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63      /* 1: (end_c
1b340 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62  onstraints && !b
1b350 52 65 76 20 26 26 20 20 65 6e 64 45 71 29 20 2a  Rev &&  endEq) *
1b360 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 45  /.      OP_IdxLE
1b370 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1b380 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
1b390 6e 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20  nts &&  bRev && 
1b3a0 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 20  !endEq) */.     
1b3b0 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20 20 20 20   OP_IdxLT,      
1b3c0 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 65 6e 64        /* 3: (end
1b3d0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1b3e0 20 62 52 65 76 20 26 26 20 20 65 6e 64 45 71 29   bRev &&  endEq)
1b3f0 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75   */.    };.    u
1b400 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  16 nEq = pLoop->
1b410 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 20 20  u.btree.nEq;    
1b420 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
1b430 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
1b440 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b460 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
1b470 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72  r holding constr
1b480 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  aint values */. 
1b490 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1b4a0 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20  angeStart = 0;  
1b4b0 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1b4c0 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1b4d0 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57  e start */.    W
1b4e0 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1b4f0 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
1b500 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1b510 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
1b520 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  d */.    int sta
1b530 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
1b540 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1b550 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
1b560 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
1b570 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b  /.    int endEq;
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b590 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
1b5a0 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c  nge end uses ==,
1b5b0 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
1b5c0 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74   int start_const
1b5d0 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a  raints;       /*
1b5e0 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   Start of range 
1b5f0 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a  is constrained *
1b600 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  /.    int nConst
1b610 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
1b620 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b630 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
1b640 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
1b650 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1b660 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1b670 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  x we will be usi
1b680 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  ng */.    int iI
1b690 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  dxCur;          
1b6a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
1b6b0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
1b6c0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e index */.    i
1b6d0 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30  nt nExtraReg = 0
1b6e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1b6f0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
1b700 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20  egisters needed 
1b710 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20  */.    int op;  
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
1b740 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  on opcode */.   
1b750 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66   char *zStartAff
1b760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b770 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74   Affinity for st
1b780 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  art of range con
1b790 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63  straint */.    c
1b7a0 68 61 72 20 63 45 6e 64 41 66 66 20 3d 20 30 3b  har cEndAff = 0;
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1b7c0 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20  ffinity for end 
1b7d0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
1b7e0 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38 20 62 53  int */.    u8 bS
1b7f0 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 30 3b  eekPastNull = 0;
1b800 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1b810 74 6f 20 73 65 65 6b 20 70 61 73 74 20 69 6e 69  to seek past ini
1b820 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f 0a 20 20  tial nulls */.  
1b830 20 20 75 38 20 62 53 74 6f 70 41 74 4e 75 6c 6c    u8 bStopAtNull
1b840 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1b850 2a 20 41 64 64 20 63 6f 6e 64 69 74 69 6f 6e 20  * Add condition 
1b860 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 61 74 20  to terminate at 
1b870 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20 20 70 49  NULLs */..    pI
1b880 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
1b890 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
1b8a0 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
1b8b0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 61  ->iIdxCur;.    a
1b8c0 73 73 65 72 74 28 20 6e 45 71 3e 3d 70 4c 6f 6f  ssert( nEq>=pLoo
1b8d0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  p->u.btree.nSkip
1b8e0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   );..    /* If t
1b8f0 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
1b900 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
1b910 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
1b920 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
1b930 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
1b940 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
1b950 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
1b960 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
1b970 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
1b980 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
1b990 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
1b9a0 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
1b9b0 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
1b9c0 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
1b9d0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1b9e0 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
1b9f0 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
1ba00 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
1ba10 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
1ba20 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
1ba30 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
1ba40 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
1ba50 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
1ba60 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1ba70 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
1ba80 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
1ba90 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
1baa0 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
1bab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49  .    assert( pWI
1bac0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
1bad0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49  .         || pWI
1bae0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
1baf0 45 78 70 72 3d 3d 31 0a 20 20 20 20 20 20 20 20  Expr==1.        
1bb00 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   || (pWInfo->wct
1bb10 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
1bb20 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b  DERBY_MIN)==0 );
1bb30 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
1bb40 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
1bb50 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21  RE_ORDERBY_MIN)!
1bb60 3d 30 0a 20 20 20 20 20 26 26 20 70 57 49 6e 66  =0.     && pWInf
1bb70 6f 2d 3e 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20  o->nOBSat>0.    
1bb80 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43   && (pIdx->nKeyC
1bb90 6f 6c 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  ol>nEq).    ){. 
1bba0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
1bbb0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69  op->u.btree.nSki
1bbc0 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 53  p==0 );.      bS
1bbd0 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b  eekPastNull = 1;
1bbe0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1bbf0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1bc00 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65   /* Find any ine
1bc10 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1bc20 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
1bc30 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a   start and end .
1bc40 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61      ** of the ra
1bc50 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nge. .    */.   
1bc60 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66   j = nEq;.    if
1bc70 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1bc80 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
1bc90 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
1bca0 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d  geStart = pLoop-
1bcb0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1bcc0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
1bcd0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1bce0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1bcf0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
1bd00 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
1bd10 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  eEnd = pLoop->aL
1bd20 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20  Term[j++];.     
1bd30 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
1bd40 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65        if( pRange
1bd50 53 74 61 72 74 3d 3d 30 0a 20 20 20 20 20 20 20  Start==0.       
1bd60 26 26 20 28 6a 20 3d 20 70 49 64 78 2d 3e 61 69  && (j = pIdx->ai
1bd70 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3e 3d 30 20  Column[nEq])>=0 
1bd80 0a 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d  .       && pIdx-
1bd90 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d  >pTable->aCol[j]
1bda0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20  .notNull==0.    
1bdb0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65    ){.        bSe
1bdc0 65 6b 50 61 73 74 4e 75 6c 6c 20 3d 20 31 3b 0a  ekPastNull = 1;.
1bdd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bde0 20 20 61 73 73 65 72 74 28 20 70 52 61 6e 67 65    assert( pRange
1bdf0 45 6e 64 3d 3d 30 20 7c 7c 20 28 70 52 61 6e 67  End==0 || (pRang
1be00 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
1be10 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
1be20 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
1be30 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
1be40 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
1be50 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
1be60 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61  = or IN.    ** a
1be70 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  nd store the val
1be80 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
1be90 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ms in an array o
1bea0 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
1beb0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
1bec0 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  egBase..    */. 
1bed0 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64     regBase = cod
1bee0 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
1bef0 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c  s(pParse,pLevel,
1bf00 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c 26  bRev,nExtraReg,&
1bf10 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
1bf20 61 73 73 65 72 74 28 20 7a 53 74 61 72 74 41 66  assert( zStartAf
1bf30 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  f==0 || sqlite3S
1bf40 74 72 6c 65 6e 33 30 28 7a 53 74 61 72 74 41 66  trlen30(zStartAf
1bf50 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20 20 20 69  f)>=nEq );.    i
1bf60 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 20 63  f( zStartAff ) c
1bf70 45 6e 64 41 66 66 20 3d 20 7a 53 74 61 72 74 41  EndAff = zStartA
1bf80 66 66 5b 6e 45 71 5d 3b 0a 20 20 20 20 61 64 64  ff[nEq];.    add
1bf90 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
1bfa0 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  ddrNxt;..    /* 
1bfb0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1bfc0 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  a reverse order 
1bfd0 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e  scan on an ascen
1bfe0 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20  ding index, or. 
1bff0 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20     ** a forward 
1c000 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20  order scan on a 
1c010 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
1c020 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68  , interchange th
1c030 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20  e .    ** start 
1c040 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70  and end terms (p
1c050 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70  RangeStart and p
1c060 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a  RangeEnd)..    *
1c070 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71 3c 70  /.    if( (nEq<p
1c080 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 26 26 20  Idx->nKeyCol && 
1c090 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f  bRev==(pIdx->aSo
1c0a0 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51  rtOrder[nEq]==SQ
1c0b0 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20  LITE_SO_ASC)).  
1c0c0 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26 20 70     || (bRev && p
1c0d0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 45  Idx->nKeyCol==nE
1c0e0 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
1c0f0 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a  SWAP(WhereTerm *
1c100 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61  , pRangeEnd, pRa
1c110 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 20  ngeStart);.     
1c120 20 53 57 41 50 28 75 38 2c 20 62 53 65 65 6b 50   SWAP(u8, bSeekP
1c130 61 73 74 4e 75 6c 6c 2c 20 62 53 74 6f 70 41 74  astNull, bStopAt
1c140 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Null);.    }..  
1c150 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1c160 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e  geStart && (pRan
1c170 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
1c180 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
1c190 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c1a0 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 28  pRangeStart && (
1c1b0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
1c1c0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21  erator & WO_GE)!
1c1d0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1c1e0 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
1c1f0 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70   (pRangeEnd->eOp
1c200 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21  erator & WO_LE)!
1c210 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1c220 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
1c230 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70   (pRangeEnd->eOp
1c240 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29 21  erator & WO_GE)!
1c250 3d 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45  =0 );.    startE
1c260 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74  q = !pRangeStart
1c270 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d   || pRangeStart-
1c280 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1c290 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
1c2a0 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67  endEq =   !pRang
1c2b0 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e  eEnd || pRangeEn
1c2c0 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  d->eOperator & (
1c2d0 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
1c2e0 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
1c2f0 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72  nts = pRangeStar
1c300 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20  t || nEq>0;..   
1c310 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64   /* Seek the ind
1c320 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  ex cursor to the
1c330 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61   start of the ra
1c340 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  nge. */.    nCon
1c350 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
1c360 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61     if( pRangeSta
1c370 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
1c380 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1c390 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70  eStart->pExpr->p
1c3a0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
1c3b0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1c3c0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
1c3d0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
1c3e0 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72   if( (pRangeStar
1c3f0 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1c400 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20  M_VNULL)==0.    
1c410 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
1c420 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68  rCanBeNull(pRigh
1c430 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  t).      ){.    
1c440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c450 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1c460 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ll, regBase+nEq,
1c470 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
1c480 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1c490 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
1c4a0 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20    if( zStartAff 
1c4b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
1c4c0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1c4d0 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53  inity(pRight, zS
1c4e0 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53  tartAff[nEq])==S
1c4f0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b  QLITE_AFF_NONE){
1c500 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  .          /* Si
1c510 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  nce the comparis
1c520 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66  on is to be perf
1c530 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f  ormed with no co
1c540 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20  nversions.      
1c550 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74      ** applied t
1c560 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20  o the operands, 
1c570 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  set the affinity
1c580 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69   to apply to pRi
1c590 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ght to .        
1c5a0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    ** SQLITE_AFF_
1c5b0 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20  NONE.  */.      
1c5c0 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
1c5d0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
1c5e0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1c5f0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1c600 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1c610 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1c620 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
1c630 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
1c640 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
1c650 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1c660 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1c670 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43      }  .      nC
1c680 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
1c690 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1c6a0 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
1c6b0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1c6c0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
1c6d0 28 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20  ( bSeekPastNull 
1c6e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c6f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c700 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
1c710 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43  e+nEq);.      nC
1c720 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
1c730 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a     startEq = 0;.
1c740 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73        start_cons
1c750 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20  traints = 1;.   
1c760 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79   }.    codeApply
1c770 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
1c780 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
1c790 72 61 69 6e 74 20 2d 20 62 53 65 65 6b 50 61 73  raint - bSeekPas
1c7a0 74 4e 75 6c 6c 2c 20 7a 53 74 61 72 74 41 66 66  tNull, zStartAff
1c7b0 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61  );.    op = aSta
1c7c0 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73  rtOp[(start_cons
1c7d0 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73  traints<<2) + (s
1c7e0 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65  tartEq<<1) + bRe
1c7f0 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  v];.    assert( 
1c800 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  op!=0 );.    sql
1c810 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1c820 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
1c830 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
1c840 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
1c850 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1c860 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
1c870 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1c880 3d 4f 50 5f 52 65 77 69 6e 64 29 3b 20 20 74 65  =OP_Rewind);  te
1c890 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52  stcase( op==OP_R
1c8a0 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 56 64 62  ewind );.    Vdb
1c8b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1c8c0 70 3d 3d 4f 50 5f 4c 61 73 74 29 3b 20 20 20 20  p==OP_Last);    
1c8d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1c8e0 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 56 64 62  _Last );.    Vdb
1c8f0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1c900 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 20 20  p==OP_SeekGT);  
1c910 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1c920 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20 56  _SeekGT );.    V
1c930 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c940 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 29 3b   op==OP_SeekGE);
1c950 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1c960 4f 50 5f 53 65 65 6b 47 45 20 29 3b 0a 20 20 20  OP_SeekGE );.   
1c970 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1c980 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 45  v, op==OP_SeekLE
1c990 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1c9a0 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20  ==OP_SeekLE );. 
1c9b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1c9c0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
1c9d0 4c 54 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  LT);  testcase( 
1c9e0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 29 3b  op==OP_SeekLT );
1c9f0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
1ca00 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
1ca10 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1ca20 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
1ca30 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
1ca40 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
1ca50 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
1ca60 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
1ca70 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
1ca80 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
1ca90 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64  ight = pRangeEnd
1caa0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
1cab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1cac0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1cad0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
1cae0 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  q, 1);.      sql
1caf0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1cb00 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
1cb10 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
1cb20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d   if( (pRangeEnd-
1cb30 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1cb40 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20  VNULL)==0.      
1cb50 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
1cb60 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67 68 74 29  anBeNull(pRight)
1cb70 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1cb80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb90 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
1cba0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
1cbb0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 20  ddrNxt);.       
1cbc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1cbd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cbe0 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
1cbf0 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
1cc00 74 2c 20 63 45 6e 64 41 66 66 29 21 3d 53 51 4c  t, cEndAff)!=SQL
1cc10 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20 20  ITE_AFF_NONE.   
1cc20 20 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 45      && !sqlite3E
1cc30 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
1cc40 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
1cc50 20 63 45 6e 64 41 66 66 29 0a 20 20 20 20 20 20   cEndAff).      
1cc60 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 41  ){.        codeA
1cc70 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
1cc80 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  rse, regBase+nEq
1cc90 2c 20 31 2c 20 26 63 45 6e 64 41 66 66 29 3b 0a  , 1, &cEndAff);.
1cca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43        }.      nC
1ccb0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
1ccc0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1ccd0 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
1cce0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1ccf0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1cd00 62 53 74 6f 70 41 74 4e 75 6c 6c 20 29 7b 0a 20  bStopAtNull ){. 
1cd10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cd20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1cd30 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
1cd40 71 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71 20  q);.      endEq 
1cd50 3d 20 30 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  = 0;.      nCons
1cd60 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  traint++;.    }.
1cd70 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1cd80 65 28 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  e(db, zStartAff)
1cd90 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;..    /* Top of
1cda0 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a   the loop body *
1cdb0 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  /.    pLevel->p2
1cdc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1cdd0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
1cde0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
1cdf0 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
1ce00 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  is past the end 
1ce10 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
1ce20 0a 20 20 20 20 69 66 28 20 6e 43 6f 6e 73 74 72  .    if( nConstr
1ce30 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 6f 70  aint ){.      op
1ce40 20 3d 20 61 45 6e 64 4f 70 5b 62 52 65 76 2a 32   = aEndOp[bRev*2
1ce50 20 2b 20 65 6e 64 45 71 5d 3b 0a 20 20 20 20 20   + endEq];.     
1ce60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ce70 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
1ce80 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
1ce90 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
1cea0 69 6e 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  int);.      test
1ceb0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
1cec0 47 54 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  GT );  VdbeCover
1ced0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1cee0 49 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20 74  IdxGT );.      t
1cef0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1cf00 49 64 78 47 45 20 29 3b 20 20 56 64 62 65 43 6f  IdxGE );  VdbeCo
1cf10 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1cf20 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20  OP_IdxGE );.    
1cf30 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1cf40 4f 50 5f 49 64 78 4c 54 20 29 3b 20 20 56 64 62  OP_IdxLT );  Vdb
1cf50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1cf60 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20  p==OP_IdxLT );. 
1cf70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1cf80 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29 3b 20 20  p==OP_IdxLE );  
1cf90 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1cfa0 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20 29  , op==OP_IdxLE )
1cfb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cfc0 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
1cfd0 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
1cfe0 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c  ed */.    disabl
1cff0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
1d000 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
1d010 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1d020 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
1d030 20 20 20 20 69 66 28 20 6f 6d 69 74 54 61 62 6c      if( omitTabl
1d040 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 49  e ){.      /* pI
1d050 64 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  dx is a covering
1d060 20 69 6e 64 65 78 2e 20 20 4e 6f 20 6e 65 65 64   index.  No need
1d070 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d   to access the m
1d080 61 69 6e 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ain table. */.  
1d090 20 20 7d 65 6c 73 65 20 69 66 28 20 48 61 73 52    }else if( HasR
1d0a0 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
1d0b0 65 29 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  e) ){.      iRow
1d0c0 69 64 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65  idReg = ++pParse
1d0d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
1d0e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d0f0 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
1d100 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52  iIdxCur, iRowidR
1d110 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1d120 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1d130 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
1d140 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
1d150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d160 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65  AddOp2(v, OP_See
1d170 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  k, iCur, iRowidR
1d180 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65  eg);  /* Deferre
1d190 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 65  d seek */.    }e
1d1a0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
1d1b0 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
1d1c0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1d1d0 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20  Idx->pTable);.  
1d1e0 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1d1f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1d200 6e 67 65 28 70 50 61 72 73 65 2c 20 70 50 6b 2d  nge(pParse, pPk-
1d210 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20  >nKeyCol);.     
1d220 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d   for(j=0; j<pPk-
1d230 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
1d240 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
1d250 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1d260 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f  (pIdx, pPk->aiCo
1d270 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  lumn[j]);.      
1d280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d290 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1d2a0 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c 20 69 52  , iIdxCur, k, iR
1d2b0 6f 77 69 64 52 65 67 2b 6a 29 3b 0a 20 20 20 20  owidReg+j);.    
1d2c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d2d0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1d2e0 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
1d2f0 43 75 72 2c 20 61 64 64 72 43 6f 6e 74 2c 0a 20  Cur, addrCont,. 
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d310 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
1d320 52 65 67 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Reg, pPk->nKeyCo
1d330 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
1d340 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (v);.    }..    
1d350 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
1d360 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
1d370 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
1d380 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
1d390 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
1d3a0 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
1d3b0 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
1d3c0 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
1d3d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d3e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d3f0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b   WHERE_ONEROW ){
1d400 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
1d410 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1d420 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
1d430 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
1d440 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
1d450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d460 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1d470 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1d480 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
1d490 78 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  xCur;.    pLevel
1d4a0 2d 3e 70 33 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  ->p3 = (pLoop->w
1d4b0 73 46 6c 61 67 73 26 57 48 45 52 45 5f 55 4e 51  sFlags&WHERE_UNQ
1d4c0 5f 57 41 4e 54 45 44 29 21 3d 30 20 3f 20 31 3a  _WANTED)!=0 ? 1:
1d4d0 30 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  0;.    if( (pLoo
1d4e0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1d4f0 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d  RE_CONSTRAINT)==
1d500 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
1d510 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
1d520 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
1d530 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
1d540 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1d550 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1d560 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1d570 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d580 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
1d590 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f  ATION.  if( pLoo
1d5a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1d5b0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
1d5c0 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
1d5d0 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
1d5e0 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
1d5f0 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1d600 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
1d610 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1d620 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
1d630 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
1d640 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
1d650 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1d660 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
1d670 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
1d680 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
1d690 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1d6a0 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
1d6b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1d6c0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1d6d0 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
1d6e0 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
1d6f0 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
1d700 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
1d710 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
1d720 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
1d730 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
1d740 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
1d750 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
1d760 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1d770 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1d780 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1d7a0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1d7b0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1d7c0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
1d7d0 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
1d7e0 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
1d7f0 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
1d800 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
1d810 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
1d820 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
1d830 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1d840 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
1d850 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
1d860 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
1d870 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
1d880 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
1d890 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
1d8a0 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
1d8b0 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
1d8c0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1d8d0 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
1d8e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1d8f0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
1d900 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
1d910 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
1d920 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
1d930 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
1d940 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
1d950 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
1d960 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
1d970 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
1d980 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1d990 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
1d9a0 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
1d9b0 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
1d9c0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1d9d0 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
1d9e0 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
1d9f0 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
1da00 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
1da10 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
1da20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
1da30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1da40 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
1da50 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
1da60 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
1da70 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
1da80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
1da90 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
1daa0 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
1dab0 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
1dac0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1dad0 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
1dae0 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
1daf0 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
1db00 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
1db10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1db20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
1db30 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1db40 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
1db50 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
1db60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
1db70 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
1db80 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
1db90 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
1dba0 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
1dbb0 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
1dbc0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
1dbd0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
1dbe0 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
1dbf0 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
1dc00 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
1dc10 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
1dc20 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  on */.    Index 
1dc30 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20  *pCov = 0;      
1dc40 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74         /* Potent
1dc50 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ial covering ind
1dc60 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ex (or NULL) */.
1dc70 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20      int iCovCur 
1dc80 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1dc90 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65  ;  /* Cursor use
1dca0 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e  d for index scan
1dcb0 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20  s (if any) */.. 
1dcc0 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e     int regReturn
1dcd0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1dce0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
1dcf0 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69  Register used wi
1dd00 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  th OP_Gosub */. 
1dd10 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74     int regRowset
1dd20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd40 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77  Register for Row
1dd50 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Set object */.  
1dd60 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
1dd70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1dd90 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
1dda0 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
1ddb0 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c   iLoopBody = sql
1ddc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1ddd0 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20  l(v);  /* Start 
1dde0 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  of loop body */.
1ddf0 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74      int iRetInit
1de00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de20 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52   Address of regR
1de30 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20  eturn init */.  
1de40 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65    int untestedTe
1de50 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rms = 0;        
1de60 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72       /* Some ter
1de70 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  ms not completel
1de80 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20  y tested */.    
1de90 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1dec0 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  er */.    Expr *
1ded0 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20  pAndExpr = 0;   
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1def0 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29  An ".. AND (...)
1df00 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  " expression */.
1df10 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
1df20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
1df30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1df40 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
1df50 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
1df60 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29  erator & WO_OR )
1df70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
1df80 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1df90 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
1dfa0 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
1dfb0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1dfc0 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
1dfd0 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
1dfe0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1dff0 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
1e000 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
1e010 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f  ew SrcList in pO
1e020 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
1e030 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
1e040 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
1e050 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
1e060 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
1e070 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
1e080 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
1e090 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
1e0a0 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
1e0b0 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
1e0c0 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
1e0d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1e0e0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
1e0f0 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
1e100 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
1e110 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
1e120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e130 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
1e140 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
1e150 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1e160 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
1e170 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
1e180 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
1e190 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
1e1a0 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
1e1b0 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
1e1c0 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
1e1d0 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
1e1e0 41 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20  AllocRaw(db,.   
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1e210 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65  *pOrTab)+ nNotRe
1e220 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61  ady*sizeof(pOrTa
1e230 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  b->a[0]));.     
1e240 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29   if( pOrTab==0 )
1e250 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
1e260 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
1e270 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e  nAlloc = (u8)(nN
1e280 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20  otReady + 1);.  
1e290 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63      pOrTab->nSrc
1e2a0 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f   = pOrTab->nAllo
1e2b0 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  c;.      memcpy(
1e2c0 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49  pOrTab->a, pTabI
1e2d0 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61  tem, sizeof(*pTa
1e2e0 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f  bItem));.      o
1e2f0 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d  rigSrc = pWInfo-
1e300 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
1e310 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d      for(k=1; k<=
1e320 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b  nNotReady; k++){
1e330 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1e340 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26  &pOrTab->a[k], &
1e350 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b  origSrc[pLevel[k
1e360 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66  ].iFrom], sizeof
1e370 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b  (pOrTab->a[k]));
1e380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1e390 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  se{.      pOrTab
1e3a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1e3b0 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ist;.    }..    
1e3c0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1e3d0 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65  e rowset registe
1e3e0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  r to contain NUL
1e3f0 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69  L. An SQL NULL i
1e400 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  s .    ** equiva
1e410 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  lent to an empty
1e420 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a   rowset..    **.
1e430 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74      ** Also init
1e440 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e  ialize regReturn
1e450 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1e460 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  address of the i
1e470 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20  nstruction .    
1e480 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
1e490 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f  ollowing the OP_
1e4a0 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f  Return at the bo
1e4b0 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
1e4c0 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
1e4d0 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66   required in a f
1e4e0 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20  ew obscure LEFT 
1e4f0 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65  JOIN cases where
1e500 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20   control jumps. 
1e510 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74     ** over the t
1e520 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  op of the loop i
1e530 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
1e540 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
1e550 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72   the .    ** cor
1e560 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f  rect response fo
1e570 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  r the end-of-loo
1e580 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52  p code (the OP_R
1e590 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20  eturn) is to .  
1e5a0 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67    ** fall throug
1e5b0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
1e5c0 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20  struction, just 
1e5d0 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f  as an OP_Next do
1e5e0 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c  es if.    ** cal
1e5f0 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74  led on an uninit
1e600 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a  ialized cursor..
1e610 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1e620 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1e630 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
1e640 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
1e650 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
1e660 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1e670 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
1e680 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1e690 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1e6a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e6b0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
1e6c0 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
1e6d0 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
1e6e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e6f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
1e700 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
1e710 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  /* If the origin
1e720 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
1e730 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d  is z of the form
1e740 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  :  (x1 OR x2 OR 
1e750 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a  ...) AND y.    *
1e760 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79  * Then for every
1e770 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61   term xN, evalua
1e780 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70  te as the subexp
1e790 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20  ression: xN AND 
1e7a0 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  z.    ** That wa
1e7b0 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68  y, terms in y th
1e7c0 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20  at are factored 
1e7d0 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63  into the disjunc
1e7e0 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
1e7f0 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79   be picked up by
1e800 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
1e810 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57  alls to sqlite3W
1e820 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f  hereBegin() belo
1e830 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
1e840 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20   Actually, each 
1e850 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
1e860 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78   converted to "x
1e870 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77  N AND w" where w
1e880 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22   is.    ** the "
1e890 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72  interesting" ter
1e8a0 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20  ms of z - terms 
1e8b0 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  that did not ori
1e8c0 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20  ginate in the.  
1e8d0 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47    ** ON or USING
1e8e0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
1e8f0 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d  T JOIN, and term
1e900 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c  s that are usabl
1e910 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64  e as .    ** ind
1e920 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
1e930 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
1e940 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20  ation also only 
1e950 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28  applies if the (
1e960 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
1e970 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20   term.    ** is 
1e980 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1e990 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
1e9a0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
1e9b0 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74     ** See ticket
1e9c0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
1e9d0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
1e9e0 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a  f2369304e4.    *
1e9f0 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e  /.    if( pWC->n
1ea00 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20  Term>1 ){.      
1ea10 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  int iTerm;.     
1ea20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54   for(iTerm=0; iT
1ea30 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  erm<pWC->nTerm; 
1ea40 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  iTerm++){.      
1ea50 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1ea60 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
1ea70 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
1ea80 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20   &pWC->a[iTerm] 
1ea90 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69  == pTerm ) conti
1eaa0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1eab0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1eac0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
1ead0 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  oin) ) continue;
1eae0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1eaf0 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
1eb00 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
1eb10 4f 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20  ORINFO );.      
1eb20 20 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d    testcase( pWC-
1eb30 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
1eb40 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1eb50 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1eb60 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
1eb70 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52  Flags & (TERM_OR
1eb80 49 4e 46 4f 7c 54 45 52 4d 5f 56 49 52 54 55 41  INFO|TERM_VIRTUA
1eb90 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
1eba0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d         if( (pWC-
1ebb0 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61  >a[iTerm].eOpera
1ebc0 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30  tor & WO_ALL)==0
1ebd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ebe0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1ebf0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1ec00 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1ec10 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71     pAndExpr = sq
1ec20 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1ec30 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72   pAndExpr, pExpr
1ec40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ec50 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
1ec60 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
1ec70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
1ec80 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c  (pParse, TK_AND,
1ec90 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29   0, pAndExpr, 0)
1eca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ecb0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1ecc0 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20  i<pOrWc->nTerm; 
1ecd0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  ii++){.      Whe
1ece0 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20  reTerm *pOrTerm 
1ecf0 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b  = &pOrWc->a[ii];
1ed00 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
1ed10 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
1ed20 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d  iCur || (pOrTerm
1ed30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1ed40 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
1ed50 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
1ed60 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
1ed70 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
1ed80 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
1ed90 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  an */.        Ex
1eda0 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f  pr *pOrExpr = pO
1edb0 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  rTerm->pExpr;.  
1edc0 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
1edd0 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
1ede0 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
1edf0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1ee00 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
1ee10 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
1ee20 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
1ee30 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
1ee40 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
1ee50 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
1ee60 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
1ee70 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
1ee80 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
1ee90 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f         pSubWInfo
1eea0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
1eeb0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72  egin(pParse, pOr
1eec0 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c  Tab, pOrExpr, 0,
1eed0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
1eef0 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
1ef00 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  E | WHERE_AND_ON
1ef10 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  LY |.           
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
1ef30 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c  RE_FORCE_TABLE |
1ef40 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
1ef50 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a  ONLY, iCovCur);.
1ef60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ef70 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61  pSubWInfo || pPa
1ef80 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1ef90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1efa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
1efb0 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  bWInfo ){.      
1efc0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
1efd0 53 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  SubLoop;.       
1efe0 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
1eff0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
1f000 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
1f010 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
1f020 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65  ], iLevel, pLeve
1f030 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20  l->iFrom, 0.    
1f040 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1f050 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
1f060 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1f070 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
1f080 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1f090 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
1f0a0 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
1f0b0 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
1f0c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
1f0e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1f0f0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1f100 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c   pTabItem->pTab,
1f110 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20   -1, iCur, .    
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30       regRowid, 0
1f150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1f160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f170 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
1f180 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
1f190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
1f1c0 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
1f1d0 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  , iSet);.       
1f1e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1f1f0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
1f200 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
1f210 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f220 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
1f230 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  turn, iLoopBody)
1f240 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
1f250 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
1f260 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
1f270 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
1f280 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
1f290 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
1f2a0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
1f2b0 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
1f2c0 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
1f2d0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
1f2e0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
1f2f0 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
1f300 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
1f310 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
1f320 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
1f330 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
1f340 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1f350 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
1f360 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
1f370 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
1f380 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
1f390 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66      /* If all of
1f3a0 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65   the OR-connecte
1f3b0 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69  d terms are opti
1f3c0 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20  mized using the 
1f3d0 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
1f3e0 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65  * index, and the
1f3f0 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64   index is opened
1f400 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
1f410 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
1f420 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61          ** by ea
1f430 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ch call to sqlit
1f440 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d  e3WhereBegin() m
1f450 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70  ade by this loop
1f460 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20  , it may.       
1f470 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c     ** be possibl
1f480 65 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e  e to use that in
1f490 64 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e  dex as a coverin
1f4a0 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  g index..       
1f4b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
1f4c0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  ** If the call t
1f4d0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1f4e0 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75  gin() above resu
1f4f0 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74  lted in a scan t
1f500 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1f510 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
1f520 61 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68  and this is eith
1f530 65 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d  er the first OR-
1f540 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20  connected term. 
1f550 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1f560 65 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64  essed or the ind
1f570 65 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ex is the same a
1f580 73 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61  s that used by a
1f590 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20  ll previous.    
1f5a0 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20        ** terms, 
1f5b0 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20  set pCov to the 
1f5c0 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69  candidate coveri
1f5d0 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77  ng index. Otherw
1f5e0 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20  ise, set .      
1f5f0 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e      ** pCov to N
1f600 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ULL to indicate 
1f610 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74  that no candidat
1f620 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
1f630 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20   will .         
1f640 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65   ** be available
1f650 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1f660 20 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f           pSubLoo
1f670 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  p = pSubWInfo->a
1f680 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  [0].pWLoop;.    
1f690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1f6a0 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  SubLoop->wsFlags
1f6b0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
1f6c0 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DEX)==0 );.     
1f6d0 20 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f       if( (pSubLo
1f6e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1f6f0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
1f700 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
1f710 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70  i==0 || pSubLoop
1f720 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1f730 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20  ==pCov).        
1f740 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1f750 20 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e   assert( pSubWIn
1f760 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72  fo->a[0].iIdxCur
1f770 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20  ==iCovCur );.   
1f780 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
1f790 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  pSubLoop->u.btre
1f7a0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
1f7b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f7c0 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b         pCov = 0;
1f7d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
1f7e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
1f7f0 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
1f800 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
1f810 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
1f820 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
1f830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1f840 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
1f850 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f860 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1f870 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
1f880 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28   = pCov;.    if(
1f890 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e   pCov ) pLevel->
1f8a0 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75  iIdxCur = iCovCu
1f8b0 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45  r;.    if( pAndE
1f8c0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e  xpr ){.      pAn
1f8d0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  dExpr->pLeft = 0
1f8e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f8f0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41  xprDelete(db, pA
1f900 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  ndExpr);.    }. 
1f910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1f920 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
1f930 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
1f940 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
1f950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f960 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1f970 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
1f980 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
1f990 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f9a0 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
1f9b0 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
1f9c0 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
1f9d0 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 64  lite3StackFree(d
1f9e0 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
1f9f0 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
1fa00 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
1fa10 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
1fa20 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
1fa30 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
1fa40 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
1fa50 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
1fa60 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20  se 6:  There is 
1fa70 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
1fa80 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
1fa90 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
1faa0 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
1fab0 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
1fac0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
1fad0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
1fae0 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
1faf0 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
1fb00 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1fb10 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
1fb20 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
1fb30 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
1fb40 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
1fb50 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =1 );.    if( pT
1fb60 61 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73  abItem->isRecurs
1fb70 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ive ){.      /* 
1fb80 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69 73  Tables marked is
1fb90 52 65 63 75 72 73 69 76 65 20 68 61 76 65 20 6f  Recursive have o
1fba0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
1fbb0 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
1fbc0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70 73  in.      ** a ps
1fbd0 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e 6f  eudo-cursor.  No
1fbe0 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64 20   need to Rewind 
1fbf0 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63 75 72  or Next such cur
1fc00 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  sors. */.      p
1fc10 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
1fc20 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oop;.    }else{.
1fc30 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
1fc40 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
1fc50 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
1fc60 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
1fc70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
1fc80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fc90 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
1fca0 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
1fcb0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1fcc0 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d  erageIf(v, bRev=
1fcd0 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  =0);.      VdbeC
1fce0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
1fcf0 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c 65  v!=0);.      pLe
1fd00 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
1fd10 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
1fd20 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
1fd30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
1fd40 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
1fd50 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
1fd60 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
1fd70 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
1fd80 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
1fd90 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
1fda0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
1fdb0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1fdc0 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
1fdd0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
1fde0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1fdf0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1fe00 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1fe10 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1fe20 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1fe30 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1fe40 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
1fe50 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
1fe60 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
1fe70 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
1fe80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1fe90 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1fea0 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d  reqAll & pLevel-
1feb0 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b  >notReady)!=0 ){
1fec0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fed0 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
1fee0 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
1fef0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
1ff00 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1ff10 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
1ff20 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
1ff30 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
1ff40 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
1ff50 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1ff60 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
1ff70 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
1ff80 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
1ff90 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1ffa0 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
1ffb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ffc0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
1ffd0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
1ffe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1fff0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
20000 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
20010 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
20020 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
20030 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
20040 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
20050 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
20060 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70   to test for imp
20070 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  lied constraints
20080 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69   based on transi
20090 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74  tivity.  ** of t
200a0 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
200b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
200c0 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52  ple: If the WHER
200d0 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
200e0 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e  s "t1.a=t2.b" an
200f0 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a  d "t2.b=123".  *
20100 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64  * and we are cod
20110 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ing the t1 loop 
20120 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  and the t2 loop 
20130 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  has not yet code
20140 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20  d,.  ** then we 
20150 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22  cannot use the "
20160 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74  t1.a=t2.b" const
20170 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61  raint, but we ca
20180 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20  n code.  ** the 
20190 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32  implied "t1.a=12
201a0 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  3" constraint.. 
201b0 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
201c0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
201d0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
201e0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
201f0 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a  pr *pE, *pEAlt;.
20200 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
20210 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65  Alt;.    if( pTe
20220 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
20230 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
20240 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
20250 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
20260 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57  m->eOperator!=(W
20270 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29  O_EQUIV|WO_EQ) )
20280 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
20290 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
202a0 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e  rsor!=iCur ) con
202b0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
202c0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
202d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
202e0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
202f0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
20300 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
20310 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
20320 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
20330 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
20340 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  ight & pLevel->n
20350 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20  otReady)!=0 );. 
20360 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65     pAlt = findTe
20370 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54  rm(pWC, iCur, pT
20380 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
20390 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  n, notReady, WO_
203a0 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
203b0 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20    if( pAlt==0 ) 
203c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
203d0 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20  ( pAlt->wtFlags 
203e0 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  & (TERM_CODED) )
203f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74   continue;.    t
20400 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65  estcase( pAlt->e
20410 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
20420 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20430 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f  ( pAlt->eOperato
20440 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
20450 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
20460 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72  nt((v, "begin tr
20470 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
20480 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41 6c  int"));.    pEAl
20490 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  t = sqlite3Stack
204a0 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  AllocRaw(db, siz
204b0 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20 20  eof(*pEAlt));.  
204c0 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a 20    if( pEAlt ){. 
204d0 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a 70       *pEAlt = *p
204e0 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
204f0 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20 3d    pEAlt->pLeft =
20500 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20   pE->pLeft;.    
20510 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
20520 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 41  alse(pParse, pEA
20530 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  lt, addrCont, SQ
20540 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
20550 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
20560 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45 41  tackFree(db, pEA
20570 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  lt);.    }.  }..
20580 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
20590 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
205a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
205b0 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
205c0 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74  act that.  ** at
205d0 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f   least one row o
205e0 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
205f0 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68  e has matched th
20600 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a  e left table.  .
20610 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
20620 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
20630 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
20640 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
20650 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
20660 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
20670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20680 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65  nteger, 1, pLeve
20690 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
206a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
206b0 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20  v, "record LEFT 
206c0 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
206d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
206e0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
206f0 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
20700 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43  C->a, j=0; j<pWC
20710 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  ->nTerm; j++, pT
20720 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  erm++){.      te
20730 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
20740 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20750 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
20760 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
20770 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
20780 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
20790 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
207a0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
207b0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
207c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
207d0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
207e0 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e  qAll & pLevel->n
207f0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
20800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
20810 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
20820 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20  erms );.        
20830 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20840 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
20850 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
20860 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20870 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
20880 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
20890 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
208a0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
208b0 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
208c0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
208d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
208e0 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  turn pLevel->not
208f0 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65  Ready;.}..#if de
20900 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
20910 5f 45 4e 41 42 4c 45 44 29 20 26 26 20 64 65 66  _ENABLED) && def
20920 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
20930 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
20940 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20950 22 45 78 70 6c 61 6e 61 74 69 6f 6e 22 20 74 65  "Explanation" te
20960 78 74 20 66 6f 72 20 61 20 57 68 65 72 65 54 65  xt for a WhereTe
20970 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
20980 69 64 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54  id whereExplainT
20990 65 72 6d 28 56 64 62 65 20 2a 76 2c 20 57 68 65  erm(Vdbe *v, Whe
209a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
209b0 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
209c0 0a 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c  .  memcpy(zType,
209d0 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 69 66   "...", 4);.  if
209e0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
209f0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
20a00 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56 27  ) zType[0] = 'V'
20a10 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  ;.  if( pTerm->e
20a20 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
20a30 55 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20  UIV  ) zType[1] 
20a40 3d 20 27 45 27 3b 0a 20 20 69 66 28 20 45 78 70  = 'E';.  if( Exp
20a50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
20a60 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
20a70 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b  omJoin) ) zType[
20a80 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 73 71 6c 69  2] = 'L';.  sqli
20a90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
20aa0 28 76 2c 20 22 25 73 20 22 2c 20 7a 54 79 70 65  (v, "%s ", zType
20ab0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
20ac0 61 69 6e 45 78 70 72 28 76 2c 20 70 54 65 72 6d  ainExpr(v, pTerm
20ad0 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 23 65 6e 64  ->pExpr);.}.#end
20ae0 69 66 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45  if /* WHERETRACE
20af0 5f 45 4e 41 42 4c 45 44 20 26 26 20 53 51 4c 49  _ENABLED && SQLI
20b00 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
20b10 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 23 69 66 64  XPLAIN */...#ifd
20b20 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
20b30 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
20b40 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  t a WhereLoop ob
20b50 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69  ject for debuggi
20b60 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
20b70 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
20b80 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c  LoopPrint(WhereL
20b90 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61  oop *p, WhereCla
20ba0 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65  use *pWC){.  Whe
20bb0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
20bc0 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
20bd0 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e  int nb = 1+(pWIn
20be0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
20bf0 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
20c00 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20c10 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
20c20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d  pTabList->a + p-
20c30 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a  >iTab;.  Table *
20c40 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
20c50 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  ab;.  sqlite3Deb
20c60 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
20c70 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
20c80 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
20ca0 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
20cb0 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
20cc0 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33  ereq);.  sqlite3
20cd0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31  DebugPrintf(" %1
20ce0 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2s",.           
20cf0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
20d00 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d  >zAlias ? pItem-
20d10 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e  >zAlias : pTab->
20d20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70  zName);.  if( (p
20d30 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
20d40 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
20d50 3d 30 20 29 7b 0a 20 20 20 20 20 63 6f 6e 73 74  =0 ){.     const
20d60 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
20d70 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
20d80 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61  e.pIndex && (zNa
20d90 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
20da0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d  pIndex->zName)!=
20db0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
20dc0 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
20dd0 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
20de0 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
20df0 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
20e00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
20e10 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
20e20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
20e30 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
20e40 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
20e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
20e60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
20e70 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
20e80 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
20e90 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
20ea0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
20eb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
20ec0 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
20ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
20ee0 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
20ef0 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
20f00 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
20f10 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
20f20 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
20f30 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
20f40 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
20f50 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
20f60 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
20f70 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
20f80 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
20f90 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
20fa0 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
20fb0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
20fc0 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
20fd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
20fe0 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
20ff0 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
21000 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
21010 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21020 69 6e 74 66 28 22 20 66 20 25 30 34 78 20 4e 20  intf(" f %04x N 
21030 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
21040 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73   p->nLTerm);.  s
21050 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
21060 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25  f(" cost %d,%d,%
21070 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c  d\n", p->rSetup,
21080 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
21090 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
210a0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
210b0 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
210c0 65 20 30 78 31 30 30 20 62 69 74 20 6f 66 20 77  e 0x100 bit of w
210d0 68 65 72 65 74 72 61 63 69 6e 67 20 69 73 20 73  heretracing is s
210e0 65 74 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c  et, then show al
210f0 6c 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72 61  l of the constra
21100 69 6e 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  int.  ** express
21110 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 68 65 72  ions in the Wher
21120 65 4c 6f 6f 70 2e 61 4c 54 65 72 6d 5b 5d 20 61  eLoop.aLTerm[] a
21130 72 72 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rray..  */.  if(
21140 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73   p->nLTerm && (s
21150 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
21160 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 20   & 0x100)!=0 ){ 
21170 20 2f 2a 20 57 48 45 52 45 54 52 41 43 45 20 30   /* WHERETRACE 0
21180 78 31 30 30 20 2a 2f 0a 20 20 20 20 69 6e 74 20  x100 */.    int 
21190 69 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  i;.    Vdbe *v =
211a0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
211b0 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69  >pVdbe;.    sqli
211c0 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28  te3ExplainBegin(
211d0 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  v);.    for(i=0;
211e0 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b   i<p->nLTerm; i+
211f0 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
21200 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 70 2d 3e  erm *pTerm = p->
21210 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20  aLTerm[i];.     
21220 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
21230 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21240 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
21250 69 6e 74 66 28 76 2c 20 22 20 20 28 25 64 29 20  intf(v, "  (%d) 
21260 23 25 2d 32 64 20 22 2c 20 69 2b 31 2c 20 28 69  #%-2d ", i+1, (i
21270 6e 74 29 28 70 54 65 72 6d 2d 70 57 43 2d 3e 61  nt)(pTerm-pWC->a
21280 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
21290 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76 29 3b  3ExplainPush(v);
212a0 0a 20 20 20 20 20 20 77 68 65 72 65 45 78 70 6c  .      whereExpl
212b0 61 69 6e 54 65 72 6d 28 76 2c 20 70 54 65 72 6d  ainTerm(v, pTerm
212c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
212d0 45 78 70 6c 61 69 6e 50 6f 70 28 76 29 3b 0a 20  ExplainPop(v);. 
212e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
212f0 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20 20 7d 0a  ainNL(v);.    }.
21300 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
21310 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a 20 20 20  inFinish(v);.   
21320 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
21330 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
21340 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e  3VdbeExplanation
21350 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (v));.  }.#endif
21360 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21370 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65   Convert bulk me
21380 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69  mory into a vali
21390 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  d WhereLoop that
213a0 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a   can be passed.*
213b0 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c  * to whereLoopCl
213c0 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a  ear harmlessly..
213d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
213e0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65  hereLoopInit(Whe
213f0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d  reLoop *p){.  p-
21400 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54  >aLTerm = p->aLT
21410 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e  ermSpace;.  p->n
21420 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e  LTerm = 0;.  p->
21430 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  nLSlot = ArraySi
21440 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  ze(p->aLTermSpac
21450 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73  e);.  p->wsFlags
21460 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
21470 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f  lear the WhereLo
21480 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61  op.u union.  Lea
21490 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54  ve WhereLoop.pLT
214a0 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73  erm intact..*/.s
214b0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
214c0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73  LoopClearUnion(s
214d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
214e0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
214f0 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57   p->wsFlags & (W
21500 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
21510 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  E|WHERE_AUTO_IND
21520 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  EX) ){.    if( (
21530 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21540 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
21550 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62  !=0 && p->u.vtab
21560 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
21570 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21580 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
21590 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  );.      p->u.vt
215a0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
215b0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
215c0 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  .idxStr = 0;.   
215d0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77   }else if( (p->w
215e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
215f0 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  UTO_INDEX)!=0 &&
21600 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
21610 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex!=0 ){.      s
21620 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21630 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
21640 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  ex->zColAff);.  
21650 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
21660 66 6f 55 6e 72 65 66 28 70 2d 3e 75 2e 62 74 72  foUnref(p->u.btr
21670 65 65 2e 70 49 6e 64 65 78 2d 3e 70 4b 65 79 49  ee.pIndex->pKeyI
21680 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
21690 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
216a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
216b0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
216c0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
216d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
216e0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
216f0 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
21700 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
21710 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
21720 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
21730 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
21740 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
21750 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
21760 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
21770 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
21780 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
21790 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
217a0 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
217b0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
217c0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
217d0 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
217e0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
217f0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
21800 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
21810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21820 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
21830 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
21840 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
21850 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
21860 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
21870 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
21880 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21890 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
218a0 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
218b0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
218c0 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
218d0 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
218e0 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
218f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21900 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70   memcpy(paNew, p
21910 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66  ->aLTerm, sizeof
21920 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70  (p->aLTerm[0])*p
21930 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28  ->nLSlot);.  if(
21940 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
21950 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
21960 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
21970 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e  ->aLTerm);.  p->
21980 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a  aLTerm = paNew;.
21990 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b    p->nLSlot = n;
219a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
219b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
219c0 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66  ansfer content f
219d0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70  rom the second p
219e0 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69  Loop into the fi
219f0 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rst..*/.static i
21a00 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  nt whereLoopXfer
21a10 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
21a20 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68  ereLoop *pTo, Wh
21a30 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b  ereLoop *pFrom){
21a40 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
21a50 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b  rUnion(db, pTo);
21a60 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
21a70 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20  Resize(db, pTo, 
21a80 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29  pFrom->nLTerm) )
21a90 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54  {.    memset(&pT
21aa0 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  o->u, 0, sizeof(
21ab0 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65  pTo->u));.    re
21ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
21ad0 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  M;.  }.  memcpy(
21ae0 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
21af0 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
21b00 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
21b10 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
21b20 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
21b30 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
21b40 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
21b50 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
21b60 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
21b70 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
21b80 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
21b90 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
21ba0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
21bb0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
21bc0 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
21bd0 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
21be0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
21bf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21c00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
21c10 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
21c20 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
21c30 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
21c40 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
21c50 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
21c60 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
21c70 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
21c80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21c90 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  p);.}../*.** Fre
21ca0 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
21cb0 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
21cc0 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
21cd0 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
21ce0 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
21cf0 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
21d00 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
21d10 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
21d20 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ar(&pWInfo->sWC)
21d30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49  ;.    while( pWI
21d40 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20  nfo->pLoops ){. 
21d50 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
21d60 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  p = pWInfo->pLoo
21d70 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ps;.      pWInfo
21d80 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
21d90 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77  extLoop;.      w
21da0 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
21db0 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, p);.    }.   
21dc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21dd0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
21de0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21df0 54 52 55 45 20 69 66 20 62 6f 74 68 20 6f 66 20  TRUE if both of 
21e00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
21e10 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
21e20 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20 73  (1)  X has the s
21e30 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
21e40 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32  t that Y.**   (2
21e50 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  )  X is a proper
21e60 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 0a   subset of Y.**.
21e70 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73 75  ** By "proper su
21e80 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68  bset" we mean th
21e90 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 20  at X uses fewer 
21ea0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
21eb0 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64  ms.** than Y and
21ec0 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
21ed0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
21ee0 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20  ed by X is also 
21ef0 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a  used.** by Y..**
21f00 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70 72  .** If X is a pr
21f10 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
21f20 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65 74   then Y is a bet
21f30 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f  ter choice and o
21f40 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20  ught.** to have 
21f50 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54  a lower cost.  T
21f60 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
21f70 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74 68  rns TRUE when th
21f80 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61  at cost .** rela
21f90 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65  tionship is inve
21fa0 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  rted and needs t
21fb0 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 0a 2a  o be adjusted..*
21fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
21fd0 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
21fe0 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e  perSubset(.  con
21ff0 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58  st WhereLoop *pX
22000 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
22010 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f   WhereLoop to co
22020 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  mpare */.  const
22030 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20   WhereLoop *pY  
22040 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
22050 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57 68   against this Wh
22060 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ereLoop */.){.  
22070 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20  int i, j;.  if( 
22080 70 58 2d 3e 6e 4c 54 65 72 6d 20 3e 3d 20 70 59  pX->nLTerm >= pY
22090 2d 3e 6e 4c 54 65 72 6d 20 29 20 72 65 74 75 72  ->nLTerm ) retur
220a0 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74  n 0; /* X is not
220b0 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a   a subset of Y *
220c0 2f 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e  /.  if( pX->rRun
220d0 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a   >= pY->rRun ){.
220e0 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e      if( pX->rRun
220f0 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65   > pY->rRun ) re
22100 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
22110 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
22120 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d  Y */.    if( pX-
22130 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74  >nOut > pY->nOut
22140 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
22150 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20  /* X costs more 
22160 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  than Y */.  }.  
22170 66 6f 72 28 6a 3d 30 2c 20 69 3d 70 58 2d 3e 6e  for(j=0, i=pX->n
22180 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  LTerm-1; i>=0; i
22190 2d 2d 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 70  --){.    for(j=p
221a0 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d  Y->nLTerm-1; j>=
221b0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69  0; j--){.      i
221c0 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  f( pY->aLTerm[j]
221d0 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  ==pX->aLTerm[i] 
221e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
221f0 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74     if( j<0 ) ret
22200 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74  urn 0;  /* X not
22210 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73   a subset of Y s
22220 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e  ince term X[i] n
22230 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a  ot used by Y */.
22240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20    }.  return 1; 
22250 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f   /* All conditio
22260 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a  ns meet */.}../*
22270 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73  .** Try to adjus
22280 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68  t the cost of Wh
22290 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74  ereLoop pTemplat
222a0 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77  e upwards or dow
222b0 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61  nwards so.** tha
222c0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70  t:.**.**   (1) p
222d0 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c  Template costs l
222e0 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68  ess than any oth
222f0 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68  er WhereLoops th
22300 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a  at are a proper.
22310 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74 20  **       subset 
22320 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a  of pTemplate.**.
22330 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61  **   (2) pTempla
22340 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68  te costs more th
22350 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
22360 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63  reLoops for whic
22370 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20  h pTemplate.**  
22380 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65 72       is a proper
22390 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   subset..**.** T
223a0 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70  o say "WhereLoop
223b0 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73   X is a proper s
223c0 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e  ubset of Y" mean
223d0 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  s that X uses fe
223e0 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  wer.** WHERE cla
223f0 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59  use terms than Y
22400 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
22410 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
22420 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a  m used by X is.*
22430 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59  * also used by Y
22440 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22450 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74   whereLoopAdjust
22460 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65  Cost(const Where
22470 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f  Loop *p, WhereLo
22480 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a  op *pTemplate){.
22490 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65    if( (pTemplate
224a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
224b0 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20  E_INDEXED)==0 ) 
224c0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70  return;.  if( (p
224d0 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67  Template->wsFlag
224e0 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
224f0 41 4e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b  AN)!=0 ) return;
22500 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d  .  for(; p; p=p-
22510 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
22520 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
22530 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20  emplate->iTab ) 
22540 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
22550 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
22560 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
22570 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
22580 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
22590 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
225a0 41 4e 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  AN)!=0 ) continu
225b0 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  e;.    if( where
225c0 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
225d0 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70  rSubset(p, pTemp
225e0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  late) ){.      /
225f0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
22600 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64  te cost downward
22610 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63   so that it is c
22620 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20  heaper than its 
22630 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74  .      ** subset
22640 20 70 20 2a 2f 0a 20 20 20 20 20 20 70 54 65 6d   p */.      pTem
22650 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
22660 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
22670 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
22680 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20  ->nOut - 1;.    
22690 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c  }else if( whereL
226a0 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
226b0 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65  Subset(pTemplate
226c0 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  , p) ){.      /*
226d0 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74   Adjust pTemplat
226e0 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f  e cost upward so
226f0 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74   that it is cost
22700 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63  lier than p sinc
22710 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70  e.      ** pTemp
22720 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72  late is a proper
22730 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a   subset of p */.
22740 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
22750 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
22760 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
22770 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
22780 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
22790 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
227a0 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
227b0 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65  eLoops in *ppPre
227c0 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e  v looking for on
227d0 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a  e that can be.**
227e0 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70   supplanted by p
227f0 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  Template..**.** 
22800 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
22810 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73  he WhereLoop lis
22820 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e  t contains an en
22830 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70  try that can sup
22840 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61  plant.** pTempla
22850 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  te, in other wor
22860 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20  ds if pTemplate 
22870 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
22880 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a  on the list..**.
22890 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68  ** If pX is a Wh
228a0 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65  ereLoop that pTe
228b0 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c  mplate can suppl
228c0 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ant, then return
228d0 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61   the.** link tha
228e0 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a  t points to pX..
228f0 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61  **.** If pTempla
22900 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61  te cannot suppla
22910 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  nt any existing 
22920 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
22930 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a  ist but needs.**
22940 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
22950 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72  the list, then r
22960 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22970 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  to the tail of t
22980 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
22990 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77  ic WhereLoop **w
229a0 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
229b0 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  er(.  WhereLoop 
229c0 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73  **ppPrev,.  cons
229d0 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  t WhereLoop *pTe
229e0 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72  mplate.){.  Wher
229f0 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28  eLoop *p;.  for(
22a00 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20  p=(*ppPrev); p; 
22a10 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
22a20 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
22a30 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
22a40 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
22a50 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
22a60 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
22a70 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ortIdx ){.      
22a80 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  /* If either the
22a90 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64   iTab or iSortId
22aa0 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f  x values for two
22ab0 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64   WhereLoop are d
22ac0 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a  ifferent.      *
22ad0 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65  * then those Whe
22ae0 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20  reLoops need to 
22af0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65  be considered se
22b00 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68  parately.  Neith
22b10 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  er is.      ** a
22b20 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65   candidate to re
22b30 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e  place the other.
22b40 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
22b50 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ue;.    }.    /*
22b60 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
22b70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
22b80 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65  the rSetup value
22b90 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a   is either zero.
22ba0 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f      ** or the co
22bb0 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61  st of building a
22bc0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
22bd0 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68  x (NlogN) and th
22be0 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69  e NlogN.    ** i
22bf0 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63  s the same for c
22c00 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c  ompatible WhereL
22c10 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  oops. */.    ass
22c20 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
22c30 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  0 || pTemplate->
22c40 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20  rSetup==0 .     
22c50 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
22c60 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
22c70 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
22c80 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70      /* whereLoop
22c90 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79  AddBtree() alway
22ca0 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20  s generates and 
22cb0 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f  inserts the auto
22cc0 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20  matic index.    
22cd0 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20  ** case first.  
22ce0 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65  Hence compatible
22cf0 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65   candidate Where
22d00 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65  Loops never have
22d10 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a   a larger.    **
22d20 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68   rSetup. Call th
22d30 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  is SETUP-INVARIA
22d40 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  NT */.    assert
22d50 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
22d60 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
22d70 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78 69  ;..    /* If exi
22d80 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
22d90 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  p is better than
22da0 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d   pTemplate, pTem
22db0 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20 20  plate can be.   
22dc0 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20   ** discarded.  
22dd0 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
22de0 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a  etter if:.    **
22df0 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e 6f     (1)  p has no
22e00 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 69   more dependenci
22e10 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  es than pTemplat
22e20 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  e, and.    **   
22e30 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65 71  (2)  p has an eq
22e40 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
22e50 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  t than pTemplate
22e60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22e70 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
22e80 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
22e90 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f 2a  =p->prereq    /*
22ea0 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
22eb0 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d   p->rSetup<=pTem
22ec0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20 20  plate->rSetup   
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ee0 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
22ef0 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70  & p->rRun<=pTemp
22f00 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20  late->rRun      
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 20  /* (2b) */.     
22f30 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d  && p->nOut<=pTem
22f40 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20 20   /* (2c) */.    
22f70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22f80 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20 70  0;  /* Discard p
22f90 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
22fa0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 65  }..    /* If pTe
22fb0 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79 73  mplate is always
22fc0 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c 20   better than p, 
22fd0 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f 20  then cause p to 
22fe0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
22ff0 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70     ** with pTemp
23000 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74 65  late.  pTemplate
23010 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20   is better than 
23020 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28  p if:.    **   (
23030 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68 61  1)  pTemplate ha
23040 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64  s no more depend
23050 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61 6e  ences than p, an
23060 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20  d.    **   (2)  
23070 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61 6e  pTemplate has an
23080 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20   equal or lower 
23090 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20 20  cost than p..   
230a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
230b0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
230c0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
230d0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20 20  mplate->prereq  
230e0 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20   /* (1)  */.    
230f0 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65   && p->rRun>=pTe
23100 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20  mplate->rRun    
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23120 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
23130 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e   */.     && p->n
23140 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out>=pTemplate->
23150 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23170 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
23180 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23190 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
231a0 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
231b0 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52 49   /* SETUP-INVARI
231c0 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  ANT above */.   
231d0 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43     break;   /* C
231e0 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
231f0 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65 6d  rwritten by pTem
23200 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20  plate */.    }. 
23210 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50 72   }.  return ppPr
23220 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  ev;.}../*.** Ins
23230 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
23240 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
23250 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
23260 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
23270 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
23280 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
23290 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
232a0 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
232b0 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
232c0 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
232d0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
232e0 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
232f0 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
23300 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
23310 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
23320 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
23330 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
23340 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
23350 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
23360 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
23370 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
23380 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
23390 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
233a0 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
233b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
233c0 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f  er->pOrSet is no
233d0 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 63  t NULL then we c
233e0 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74  are about only t
233f0 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73 69  he.** prerequisi
23400 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e 64  tes and rRun and
23410 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20 74   nOut costs of t
23420 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e  he N best loops.
23430 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d    That.** inform
23440 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72 65  ation is gathere
23450 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64 65  d in the pBuilde
23460 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63 74  r->pOrSet object
23470 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c 0a  .  This special.
23480 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f  ** processing mo
23490 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  de is used only 
234a0 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
234b0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
234c0 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e  When accumulatin
234d0 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73  g multiple loops
234e0 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d   (when pBuilder-
234f0 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c 29  >pOrSet is NULL)
23500 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67   we.** still mig
23510 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d  ht overwrite sim
23520 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20  ilar loops with 
23530 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
23540 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74   if the.** new t
23550 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
23560 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65  r.  Loops may be
23570 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
23580 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
23590 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65  * conditions are
235a0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28   met:.**.**    (
235b0 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  1)  They have th
235c0 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20  e same iTab..** 
235d0 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76     (2)  They hav
235e0 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74  e the same iSort
235f0 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20  Idx..**    (3)  
23600 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
23610 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64   same or fewer d
23620 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
23630 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
23640 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65  p.**    (4)  The
23650 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68   template has th
23660 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
23670 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75  cost than the cu
23680 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74  rrent loop.*/.st
23690 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
236a0 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c 6f  opInsert(WhereLo
236b0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
236c0 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  der, WhereLoop *
236d0 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68  pTemplate){.  Wh
236e0 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76  ereLoop **ppPrev
236f0 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e 66  , *p;.  WhereInf
23700 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
23710 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
23720 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
23730 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
23740 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
23750 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
23760 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
23770 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
23780 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
23790 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
237a0 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
237b0 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 23 69  >pOrSet!=0 ){.#i
237c0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
237d0 42 4c 45 44 0a 20 20 20 20 75 31 36 20 6e 20 3d  BLED.    u16 n =
237e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
237f0 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  t->n;.    int x 
23800 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65  =.#endif.    whe
23810 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c  reOrInsert(pBuil
23820 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65  der->pOrSet, pTe
23830 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20  mplate->prereq, 
23840 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
23850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23870 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
23880 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45  nOut);.#if WHERE
23890 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
238a0 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20   0x8 */.    if( 
238b0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
238c0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
238d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
238e0 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a  ntf(x?"   or-%d:
238f0 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22    ":"   or-X:  "
23900 2c 20 6e 29 3b 0a 20 20 20 20 20 20 77 68 65 72  , n);.      wher
23910 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
23920 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
23930 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
23940 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
23950 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
23960 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  /* Look for an e
23970 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
23980 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74  p to replace wit
23990 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f  h pTemplate.  */
239a0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75  .  whereLoopAdju
239b0 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70  stCost(pWInfo->p
239c0 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
239d0 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68  );.  ppPrev = wh
239e0 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
239f0 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r(&pWInfo->pLoop
23a00 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a  s, pTemplate);..
23a10 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20    if( ppPrev==0 
23a20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
23a30 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
23a40 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68   WhereLoop on th
23a50 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 62  e list that is b
23a60 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  etter.    ** tha
23a70 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20  n pTemplate, so 
23a80 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d  just ignore pTem
23a90 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45  plate */.#if WHE
23aa0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
23ab0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
23ac0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
23ad0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
23ae0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23af0 72 69 6e 74 66 28 22 69 6e 73 2d 6e 6f 6f 70 3a  rintf("ins-noop:
23b00 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
23b10 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
23b20 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
23b30 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
23b40 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
23b50 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73  ITE_OK;  .  }els
23b60 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72  e{.    p = *ppPr
23b70 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ev;.  }..  /* If
23b80 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
23b90 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
23ba0 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
23bb0 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
23bc0 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
23bd0 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
23be0 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
23bf0 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
23c00 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
23c10 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
23c20 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
23c30 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
23c40 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
23c50 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
23c60 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
23c70 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
23c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
23c90 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65  ugPrintf("ins-de
23ca0 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68  l:  ");.      wh
23cb0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
23cc0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
23cd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23ce0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e  3DebugPrintf("in
23cf0 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20 20 20  s-new:  ");.    
23d00 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
23d10 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
23d20 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65  er->pWC);.  }.#e
23d30 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20  ndif.  if( p==0 
23d40 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ){.    /* Alloca
23d50 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  te a new WhereLo
23d60 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  op to add to the
23d70 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74   end of the list
23d80 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20   */.    *ppPrev 
23d90 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  = p = sqlite3DbM
23da0 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
23db0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
23dc0 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
23dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
23de0 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  MEM;.    whereLo
23df0 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70  opInit(p);.    p
23e00 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b  ->pNextLoop = 0;
23e10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
23e20 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72   We will be over
23e30 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  writing WhereLoo
23e40 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f  p p[].  But befo
23e50 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a  re we do, first.
23e60 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67      ** go throug
23e70 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
23e80 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74  e list and delet
23e90 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72  e any other entr
23ea0 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20  ies besides.    
23eb0 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20  ** p[] that are 
23ec0 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62  also supplated b
23ed0 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
23ee0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70     WhereLoop **p
23ef0 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78  pTail = &p->pNex
23f00 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65  tLoop;.    Where
23f10 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20  Loop *pToDel;.  
23f20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c    while( *ppTail
23f30 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c   ){.      ppTail
23f40 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
23f50 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70  Lesser(ppTail, p
23f60 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20  Template);.     
23f70 20 69 66 28 20 4e 45 56 45 52 28 70 70 54 61 69   if( NEVER(ppTai
23f80 6c 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  l==0) ) break;. 
23f90 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70       pToDel = *p
23fa0 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28  pTail;.      if(
23fb0 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65   pToDel==0 ) bre
23fc0 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69  ak;.      *ppTai
23fd0 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78  l = pToDel->pNex
23fe0 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45  tLoop;.#if WHERE
23ff0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
24000 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66   0x8 */.      if
24010 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
24020 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
24030 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24040 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65 6c  gPrintf("ins-del
24050 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68  : ");.        wh
24060 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f  ereLoopPrint(pTo
24070 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Del, pBuilder->p
24080 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
24090 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c  dif.      whereL
240a0 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54  oopDelete(db, pT
240b0 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oDel);.    }.  }
240c0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  .  whereLoopXfer
240d0 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74  (db, p, pTemplat
240e0 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
240f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
24100 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
24110 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
24120 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  dex = p->u.btree
24130 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
24140 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65   pIndex && pInde
24150 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  x->tnum==0 ){.  
24160 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
24170 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
24180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24190 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
241a0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
241b0 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
241c0 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
241d0 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
241e0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
241f0 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
24200 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
24210 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
24220 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
24230 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ndex..**.** In t
24240 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
24250 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 66  mentation, the f
24260 69 72 73 74 20 65 78 74 72 61 20 57 48 45 52 45  irst extra WHERE
24270 20 63 6c 61 75 73 65 20 74 65 72 6d 20 72 65 64   clause term red
24280 75 63 65 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  uces.** the numb
24290 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
242a0 73 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  s by a factor of
242b0 20 31 30 20 61 6e 64 20 65 61 63 68 20 61 64 64   10 and each add
242c0 69 74 69 6f 6e 61 6c 20 74 65 72 6d 0a 2a 2a 20  itional term.** 
242d0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
242e0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
242f0 73 20 62 79 20 73 71 72 74 28 32 29 2e 0a 2a 2f  s by sqrt(2)..*/
24300 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
24310 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
24320 73 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  st(WhereClause *
24330 70 57 43 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pWC, WhereLoop *
24340 70 4c 6f 6f 70 29 7b 0a 20 20 57 68 65 72 65 54  pLoop){.  WhereT
24350 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b  erm *pTerm, *pX;
24360 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c  .  Bitmask notAl
24370 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d  lowed = ~(pLoop-
24380 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d  >prereq|pLoop->m
24390 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20  askSelf);.  int 
243a0 69 2c 20 6a 3b 0a 0a 20 20 69 66 28 20 21 4f 70  i, j;..  if( !Op
243b0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
243c0 64 28 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  d(pWC->pWInfo->p
243d0 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
243e0 45 5f 41 64 6a 75 73 74 4f 75 74 45 73 74 29 20  E_AdjustOutEst) 
243f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
24400 20 7d 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e   }.  for(i=pWC->
24410 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43  nTerm, pTerm=pWC
24420 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
24430 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
24440 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
24450 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
24460 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
24470 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
24480 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
24490 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63  maskSelf)==0 ) c
244a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
244b0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
244c0 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29  ll & notAllowed)
244d0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
244e0 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d      for(j=pLoop-
244f0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
24500 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20   j--){.      pX 
24510 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
24520 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  j];.      if( pX
24530 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
24540 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54        if( pX==pT
24550 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  erm ) break;.   
24560 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65     if( pX->iPare
24570 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e  nt>=0 && (&pWC->
24580 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d  a[pX->iParent])=
24590 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
245a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
245b0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  0 ){.      pLoop
245c0 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 54 65 72 6d  ->nOut += (pTerm
245d0 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 3f  ->truthProb<=0 ?
245e0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
245f0 62 20 3a 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  b : -1);.    }. 
24600 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68   }.}../*.** We h
24610 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68  ave so far match
24620 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ed pBuilder->pNe
24630 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74  w->u.btree.nEq t
24640 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
24650 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79  x pIndex..** Try
24660 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f   to match one mo
24670 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72  re..**.** If pPr
24680 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68  obe->tnum==0, th
24690 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20  at means pIndex 
246a0 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20  is a fake index 
246b0 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  used for the.** 
246c0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
246d0 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  KEY..*/.static i
246e0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
246f0 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65  treeIndex(.  Whe
24700 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
24710 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20  Builder,     /* 
24720 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61  The WhereLoop fa
24730 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  ctory */.  struc
24740 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24750 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52  pSrc,      /* FR
24760 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
24770 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
24780 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
24790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
247a0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f     /* An index o
247b0 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45  n pSrc */.  LogE
247c0 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20  st nInMul       
247d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
247e0 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65  og(Number of ite
247f0 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49  rations due to I
24800 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  N) */.){.  Where
24810 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
24820 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
24830 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
24840 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
24850 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
24860 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20  pWInfo->pParse; 
24870 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
24880 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
24890 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
248a0 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  rse->db;       /
248b0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
248c0 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e  ction malloc con
248d0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
248e0 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  oop *pNew;      
248f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
24900 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
24910 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
24920 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
24930 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
24940 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65          /* A Whe
24950 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e  reTerm under con
24960 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
24970 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20  int opMask;     
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24990 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f  /* Valid operato
249a0 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  rs for constrain
249b0 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61  ts */.  WhereSca
249c0 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20  n scan;         
249d0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
249e0 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65  tor for WHERE te
249f0 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
24a00 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20   saved_prereq;  
24a10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
24a20 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
24a30 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20  ew->prereq */.  
24a40 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  u16 saved_nLTerm
24a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24a60 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
24a70 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  e of pNew->nLTer
24a80 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  m */.  u16 saved
24a90 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  _nEq;           
24aa0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
24ab0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
24ac0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f  ->u.btree.nEq */
24ad0 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b  .  u16 saved_nSk
24ae0 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
24af0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
24b00 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e  alue of pNew->u.
24b10 62 74 72 65 65 2e 6e 53 6b 69 70 20 2a 2f 0a 20  btree.nSkip */. 
24b20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61   u32 saved_wsFla
24b30 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
24b40 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
24b50 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c  ue of pNew->wsFl
24b60 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ags */.  LogEst 
24b70 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20  saved_nOut;     
24b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
24b90 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
24ba0 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e  ew->nOut */.  in
24bb0 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24bd0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
24be0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
24bf0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
24c00 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
24c10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
24c20 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73   code */.  LogEs
24c30 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20  t rLogSize;     
24c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
24c50 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65  garithm of table
24c60 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65   size */.  Where
24c70 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20  Term *pTop = 0, 
24c80 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f  *pBtm = 0; /* To
24c90 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e  p and bottom ran
24ca0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ge constraints *
24cb0 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  /..  pNew = pBui
24cc0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66  lder->pNew;.  if
24cd0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
24ce0 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
24cf0 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73  TE_NOMEM;..  ass
24d00 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
24d10 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
24d20 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
24d30 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
24d40 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
24d50 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29  _TOP_LIMIT)==0 )
24d60 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73  ;.  if( pNew->ws
24d70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
24d80 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f  M_LIMIT ){.    o
24d90 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f  pMask = WO_LT|WO
24da0 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _LE;.  }else if(
24db0 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
24dc0 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74   || (pSrc->joint
24dd0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
24de0 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  0 ){.    opMask 
24df0 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
24e00 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
24e10 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_LE;.  }else{.
24e20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
24e30 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
24e40 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LL|WO_GT|WO_GE|W
24e50 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a  O_LT|WO_LE;.  }.
24e60 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
24e70 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
24e80 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
24e90 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
24ea0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
24eb0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
24ec0 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Probe->nKeyCol )
24ed0 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e  ;.  if( pNew->u.
24ee0 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f  btree.nEq < pPro
24ef0 62 65 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  be->nKeyCol ){. 
24f00 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65     iCol = pProbe
24f10 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d  ->aiColumn[pNew-
24f20 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20  >u.btree.nEq];. 
24f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c   }else{.    iCol
24f40 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 54 65   = -1;.  }.  pTe
24f50 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
24f60 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
24f70 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
24f80 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20  Cursor, iCol,.  
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fa0 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
24fb0 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e  robe);.  saved_n
24fc0 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  Eq = pNew->u.btr
24fd0 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f  ee.nEq;.  saved_
24fe0 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 75 2e  nSkip = pNew->u.
24ff0 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 73  btree.nSkip;.  s
25000 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
25010 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
25020 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
25030 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
25040 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
25050 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
25060 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
25070 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72  >nOut;.  pNew->r
25080 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f  Setup = 0;.  rLo
25090 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 70  gSize = estLog(p
250a0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
250b0 73 74 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 43 6f  st[0]);..  /* Co
250c0 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20 73  nsider using a s
250d0 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72  kip-scan if ther
250e0 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
250f0 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
25100 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
25110 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f   for the left-mo
25120 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  st terms of the 
25130 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68  index, and if th
25140 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e  e average.  ** n
25150 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74 73  umber of repeats
25160 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   in the left-mos
25170 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65  t terms is at le
25180 61 73 74 20 31 38 2e 20 20 54 68 65 20 6d 61 67  ast 18.  The mag
25190 69 63 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 31  ic.  ** number 1
251a0 38 20 77 61 73 20 66 6f 75 6e 64 20 62 79 20 65  8 was found by e
251b0 78 70 65 72 69 6d 65 6e 74 61 74 69 6f 6e 20 74  xperimentation t
251c0 6f 20 62 65 20 74 68 65 20 70 61 79 6f 66 66 20  o be the payoff 
251d0 70 6f 69 6e 74 20 77 68 65 72 65 0a 20 20 2a 2a  point where.  **
251e0 20 73 6b 69 70 2d 73 63 61 6e 20 62 65 63 6f 6d   skip-scan becom
251f0 65 20 66 61 73 74 65 72 20 74 68 61 6e 20 61 20  e faster than a 
25200 66 75 6c 6c 2d 73 63 61 6e 2e 0a 20 20 2a 2f 0a  full-scan..  */.
25210 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71    assert( 42==sq
25220 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20  lite3LogEst(18) 
25230 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d  );.  if( pTerm==
25240 30 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  0.   && saved_nE
25250 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20  q==saved_nSkip. 
25260 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31    && saved_nEq+1
25270 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  <pProbe->nKeyCol
25280 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61  .   && pProbe->a
25290 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
252a0 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20  _nEq+1]>=42  /* 
252b0 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20  TUNING: Minimum 
252c0 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f  for skip-scan */
252d0 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65  .   && (rc = whe
252e0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
252f0 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
25300 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f  erm+1))==SQLITE_
25310 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45  OK.  ){.    LogE
25320 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e  st nIter;.    pN
25330 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
25340 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  +;.    pNew->u.b
25350 74 72 65 65 2e 6e 53 6b 69 70 2b 2b 3b 0a 20 20  tree.nSkip++;.  
25360 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
25370 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
25380 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73   0;.    pNew->ws
25390 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53  Flags |= WHERE_S
253a0 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74  KIPSCAN;.    nIt
253b0 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  er = pProbe->aiR
253c0 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e  owLogEst[saved_n
253d0 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69  Eq] - pProbe->ai
253e0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
253f0 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77  nEq+1];.    pNew
25400 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b  ->nOut -= nIter;
25410 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  .    whereLoopAd
25420 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
25430 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
25440 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d  be, nIter + nInM
25450 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  ul);.    pNew->n
25460 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
25470 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 72 63  ;.  }.  for(; rc
25480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
25490 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d  Term!=0; pTerm =
254a0 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
254b0 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20  scan)){.    u16 
254c0 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70  eOp = pTerm->eOp
254d0 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f  erator;   /* Sho
254e0 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d  rthand for pTerm
254f0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
25500 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49     LogEst rCostI
25510 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e  dx;.    LogEst n
25520 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20  OutUnadjusted;  
25530 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65        /* nOut be
25540 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48  fore IN() and WH
25550 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ERE adjustments 
25560 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  */.    int nIn =
25570 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
25580 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
25590 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20  R_STAT4.    int 
255a0 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
255b0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
255c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
255d0 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  (eOp==WO_ISNULL 
255e0 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  || (pTerm->wtFla
255f0 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d  gs&TERM_VNULL)!=
25600 30 29 0a 20 20 20 20 20 26 26 20 28 69 43 6f 6c  0).     && (iCol
25610 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54 61 62  <0 || pSrc->pTab
25620 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74  ->aCol[iCol].not
25630 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20  Null).    ){.   
25640 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
25650 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
25660 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
25670 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
25680 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
25690 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
256a0 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
256b0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
256c0 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d  inue;..    pNew-
256d0 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
256e0 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e  _wsFlags;.    pN
256f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
25700 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20  = saved_nEq;.   
25710 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
25720 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
25730 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
25740 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
25750 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
25760 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
25770 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  */.    pNew->aLT
25780 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
25790 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
257a0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
257b0 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20  (saved_prereq | 
257c0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
257d0 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
257e0 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65  kSelf;..    asse
257f0 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20  rt( nInMul==0.  
25800 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
25810 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25820 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20  COLUMN_NULL)!=0 
25830 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
25840 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
25850 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30  RE_COLUMN_IN)!=0
25860 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
25870 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
25880 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30  ERE_SKIPSCAN)!=0
25890 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66   .    );..    if
258a0 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b  ( eOp & WO_IN ){
258b0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
258c0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
258d0 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  r;.      pNew->w
258e0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
258f0 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
25900 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
25910 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
25920 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
25930 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
25940 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
25950 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
25960 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
25970 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
25980 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
25990 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
259a0 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65  (25) );.      }e
259b0 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
259c0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
259d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
259e0 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
259f0 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
25a00 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
25a10 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
25a20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
25a30 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
25a40 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  nExpr);.      }.
25a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 49        assert( nI
25a60 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61  n>0 );  /* RHS a
25a70 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d  lways has 2 or m
25a80 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68  ore terms...  Th
25a90 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20 20  e parser.       
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ab0 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49   ** changes "x I
25ac0 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f  N (?)" into "x=?
25ad0 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65  ". */..    }else
25ae0 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45   if( eOp & (WO_E
25af0 51 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  Q) ){.      pNew
25b00 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
25b10 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
25b20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c      if( iCol<0 |
25b30 7c 20 28 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20  | (nInMul==0 && 
25b40 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
25b50 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  q==pProbe->nKeyC
25b60 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol-1) ){.       
25b70 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
25b80 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d  pProbe->onError=
25b90 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
25ba0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
25bb0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51  ags |= WHERE_UNQ
25bc0 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20  _WANTED;.       
25bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25be0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
25bf0 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
25c00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25c10 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
25c20 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
25c30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
25c40 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
25c50 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20  _COLUMN_NULL;.  
25c60 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20    }else if( eOp 
25c70 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20  & (WO_GT|WO_GE) 
25c80 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
25c90 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29  e( eOp & WO_GT )
25ca0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
25cb0 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b  ( eOp & WO_GE );
25cc0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
25cd0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
25ce0 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
25cf0 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
25d00 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a    pBtm = pTerm;.
25d10 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a        pTop = 0;.
25d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25d30 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
25d40 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
25d50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25d60 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  eOp & WO_LT );. 
25d70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
25d80 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  Op & WO_LE );.  
25d90 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
25da0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
25db0 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
25dc0 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
25dd0 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
25de0 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
25df0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25e00 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
25e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25e20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
25e30 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
25e40 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
25e50 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
25e60 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
25e70 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
25e80 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
25e90 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
25ea0 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
25eb0 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
25ec0 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
25ed0 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
25ee0 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
25ef0 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
25f00 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
25f10 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
25f20 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
25f30 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
25f40 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
25f50 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
25f60 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
25f70 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
25f80 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
25f90 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
25fa0 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
25fb0 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
25fc0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
25fd0 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
25fe0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
25ff0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
26000 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
26010 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
26020 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
26030 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
26040 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
26050 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
26060 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
26070 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
26080 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
26090 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
260a0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
260b0 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
260c0 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
260d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
260e0 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
260f0 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
26100 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
26110 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
26120 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ) );..      asse
26130 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d  rt( pNew->nOut==
26140 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20  saved_nOut );.  
26150 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
26160 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
26170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
26180 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20  eOp & WO_IN) || 
26190 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nIn==0 );.      
261a0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
261b0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
261c0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
261d0 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
261e0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
261f0 67 73 20 7c 3d 20 57 48 45 52 45 5f 4c 49 4b 45  gs |= WHERE_LIKE
26200 4c 49 48 4f 4f 44 3b 0a 20 20 20 20 20 20 7d 65  LIHOOD;.      }e
26210 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
26220 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
26230 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20  OR_STAT4.       
26240 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20   tRowcnt nOut = 
26250 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  0;.        if( n
26260 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20  InMul==0 .      
26270 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53     && pProbe->nS
26280 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
26290 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
262a0 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53  .nEq<=pProbe->nS
262b0 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20  ampleCol.       
262c0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
262d0 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
262e0 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 20 20  ITE_Stat3) .    
262f0 20 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20       && ((eOp & 
26300 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78  WO_IN)==0 || !Ex
26310 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
26320 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  erm->pExpr, EP_x
26330 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20  IsSelect)).     
26340 20 20 20 20 26 26 20 28 70 4e 65 77 2d 3e 77 73      && (pNew->ws
26350 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4c 49  Flags & WHERE_LI
26360 4b 45 4c 49 48 4f 4f 44 29 3d 3d 30 0a 20 20 20  KELIHOOD)==0.   
26370 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26380 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
26390 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
263a0 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
263b0 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
263c0 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ULL))!=0 ){.    
263d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
263e0 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b  ( eOp & WO_EQ );
263f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
26400 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
26410 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
26420 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
26430 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
26440 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
26450 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
26460 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
26470 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26480 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53     rc = whereInS
26490 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
264a0 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
264b0 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b  x.pList, &nOut);
264c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
264d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
264e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
264f0 6e 4f 75 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  nOut>0 );.      
26500 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26510 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63  TE_NOTFOUND ) rc
26520 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26530 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26540 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
26550 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  k;          /* J
26560 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70  ump out of the p
26570 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  Term loop */.   
26580 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20         if( nOut 
26590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
265a0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69  New->nOut = sqli
265b0 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b  te3LogEst(nOut);
265c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
265d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65   pNew->nOut>save
265e0 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e  d_nOut ) pNew->n
265f0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
26600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  ;.            pN
26610 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
26620 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
26640 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e  f( nOut==0 ).#en
26650 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
26660 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
26670 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61  ut += (pProbe->a
26680 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20  iRowLogEst[nEq] 
26690 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  - pProbe->aiRowL
266a0 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20  ogEst[nEq-1]);. 
266b0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70           if( eOp
266c0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
266d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
266e0 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
266f0 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64  is no likelihood
26700 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65  () value, assume
26710 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 20   that a .       
26720 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20       ** "col IS 
26730 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e  NULL" expression
26740 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20 61   matches twice a
26750 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20  s many rows .   
26760 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28           ** as (
26770 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20  col=?). */.     
26780 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
26790 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20  t += 10;.       
267a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
267b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
267c0 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64    /* Set rCostId
267d0 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66  x to the cost of
267e0 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74   visiting select
267f0 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78  ed rows in index
26800 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20  . Add.    ** it 
26810 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77  to pNew->rRun, w
26820 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c  hich is currentl
26830 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73  y set to the cos
26840 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20  t of the index. 
26850 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e     ** seek only.
26860 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69   Then, if this i
26870 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  s a non-covering
26880 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20   index, add the 
26890 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76  cost of.    ** v
268a0 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73  isiting the rows
268b0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
268c0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73  le.  */.    rCos
268d0 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  tIdx = pNew->nOu
268e0 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f  t + 1 + (15*pPro
268f0 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53  be->szIdxRow)/pS
26900 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52  rc->pTab->szTabR
26910 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52  ow;.    pNew->rR
26920 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
26930 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20  stAdd(rLogSize, 
26940 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69  rCostIdx);.    i
26950 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
26960 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
26970 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d  NLY|WHERE_IPK))=
26980 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  =0 ){.      pNew
26990 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
269a0 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
269b0 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74  rRun, pNew->nOut
269c0 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 0a 20   + 16);.    }.. 
269d0 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65     nOutUnadjuste
269e0 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  d = pNew->nOut;.
269f0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b      pNew->rRun +
26a00 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
26a10 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
26a20 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  = nInMul + nIn;.
26a30 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
26a40 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64  putAdjust(pBuild
26a50 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 29 3b 0a  er->pWC, pNew);.
26a60 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
26a70 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
26a80 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69  r, pNew);..    i
26a90 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
26aa0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
26ab0 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 70  RANGE ){.      p
26ac0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
26ad0 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  d_nOut;.    }els
26ae0 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  e{.      pNew->n
26af0 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75  Out = nOutUnadju
26b00 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  sted;.    }..   
26b10 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
26b20 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
26b30 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26  LIMIT)==0.     &
26b40 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
26b50 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq<(pProbe->nKe
26b60 79 43 6f 6c 20 2b 20 28 70 50 72 6f 62 65 2d 3e  yCol + (pProbe->
26b70 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29  zName!=0)).    )
26b80 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
26b90 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
26ba0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
26bb0 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49  Probe, nInMul+nI
26bc0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  n);.    }.    pN
26bd0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
26be0 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51  _nOut;.#ifdef SQ
26bf0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
26c00 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70  3_OR_STAT4.    p
26c10 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
26c20 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
26c30 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65  #endif.  }.  pNe
26c40 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65  w->prereq = save
26c50 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77  d_prereq;.  pNew
26c60 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
26c70 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65  saved_nEq;.  pNe
26c80 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70  w->u.btree.nSkip
26c90 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a   = saved_nSkip;.
26ca0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
26cb0 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
26cc0 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20  .  pNew->nOut = 
26cd0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e  saved_nOut;.  pN
26ce0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
26cf0 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74  ed_nLTerm;.  ret
26d00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26d10 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   Return True if 
26d20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
26d30 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74  hat pIndex might
26d40 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a   be useful in.**
26d50 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
26d60 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
26d70 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a  e in pBuilder..*
26d80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73  *.** Return Fals
26d90 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f  e if pBuilder do
26da0 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
26db0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
26dc0 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  e or.** if there
26dd0 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70   is no way for p
26de0 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66  Index to be usef
26df0 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69  ul in implementi
26e00 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52  ng that.** ORDER
26e10 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73   BY clause..*/.s
26e20 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d  tatic int indexM
26e30 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
26e40 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  rBy(.  WhereLoop
26e50 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
26e60 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  r,.  Index *pInd
26e70 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f  ex,.  int iCurso
26e80 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  r.){.  ExprList 
26e90 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20  *pOB;.  int ii, 
26ea0 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65  jj;..  if( pInde
26eb0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  x->bUnordered ) 
26ec0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
26ed0 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d  (pOB = pBuilder-
26ee0 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  >pWInfo->pOrderB
26ef0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)==0 ) return 0
26f00 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
26f10 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  <pOB->nExpr; ii+
26f20 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
26f30 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
26f40 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42  rSkipCollate(pOB
26f50 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a  ->a[ii].pExpr);.
26f60 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
26f70 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
26f80 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
26f90 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
26fa0 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
26fb0 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
26fc0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
26fd0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
26fe0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
26ff0 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
27000 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
27010 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
27020 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
27030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27040 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65   a bitmask where
27050 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61   1s indicate tha
27060 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
27070 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  ing column of.**
27080 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73   the table is us
27090 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20  ed by an index. 
270a0 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
270b0 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63  63 columns are c
270c0 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74  onsidered..*/.st
270d0 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c  atic Bitmask col
270e0 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65  umnsInIndex(Inde
270f0 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d  x *pIdx){.  Bitm
27100 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74  ask m = 0;.  int
27110 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78   j;.  for(j=pIdx
27120 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d  ->nColumn-1; j>=
27130 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; j--){.    int
27140 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
27150 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
27160 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  x>=0 ){.      te
27170 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
27180 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
27190 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a  se( x==BMS-2 );.
271a0 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
271b0 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54  1 ) m |= MASKBIT
271c0 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (x);.    }.  }. 
271d0 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
271e0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
271f0 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
27200 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65 78   with pPartIndex
27210 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73 65  Where can be use
27220 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  d.** in the curr
27230 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74 75  ent query.  Retu
27240 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61  rn true if it ca
27250 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69  n be and false i
27260 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
27270 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65   int whereUsable
27280 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74  PartialIndex(int
27290 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75   iTab, WhereClau
272a0 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
272b0 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Where){.  int i;
272c0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
272d0 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  erm;.  for(i=0, 
272e0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
272f0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
27300 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
27310 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  f( sqlite3ExprIm
27320 70 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d 2d  pliesExpr(pTerm-
27330 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20  >pExpr, pWhere, 
27340 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
27350 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
27360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
27370 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
27380 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ects for a singl
27390 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
273a0 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61  oin where the ta
273b0 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69  ble.** is idenfi
273c0 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
273d0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
273e0 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
273f0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
27400 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
27410 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
27420 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
27430 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
27440 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ree(.  WhereLoop
27450 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
27460 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  r, /* WHERE clau
27470 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
27480 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  /.  Bitmask mExt
27490 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
274a0 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75  /* Extra prerequ
274b0 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67  esites for using
274c0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
274d0 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
274e0 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
274f0 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
27500 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  s context */.  I
27510 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
27520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
27530 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
27540 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
27550 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20  dex sPk;        
27560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
27570 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ake index object
27580 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
27590 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74   key */.  LogEst
275a0 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
275b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52        /* The aiR
275c0 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65  owLogEst[] value
275d0 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
275e0 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f  ex */.  i16 aiCo
275f0 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20  lumnPk = -1;    
27600 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75      /* The aColu
27610 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  mn[] value for t
27620 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
27630 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
27640 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ist;          /*
27650 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
27660 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
27670 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
27680 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
27690 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20  ause btree term 
276a0 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72  to add */.  Wher
276b0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
276c0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
276d0 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ate WhereLoop ob
276e0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
276f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
27700 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27710 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  code */.  int iS
27720 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20  ortIdx = 1;     
27730 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
27740 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  umber */.  int b
27750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27760 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c         /* A bool
27770 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c  ean value */.  L
27780 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
27790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75             /* nu
277a0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
277b0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c  the table */.  L
277c0 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  ogEst rLogSize; 
277d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
277e0 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e  garithm of the n
277f0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
27800 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
27810 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
27820 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
27830 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20  he parsed WHERE 
27840 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c  clause */.  Tabl
27850 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
27860 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
27870 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
27880 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42  /.  .  pNew = pB
27890 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
278a0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
278b0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61  r->pWInfo;.  pTa
278c0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
278d0 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63  pTabList;.  pSrc
278e0 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b   = pTabList->a +
278f0 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70   pNew->iTab;.  p
27900 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
27910 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64  ;.  pWC = pBuild
27920 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72  er->pWC;.  asser
27930 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53  t( !IsVirtual(pS
27940 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20  rc->pTab) );..  
27950 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
27960 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e   ){.    /* An IN
27970 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
27980 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74  specifies a part
27990 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20  icular index to 
279a0 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62  use */.    pProb
279b0 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  e = pSrc->pIndex
279c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 48  ;.  }else if( !H
279d0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
279e0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 54  .    pProbe = pT
279f0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65  ab->pIndex;.  }e
27a00 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
27a10 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20  e is no INDEXED 
27a20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61  BY clause.  Crea
27a30 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20  te a fake Index 
27a40 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a  object in local.
27a50 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
27a60 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sPk to represent
27a70 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61   the rowid prima
27a80 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d  ry key index.  M
27a90 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ake this.    ** 
27aa0 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66  fake index the f
27ab0 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20  irst in a chain 
27ac0 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73  of Index objects
27ad0 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65   with all of the
27ae0 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64   real.    ** ind
27af0 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a  ices to follow *
27b00 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69  /.    Index *pFi
27b10 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
27b20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f        /* First o
27b30 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  f real indices o
27b40 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
27b50 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20     memset(&sPk, 
27b60 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  0, sizeof(Index)
27b70 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43  );.    sPk.nKeyC
27b80 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  ol = 1;.    sPk.
27b90 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f  aiColumn = &aiCo
27ba0 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  lumnPk;.    sPk.
27bb0 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69  aiRowLogEst = ai
27bc0 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
27bd0 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
27be0 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
27bf0 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
27c00 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20     sPk.szIdxRow 
27c10 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  = pTab->szTabRow
27c20 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
27c30 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  [0] = pTab->nRow
27c40 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  LogEst;.    aiRo
27c50 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20  wEstPk[1] = 0;. 
27c60 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
27c70 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
27c80 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f      if( pSrc->no
27c90 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
27ca0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
27cb0 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
27cc0 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
27cd0 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
27ce0 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
27cf0 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
27d00 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
27d10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
27d20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
27d30 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
27d40 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
27d50 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
27d60 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  e = pTab->nRowLo
27d70 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65  gEst;.  rLogSize
27d80 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29   = estLog(rSize)
27d90 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
27da0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
27db0 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f  _INDEX.  /* Auto
27dc0 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f  matic indexes */
27dd0 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72  .  if( !pBuilder
27de0 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26 20 28  ->pOrSet.   && (
27df0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
27e00 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
27e10 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30  TE_AutoIndex)!=0
27e20 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e  .   && pSrc->pIn
27e30 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53  dex==0.   && !pS
27e40 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  rc->viaCoroutine
27e50 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f  .   && !pSrc->no
27e60 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20 48  tIndexed.   && H
27e70 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20  asRowid(pTab).  
27e80 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72   && !pSrc->isCor
27e90 72 65 6c 61 74 65 64 0a 20 20 20 26 26 20 21 70  related.   && !p
27ea0 53 72 63 2d 3e 69 73 52 65 63 75 72 73 69 76 65  Src->isRecursive
27eb0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
27ec0 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
27ed0 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
27ee0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
27ef0 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
27f00 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
27f10 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
27f20 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
27f30 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
27f40 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
27f50 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
27f60 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
27f70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
27f80 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
27f90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
27fa0 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
27fb0 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
27fc0 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
27fd0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
27fe0 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
27ff0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28000 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Skip = 0;.      
28010 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
28020 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
28030 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
28040 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
28050 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
28060 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f  pTerm;.        /
28070 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69  * TUNING: One-ti
28080 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70  me cost for comp
28090 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61  uting the automa
280a0 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20  tic index is.   
280b0 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d       ** approxim
280c0 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67 32 28 4e  ately 7*N*log2(N
280d0 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
280e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
280f0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  in.        ** th
28100 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
28110 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  dexed. */.      
28120 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
28130 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a   rLogSize + rSiz
28140 65 20 2b 20 32 38 3b 20 20 61 73 73 65 72 74 28  e + 28;  assert(
28150 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   28==sqlite3LogE
28160 73 74 28 37 29 20 29 3b 0a 20 20 20 20 20 20 20  st(7) );.       
28170 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68   /* TUNING: Each
28180 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69   index lookup yi
28190 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20  elds 20 rows in 
281a0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
281b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d  .        ** is m
281c0 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73 75  ore than the usu
281d0 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20 72  al guess of 10 r
281e0 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61  ows, since we ha
281f0 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20  ve no way.      
28200 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e 69 6e 67    ** of knowning
28210 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74   how selective t
28220 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c  he index will ul
28230 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74  timately be.  It
28240 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a   would.        *
28250 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f  * not be unreaso
28260 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68  nable to make th
28270 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61  is value much la
28280 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rger. */.       
28290 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33   pNew->nOut = 43
282a0 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73  ;  assert( 43==s
282b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29  qlite3LogEst(20)
282c0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
282d0 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
282e0 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69  LogEstAdd(rLogSi
282f0 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a  ze,pNew->nOut);.
28300 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
28310 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55  Flags = WHERE_AU
28320 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20  TO_INDEX;.      
28330 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
28340 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d   mExtra | pTerm-
28350 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
28360 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
28370 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
28380 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
28390 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
283a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
283b0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
283c0 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f  DEX */..  /* Loo
283d0 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
283e0 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  es.  */.  for(; 
283f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28400 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
28410 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69  pProbe->pNext, i
28420 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20  SortIdx++){.    
28430 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  if( pProbe->pPar
28440 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
28450 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c    && !whereUsabl
28460 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 4e  ePartialIndex(pN
28470 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c 20 70  ew->iTab, pWC, p
28480 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
28490 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 63  here) ){.      c
284a0 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72  ontinue;  /* Par
284b0 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70  tial index inapp
284c0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69  ropriate for thi
284d0 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d  s query */.    }
284e0 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72  .    rSize = pPr
284f0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
28500 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  [0];.    pNew->u
28510 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a  .btree.nEq = 0;.
28520 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
28530 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  e.nSkip = 0;.   
28540 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
28550 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  0;.    pNew->iSo
28560 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70  rtIdx = 0;.    p
28570 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
28580 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
28590 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
285a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
285b0 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ze;.    pNew->u.
285c0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
285d0 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69  Probe;.    b = i
285e0 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
285f0 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64 65  hOrderBy(pBuilde
28600 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d  r, pProbe, pSrc-
28610 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f  >iCursor);.    /
28620 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45  * The ONEPASS_DE
28630 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65  SIRED flags neve
28640 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65  r occurs togethe
28650 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59 20  r with ORDER BY 
28660 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
28670 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
28680 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
28690 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
286a0 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  | b==0 );.    if
286b0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
286c0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
286d0 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
286e0 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  y index */.     
286f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
28700 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20   WHERE_IPK;..   
28710 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65     /* Full table
28720 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   scan */.      p
28730 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
28740 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
28750 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
28760 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
28770 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e  table scan is (N
28780 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20  *3.0). */.      
28790 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
287a0 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 77  ze + 16;.      w
287b0 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
287c0 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b  just(pWC, pNew);
287d0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
287e0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
287f0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
28800 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
28810 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
28820 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
28830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
28840 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69  tmask m;.      i
28850 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76  f( pProbe->isCov
28860 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  ering ){.       
28870 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
28880 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
28890 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  | WHERE_INDEXED;
288a0 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a  .        m = 0;.
288b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
288c0 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63       m = pSrc->c
288d0 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
288e0 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29  sInIndex(pProbe)
288f0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
28900 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29  wsFlags = (m==0)
28910 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   ? (WHERE_IDX_ON
28920 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  LY|WHERE_INDEXED
28930 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ) : WHERE_INDEXE
28940 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  D;.      }..    
28950 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
28960 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
28970 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
28980 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  | !HasRowid(pTab
28990 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d  ).       || ( m=
289a0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
289b0 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
289c0 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  d==0.         &&
289d0 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52   (pProbe->szIdxR
289e0 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
289f0 77 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  w).         && (
28a00 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
28a10 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
28a20 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20  SS_DESIRED)==0. 
28a30 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
28a40 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
28a50 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20  UseCis.         
28a60 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
28a70 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70  nabled(pWInfo->p
28a80 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
28a90 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a  E_CoverIdxScan).
28aa0 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
28ab0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65    ){.        pNe
28ac0 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
28ad0 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
28ae0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
28af0 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
28b00 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20   the index rows 
28b10 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20  is N*K, where K 
28b20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  is.        ** be
28b30 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e  tween 1.1 and 3.
28b40 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  0, depending on 
28b50 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a  the relative siz
28b60 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  es of the.      
28b70 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74    ** index and t
28b80 61 62 6c 65 20 72 6f 77 73 2e 20 49 66 20 74 68  able rows. If th
28b90 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65  is is a non-cove
28ba0 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c  ring index scan,
28bb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f  .        ** also
28bc0 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66   add the cost of
28bd0 20 76 69 73 69 74 69 6e 67 20 74 61 62 6c 65 20   visiting table 
28be0 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a  rows (N*3.0).  *
28bf0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
28c00 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
28c10 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
28c20 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73  zIdxRow)/pTab->s
28c30 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20  zTabRow;.       
28c40 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20   if( m!=0 ){.   
28c50 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
28c60 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
28c70 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
28c80 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20   rSize+16);.    
28c90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 77      }..        w
28ca0 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
28cb0 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 29 3b  just(pWC, pNew);
28cc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
28cd0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
28ce0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
28cf0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
28d00 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
28d10 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
28d20 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
28d30 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ..    rc = where
28d40 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
28d50 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
28d60 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69  , pProbe, 0);.#i
28d70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
28d80 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
28d90 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61  4.    sqlite3Sta
28da0 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75 69  t4ProbeFree(pBui
28db0 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20  lder->pRec);.   
28dc0 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
28dd0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42  alid = 0;.    pB
28de0 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30  uilder->pRec = 0
28df0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
28e00 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
28e10 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
28e20 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  se, then only th
28e30 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a  at one index is.
28e40 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
28e50 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  d. */.    if( pS
28e60 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65  rc->pIndex ) bre
28e70 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
28e80 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
28e90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
28ea0 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41  UALTABLE./*.** A
28eb0 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
28ec0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74   objects for a t
28ed0 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
28ee0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
28ef0 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  * pBuilder->pNew
28f00 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
28f10 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
28f20 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61  d to be a virtua
28f30 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
28f40 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
28f50 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68  AddVirtual(.  Wh
28f60 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
28f70 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48  pBuilder,  /* WH
28f80 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
28f90 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
28fa0 61 73 6b 20 6d 45 78 74 72 61 0a 29 7b 0a 20 20  ask mExtra.){.  
28fb0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
28fc0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
28fd0 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
28fe0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
28ff0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
29000 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29010 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
29020 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
29030 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
29040 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
29050 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
29060 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
29070 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  pSrc;   /* The F
29080 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
29090 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 54  to search */.  T
290a0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
290b0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
290c0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
290d0 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
290e0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
290f0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
29100 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
29110 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
29120 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
29130 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
29140 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
29150 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69  nt i, j;.  int i
29160 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20 20  Term, mxTerm;.  
29170 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
29180 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d 20  .  int seenIn = 
29190 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
291a0 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49 4e  /* True if an IN
291b0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65 65   operator is see
291c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 56  n */.  int seenV
291d0 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
291e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
291f0 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63 6f   non-constant co
29200 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e  nstraint is seen
29210 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73 65   */.  int iPhase
29220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29230 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20 77     /* 0: const w
29240 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c  /o IN, 1: const,
29250 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20 49   2: no IN,  2: I
29260 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  N */.  WhereLoop
29270 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
29280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
29290 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
292a0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50  er->pWInfo;.  pP
292b0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
292c0 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
292d0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43 20  arse->db;.  pWC 
292e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
292f0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
29300 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63  er->pNew;.  pSrc
29310 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
29320 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
29330 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  ab];.  pTab = pS
29340 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73 65  rc->pTab;.  asse
29350 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  rt( IsVirtual(pT
29360 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e 66  ab) );.  pIdxInf
29370 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65  o = allocateInde
29380 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57  xInfo(pParse, pW
29390 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65  C, pSrc, pBuilde
293a0 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  r->pOrderBy);.  
293b0 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
293c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
293d0 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70  NOMEM;.  pNew->p
293e0 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e 65  rereq = 0;.  pNe
293f0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
29400 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
29410 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
29420 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  BLE;.  pNew->nLT
29430 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  erm = 0;.  pNew-
29440 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
29450 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20 3d   = 0;.  pUsage =
29460 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
29470 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 6e  traintUsage;.  n
29480 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
29490 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
294a0 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  nt;.  if( whereL
294b0 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
294c0 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  ew, nConstraint)
294d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
294e0 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e  bFree(db, pIdxIn
294f0 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fo);.    return 
29500 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
29510 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65 3d  }..  for(iPhase=
29520 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69 50  0; iPhase<=3; iP
29530 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28  hase++){.    if(
29540 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50 68   !seenIn && (iPh
29550 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  ase&1)!=0 ){.   
29560 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20 20     iPhase++;.   
29570 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33 20     if( iPhase>3 
29580 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
29590 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72 20     if( !seenVar 
295a0 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62 72  && iPhase>1 ) br
295b0 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  eak;.    pIdxCon
295c0 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
295d0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
295e0 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
295f0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
29600 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
29610 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
29620 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
29630 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20  ons++){.      j 
29640 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
29650 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  mOffset;.      p
29660 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
29670 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ];.      switch(
29680 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20 20   iPhase ){.     
29690 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f 2a     case 0:    /*
296a0 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 6f   Constants witho
296b0 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  ut IN operator *
296c0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
296d0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30  Cons->usable = 0
296e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
296f0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
29700 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
29710 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
29720 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nIn = 1;.       
29730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
29740 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
29750 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20 20  Right!=0 ){.    
29760 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72 20          seenVar 
29770 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
29780 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d  else if( (pTerm-
29790 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
297a0 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)==0 ){.      
297b0 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
297c0 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
297d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
297e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
297f0 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43   case 1:    /* C
29800 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e  onstants with IN
29810 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
29820 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29830 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
29840 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
29850 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70  able = (pTerm->p
29860 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a  rereqRight==0);.
29870 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
29880 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
29890 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73      /* Variables
298a0 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20   without IN */. 
298b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
298c0 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20   seenVar );.    
298d0 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
298e0 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
298f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
29900 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  IN)==0;.        
29910 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
29920 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56   default:   /* V
29930 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e  ariables with IN
29940 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
29950 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26 26  sert( seenVar &&
29960 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
29970 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
29980 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  sable = 1;.     
29990 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
299a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65    }.    }.    me
299b0 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
299c0 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
299d0 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
299e0 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66  straint);.    if
299f0 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
29a00 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
29a10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
29a20 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
29a30 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
29a40 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
29a50 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
29a60 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
29a70 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
29a80 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
29a90 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
29aa0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49  umed = 0;.    pI
29ab0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
29ac0 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
29ad0 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65  IG_DBL / (double
29ae0 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  )2;.    pIdxInfo
29af0 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
29b00 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d 20 76  = 25;.    rc = v
29b10 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
29b20 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49  rse, pTab, pIdxI
29b30 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nfo);.    if( rc
29b40 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f   ) goto whereLoo
29b50 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20  pAddVtab_exit;. 
29b60 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
29b70 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
29b80 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
29b90 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
29ba0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e  nstraint;.    pN
29bb0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
29bc0 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20  tra;.    mxTerm 
29bd0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
29be0 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d  ( pNew->nLSlot>=
29bf0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20  nConstraint );. 
29c00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
29c10 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20  onstraint; i++) 
29c20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  pNew->aLTerm[i] 
29c30 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  = 0;.    pNew->u
29c40 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d  .vtab.omitMask =
29c50 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
29c60 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
29c70 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
29c80 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54 65  {.      if( (iTe
29c90 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61  rm = pUsage[i].a
29ca0 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30  rgvIndex - 1)>=0
29cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
29cc0 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
29cd0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
29ce0 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74  f( iTerm>=nConst
29cf0 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c  raint.         |
29d00 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  | j<0.         |
29d10 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a  | j>=pWC->nTerm.
29d20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77           || pNew
29d30 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21  ->aLTerm[iTerm]!
29d40 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
29d50 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29d60 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
29d70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
29d80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
29d90 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61  .xBestIndex() ma
29da0 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62  lfunction", pTab
29db0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
29dc0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
29dd0 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
29de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29df0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
29e00 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31  m==nConstraint-1
29e10 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
29e20 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20  case( j==0 );.  
29e30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29e40 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20  j==pWC->nTerm-1 
29e50 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  );.        pTerm
29e60 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
29e70 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
29e80 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72  req |= pTerm->pr
29e90 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
29ea0 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d     assert( iTerm
29eb0 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b  <pNew->nLSlot );
29ec0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
29ed0 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70  LTerm[iTerm] = p
29ee0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
29ef0 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29  ( iTerm>mxTerm )
29f00 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b   mxTerm = iTerm;
29f10 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
29f20 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a  e( iTerm==15 );.
29f30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
29f40 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20  ( iTerm==16 );. 
29f50 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
29f60 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d  <16 && pUsage[i]
29f70 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e  .omit ) pNew->u.
29f80 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d  vtab.omitMask |=
29f90 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20   1<<iTerm;.     
29fa0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
29fb0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
29fc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
29fd0 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e    if( pUsage[i].
29fe0 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  omit==0 ){.     
29ff0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2a000 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
2a010 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
2a020 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   if the virtual 
2a030 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
2a040 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74    ** says that t
2a050 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51  he equivalent EQ
2a060 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
2a070 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69  ot be safely omi
2a080 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  tted..          
2a090 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74    ** If we do at
2a0a0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63  tempt to use suc
2a0b0 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  h a constraint, 
2a0c0 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20  some rows might 
2a0d0 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  be.            *
2a0e0 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74 68  * repeated in th
2a0f0 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20  e output. */.   
2a100 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2a110 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a120 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75        /* A virtu
2a130 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  al table that is
2a140 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
2a150 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79  an IN clause may
2a160 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a   not.          *
2a170 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52  * consume the OR
2a180 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65  DER BY clause be
2a190 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72  cause (1) the or
2a1a0 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a  der of IN terms.
2a1b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
2a1c0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
2a1d0 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f  related to the o
2a1e0 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74  rder of output t
2a1f0 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20  erms and.       
2a200 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70     ** (2) Multip
2a210 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20  le outputs from 
2a220 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75  a single IN valu
2a230 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65  e will not merge
2a240 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
2a250 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20  gether.  */.    
2a260 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
2a270 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
2a280 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
2a290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2a2a0 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61   if( i>=nConstra
2a2b0 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  int ){.      pNe
2a2c0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65  w->nLTerm = mxTe
2a2d0 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65  rm+1;.      asse
2a2e0 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  rt( pNew->nLTerm
2a2f0 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  <=pNew->nLSlot )
2a300 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2a310 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49  vtab.idxNum = pI
2a320 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a  dxInfo->idxNum;.
2a330 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2a340 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49  ab.needFree = pI
2a350 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2a360 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20  eeIdxStr;.      
2a370 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2a380 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
2a390 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2a3a0 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78  ab.idxStr = pIdx
2a3b0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20  Info->idxStr;.  
2a3c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2a3d0 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38  .isOrdered = (i8
2a3e0 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  )(pIdxInfo->orde
2a3f0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20  rByConsumed ?.  
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a420 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f      pIdxInfo->nO
2a430 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 20  rderBy : 0);.   
2a440 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
2a450 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
2a460 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
2a470 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28  ogEstFromDouble(
2a480 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
2a490 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  tedCost);.      
2a4a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
2a4b0 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49  ite3LogEst(pIdxI
2a4c0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
2a4d0 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  ws);.      where
2a4e0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2a4f0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2a500 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74    if( pNew->u.vt
2a510 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
2a520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2a530 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ree(pNew->u.vtab
2a540 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
2a550 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
2a560 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
2a570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20     }.    }.  }  
2a580 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  ..whereLoopAddVt
2a590 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70  ab_exit:.  if( p
2a5a0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2a5b0 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
2a5c0 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
2a5d0 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  o->idxStr);.  sq
2a5e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2a5f0 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74  pIdxInfo);.  ret
2a600 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
2a610 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2a620 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2a630 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65  ./*.** Add Where
2a640 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20  Loop entries to 
2a650 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e  handle OR terms.
2a660 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72    This works for
2a670 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65   either.** btree
2a680 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62  s or virtual tab
2a690 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
2a6a0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f  nt whereLoopAddO
2a6b0 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  r(WhereLoopBuild
2a6c0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69  er *pBuilder, Bi
2a6d0 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20  tmask mExtra){. 
2a6e0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2a6f0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2a700 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c  WInfo;.  WhereCl
2a710 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
2a720 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
2a730 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2a740 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74  , *pWCEnd;.  int
2a750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a760 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57  .  int iCur;.  W
2a770 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
2a780 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  C;.  WhereLoopBu
2a790 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b  ilder sSubBuild;
2a7a0 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53  .  WhereOrSet sS
2a7b0 75 6d 2c 20 73 43 75 72 2c 20 73 50 72 65 76 3b  um, sCur, sPrev;
2a7c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2a7d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2a7e0 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
2a7f0 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70  er->pWC;.  if( p
2a800 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2a810 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  s & WHERE_AND_ON
2a820 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  LY ) return SQLI
2a830 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20  TE_OK;.  pWCEnd 
2a840 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
2a850 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20  nTerm;.  pNew = 
2a860 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2a870 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20    memset(&sSum, 
2a880 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29  0, sizeof(sSum))
2a890 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
2a8a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
2a8b0 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
2a8c0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 49  if( !HasRowid(pI
2a8d0 74 65 6d 2d 3e 70 54 61 62 29 20 29 20 72 65 74  tem->pTab) ) ret
2a8e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2a8f0 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69   iCur = pItem->i
2a900 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70  Cursor;..  for(p
2a910 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
2a920 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d  rm<pWCEnd && rc=
2a930 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72  =SQLITE_OK; pTer
2a940 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
2a950 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
2a960 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20  & WO_OR)!=0.    
2a970 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f   && (pTerm->u.pO
2a980 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
2a990 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
2a9a0 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  f)!=0 .    ){.  
2a9b0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
2a9c0 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20  * const pOrWC = 
2a9d0 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
2a9e0 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65  o->wc;.      Whe
2a9f0 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
2aa00 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43  OrWCEnd = &pOrWC
2aa10 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ->a[pOrWC->nTerm
2aa20 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ];.      WhereTe
2aa30 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20  rm *pOrTerm;.   
2aa40 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
2aa50 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
2aa60 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75 62  .    .      sSub
2aa70 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65  Build = *pBuilde
2aa80 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  r;.      sSubBui
2aa90 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  ld.pOrderBy = 0;
2aaa0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
2aab0 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b  .pOrSet = &sCur;
2aac0 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ..      for(pOrT
2aad0 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
2aae0 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
2aaf0 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
2ab00 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
2ab10 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2ab20 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
2ab30 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2ab40 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
2ab50 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
2ab60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2ab70 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
2ab80 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
2ab90 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2aba0 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
2abb0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2abc0 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
2abd0 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
2abe0 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
2abf0 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
2ac00 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
2ac10 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2ac20 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
2ac30 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
2ac40 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
2ac50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ac60 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2ac70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2ac80 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
2ac90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2aca0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2acb0 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
2acc0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
2acd0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2ace0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2acf0 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
2ad00 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
2ad10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
2ad20 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
2ad30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
2ad40 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
2ad50 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
2ad60 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ra);.        }. 
2ad70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
2ad80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
2ad90 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  sCur.n==0 );.   
2ada0 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d       if( sCur.n=
2adb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2adc0 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
2add0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ade0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
2adf0 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nce ){.         
2ae00 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53   whereOrMove(&sS
2ae10 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20  um, &sCur);.    
2ae20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
2ae30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ae40 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
2ae50 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73 53  Move(&sPrev, &sS
2ae60 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  um);.          s
2ae70 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
2ae80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2ae90 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  sPrev.n; i++){. 
2aea0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
2aeb0 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b  =0; j<sCur.n; j+
2aec0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2aed0 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28    whereOrInsert(
2aee0 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69  &sSum, sPrev.a[i
2aef0 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e  ].prereq | sCur.
2af00 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20  a[j].prereq,.   
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2af30 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e  LogEstAdd(sPrev.
2af40 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e  a[i].rRun, sCur.
2af50 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20  a[j].rRun),.    
2af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
2af80 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61  ogEstAdd(sPrev.a
2af90 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61  [i].nOut, sCur.a
2afa0 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20  [j].nOut));.    
2afb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2afc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2afd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
2afe0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  ew->nLTerm = 1;.
2aff0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2b000 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
2b010 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2b020 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs = WHERE_MULTI
2b030 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  _OR;.      pNew-
2b040 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
2b050 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2b060 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d  x = 0;.      mem
2b070 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c  set(&pNew->u, 0,
2b080 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29   sizeof(pNew->u)
2b090 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
2b0a0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2b0b0 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b  && i<sSum.n; i++
2b0c0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2b0d0 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69  >rRun = sSum.a[i
2b0e0 5d 2e 72 52 75 6e 3b 0a 20 20 20 20 20 20 20 20  ].rRun;.        
2b0f0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
2b100 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
2b110 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2b120 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
2b130 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
2b140 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
2b150 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
2b160 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
2b170 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2b180 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
2b190 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
2b1a0 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61  jects for all ta
2b1b0 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20  bles .*/.static 
2b1c0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
2b1d0 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  All(WhereLoopBui
2b1e0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
2b1f0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2b200 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2b210 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61  >pWInfo;.  Bitma
2b220 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20  sk mExtra = 0;. 
2b230 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20   Bitmask mPrior 
2b240 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
2b250 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2b260 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
2b270 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
2b280 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b290 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
2b2a0 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
2b2b0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
2b2c0 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   nTabList = pWIn
2b2d0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e  fo->nLevel;.  in
2b2e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b2f0 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e  ;.  u8 priorJoin
2b300 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72  Type = 0;.  Wher
2b310 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20  eLoop *pNew;..  
2b320 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
2b330 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
2b340 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
2b350 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65  o right */.  pNe
2b360 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
2b370 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  ew;.  whereLoopI
2b380 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72  nit(pNew);.  for
2b390 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70  (iTab=0, pItem=p
2b3a0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62  TabList->a; iTab
2b3b0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b  <nTabList; iTab+
2b3c0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2b3d0 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
2b3e0 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61  ab;.    pNew->ma
2b3f0 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b  skSelf = getMask
2b400 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
2b410 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  et, pItem->iCurs
2b420 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  or);.    if( ((p
2b430 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70  Item->jointype|p
2b440 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20  riorJoinType) & 
2b450 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
2b460 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
2b470 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b  mExtra = mPrior;
2b480 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72  .    }.    prior
2b490 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d  JoinType = pItem
2b4a0 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
2b4b0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
2b4c0 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
2b4d0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2b4e0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75  opAddVirtual(pBu
2b4f0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2b500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b510 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2b520 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72  ddBtree(pBuilder
2b530 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  , mExtra);.    }
2b540 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b560 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2b570 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45  dOr(pBuilder, mE
2b580 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
2b590 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
2b5a0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
2b5b0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
2b5c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
2b5d0 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f  k;.  }.  whereLo
2b5e0 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77  opClear(db, pNew
2b5f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b600 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65  }../*.** Examine
2b610 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69   a WherePath (wi
2b620 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  th the addition 
2b630 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65  of the extra Whe
2b640 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74  reLoop of the 5t
2b650 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29  h.** parameters)
2b660 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75   to see if it ou
2b670 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68  tputs rows in th
2b680 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45  e requested ORDE
2b690 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55  R BY.** (or GROU
2b6a0 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65  P BY) without re
2b6b0 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61  quiring a separa
2b6c0 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f  te sort operatio
2b6d0 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a  n.  Return N:.**
2b6e0 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20   .**   N>0:   N 
2b6f0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
2b700 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
2b710 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20   satisfied.**   
2b720 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20  N==0:  No terms 
2b730 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
2b740 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
2b750 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20  fied.**   N<0:  
2b760 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77   Unknown yet how
2b770 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f   many terms of O
2b780 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62 65  RDER BY might be
2b790 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a   satisfied.   .*
2b7a0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
2b7b0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48  rocessing for WH
2b7c0 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20  ERE_GROUPBY and 
2b7d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2b7e0 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74   is not as.** st
2b7f0 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55  rict.  With GROU
2b800 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
2b810 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69  T the only requi
2b820 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a  rement is that.*
2b830 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77  * equivalent row
2b840 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61  s appear immedia
2b850 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f  tely adjacent to
2b860 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47   one another.  G
2b870 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44  ROUP BY.** and D
2b880 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72  ISTINCT do not r
2b890 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61  equire rows to a
2b8a0 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72  ppear in any par
2b8b0 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73  ticular order as
2b8c0 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69   long.** as equi
2b8d0 76 65 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20  velent rows are 
2b8e0 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2b8f0 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55  .  Thus for GROU
2b900 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
2b910 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42  T.** the pOrderB
2b920 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d  y terms can be m
2b930 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72  atched in any or
2b940 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52  der.  With ORDER
2b950 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72   BY, the .** pOr
2b960 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74  derBy terms must
2b970 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73   be matched in s
2b980 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69  trict left-to-ri
2b990 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ght order..*/.st
2b9a0 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61 74  atic i8 wherePat
2b9b0 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
2b9c0 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  y(.  WhereInfo *
2b9d0 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68  pWInfo,    /* Th
2b9e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
2b9f0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2ba00 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44  rderBy,   /* ORD
2ba10 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
2ba20 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c  Y or DISTINCT cl
2ba30 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  ause to check */
2ba40 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50  .  WherePath *pP
2ba50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ath,     /* The 
2ba60 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65  WherePath to che
2ba70 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ck */.  u16 wctr
2ba80 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
2ba90 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57   Might contain W
2baa0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20  HERE_GROUPBY or 
2bab0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
2bac0 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
2bad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2bae0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2baf0 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
2bb00 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
2bb10 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
2bb20 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
2bb30 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
2bb40 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
2bb50 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
2bb60 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
2bb70 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
2bb80 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
2bb90 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
2bba0 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
2bbb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2bbc0 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
2bbd0 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
2bbe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bbf0 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
2bc00 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
2bc10 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
2bc20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
2bc30 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
2bc40 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
2bc50 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
2bc60 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
2bc70 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
2bc80 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
2bc90 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
2bca0 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
2bcb0 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
2bcc0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
2bcd0 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
2bce0 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
2bcf0 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
2bd00 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2bd10 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65  use */.  u16 nKe
2bd20 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  yCol;          /
2bd30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
2bd40 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
2bd50 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75  x */.  u16 nColu
2bd60 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2bd70 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2bd80 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20  ordered columns 
2bd90 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
2bda0 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20    u16 nOrderBy; 
2bdb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2bdc0 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  r terms in the O
2bdd0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2bde0 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2bdf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2be00 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ex of WhereLoop 
2be10 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70  in pPath being p
2be20 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
2be30 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2be40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2be50 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
2be60 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
2be70 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2be80 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65   for current Whe
2be90 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  reLoop */.  int 
2bea0 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
2beb0 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75    /* A column nu
2bec0 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c  mber within tabl
2bed0 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72  e iCur */.  Wher
2bee0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30  eLoop *pLoop = 0
2bef0 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65  ; /* Current Whe
2bf00 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f  reLoop being pro
2bf10 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65  cessed. */.  Whe
2bf20 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
2bf30 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
2bf40 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
2bf50 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2bf60 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20  r *pOBExpr;     
2bf70 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
2bf80 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ion from the ORD
2bf90 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2bfa0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2bfb0 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41  ;       /* COLLA
2bfc0 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  TE function from
2bfd0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2bfe0 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e  use term */.  In
2bff0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
2c000 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2c010 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2c020 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69   pLoop */.  sqli
2c030 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
2c040 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  ->pParse->db;  /
2c050 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2c060 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ction */.  Bitma
2c070 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20  sk obSat = 0;   
2c080 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
2c090 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
2c0a0 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  fied so far */. 
2c0b0 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b   Bitmask obDone;
2c0c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2c0d0 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
2c0e0 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
2c0f0 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  k orderDistinctM
2c100 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ask;  /* Mask of
2c110 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65   all well-ordere
2c120 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74  d loops */.  Bit
2c130 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20  mask ready;     
2c140 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2c150 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
2c160 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  */..  /*.  ** We
2c170 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2c180 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
2c190 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  if it generates 
2c1a0 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
2c1b0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74  .  ** row of out
2c1c0 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f  put.  A WhereLoo
2c1d0 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20  p is one-row if 
2c1e0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
2c1f0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
2c200 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64   **  (a) All ind
2c210 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68  ex columns match
2c220 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55   with WHERE_COLU
2c230 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29  MN_EQ..  **  (b)
2c240 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   The index is un
2c250 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68  ique.  ** Any Wh
2c260 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
2c270 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2c280 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
2c290 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72  e rowid is one-r
2c2a0 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f  ow..  ** Every o
2c2b0 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2c2c0 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57   will have the W
2c2d0 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20  HERE_ONEROW bit 
2c2e0 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a  set in wsFlags..
2c2f0 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    **.  ** We say
2c300 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2c310 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  s "order-distinc
2c320 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  t" if the set of
2c330 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20   columns from.  
2c340 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  ** that WhereLoo
2c350 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  p that are in th
2c360 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2c370 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
2c380 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  for every.  ** r
2c390 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ow of the WhereL
2c3a0 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d  oop.  Every one-
2c3b0 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  row WhereLoop is
2c3c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
2c3d0 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   ** order-distin
2c3e0 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f  ct.   A WhereLoo
2c3f0 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f  p that has no co
2c400 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44  lumns in the ORD
2c410 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
2c420 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64  * is not order-d
2c430 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f  istinct. To be o
2c440 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73  rder-distinct is
2c450 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73   not quite the s
2c460 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a  ame as being.  *
2c470 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61  * UNIQUE since a
2c480 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f   UNIQUE column o
2c490 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65  r index can have
2c4a0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
2c4b0 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55  hat .  ** are NU
2c4c0 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75  LL and NULL valu
2c4d0 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  es are equivalen
2c4e0 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  t for the purpos
2c4f0 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69  e of order-disti
2c500 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20  nct..  ** To be 
2c510 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20  order-distinct, 
2c520 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  the columns must
2c530 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e   be UNIQUE and N
2c540 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  OT NULL..  **.  
2c550 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
2c560 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61   a table is alwa
2c570 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  ys UNIQUE and NO
2c580 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76  T NULL so whenev
2c590 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69  er the.  ** rowi
2c5a0 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  d appears in the
2c5b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2c5c0 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2c5d0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
2c5e0 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
2c5f0 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  lly order-distin
2c600 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65  ct..  */..  asse
2c610 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
2c620 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69  );..  /* Sortabi
2c630 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20  lity of virtual 
2c640 74 61 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d  tables is determ
2c650 69 6e 65 64 20 62 79 20 74 68 65 20 78 42 65 73  ined by the xBes
2c660 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20  tIndex method.  
2c670 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ** of the virtua
2c680 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a  l table itself *
2c690 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77  /.  if( pLast->w
2c6a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2c6b0 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
2c6c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f     testcase( nLo
2c6d0 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65  op>0 );  /* True
2c6e0 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70   when outer loop
2c6f0 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e  s are one-row an
2c700 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20  d match .       
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c720 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42     ** no ORDER B
2c730 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72  Y terms */.    r
2c740 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76  eturn pLast->u.v
2c750 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20  tab.isOrdered;. 
2c760 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26   }.  if( nLoop &
2c770 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  & OptimizationDi
2c780 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
2c790 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
2c7a0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
2c7b0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
2c7c0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74  erBy->nExpr;.  t
2c7d0 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42  estcase( nOrderB
2c7e0 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  y==BMS-1 );.  if
2c7f0 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31  ( nOrderBy>BMS-1
2c800 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2c810 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   Cannot optimize
2c820 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52   overly large OR
2c830 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f  DER BYs */.  isO
2c840 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
2c850 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53  ;.  obDone = MAS
2c860 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31  KBIT(nOrderBy)-1
2c870 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ;.  orderDistinc
2c880 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61  tMask = 0;.  rea
2c890 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c  dy = 0;.  for(iL
2c8a0 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69  oop=0; isOrderDi
2c8b0 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c  stinct && obSat<
2c8c0 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c  obDone && iLoop<
2c8d0 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  =nLoop; iLoop++)
2c8e0 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e  {.    if( iLoop>
2c8f0 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f  0 ) ready |= pLo
2c900 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2c910 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c    pLoop = iLoop<
2c920 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61  nLoop ? pPath->a
2c930 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c  Loop[iLoop] : pL
2c940 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ast;.    assert(
2c950 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2c960 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2c970 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20  TABLE)==0 );.   
2c980 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
2c990 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
2c9a0 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
2c9b0 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  ;..    /* Mark o
2c9c0 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20  ff any ORDER BY 
2c9d0 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61  term X that is a
2c9e0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
2c9f0 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
2ca00 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20  he current loop 
2ca10 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
2ca20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  is term in the W
2ca30 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75  HERE.    ** clau
2ca40 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  se of the form X
2ca50 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20   IS NULL or X=? 
2ca60 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f  that reference o
2ca70 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  nly outer.    **
2ca80 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20   loops..    */. 
2ca90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
2caa0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
2cab0 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2cac0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2cad0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42  tinue;.      pOB
2cae0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
2caf0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
2cb00 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2cb10 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
2cb20 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2cb30 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2cb40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
2cb50 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
2cb60 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
2cb70 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
2cb80 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Term(&pWInfo->sW
2cb90 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72  C, iCur, pOBExpr
2cba0 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->iColumn,.     
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbc0 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c    ~ready, WO_EQ|
2cbd0 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20  WO_ISNULL, 0);. 
2cbe0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
2cbf0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2cc00 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2cc10 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29  eOperator&WO_EQ)
2cc20 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e  !=0 && pOBExpr->
2cc30 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
2cc40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2cc50 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20   *z1, *z2;.     
2cc60 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2cc70 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2cc80 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
2cc90 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2cca0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2ccb0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2ccc0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2ccd0 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43  .        z1 = pC
2cce0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
2ccf0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2cd00 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2cd10 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2cd20 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
2cd30 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2cd40 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2cd50 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2cd60 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z2 = pColl->zN
2cd70 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2cd80 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2cd90 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e  z1, z2)!=0 ) con
2cda0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2cdb0 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2cdc0 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
2cdd0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
2cde0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2cdf0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
2ce00 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
2ce10 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2ce20 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
2ce30 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
2ce40 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a     nKeyCol = 0;.
2ce50 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
2ce60 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
2ce70 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
2ce80 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2ce90 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
2cea0 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
2ceb0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2cec0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2ced0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
2cee0 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   = pIndex->nKeyC
2cef0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  ol;.        nCol
2cf00 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43  umn = pIndex->nC
2cf10 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61  olumn;.        a
2cf20 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
2cf30 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61  nKeyCol+1 || !Ha
2cf40 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
2cf50 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20  Table) );.      
2cf60 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
2cf70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
2cf80 6d 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21  mn-1]==(-1) || !
2cf90 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
2cfa0 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  >pTable));.     
2cfb0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2cfc0 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ct = pIndex->onE
2cfd0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
2cfe0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2cff0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
2d000 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
2d010 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20   index and deal 
2d020 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20  with the ones.  
2d030 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
2d040 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  not constrained 
2d050 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20  by == or IN..   
2d060 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20     */.      rev 
2d070 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20  = revSet = 0;.  
2d080 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
2d090 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  mns = 0;.      f
2d0a0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d  or(j=0; j<nColum
2d0b0 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2d0c0 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20   u8 bOnce;   /* 
2d0d0 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20  True to run the 
2d0e0 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20  ORDER BY search 
2d0f0 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20  loop */..       
2d100 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
2d110 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72   and IS NULL ter
2d120 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ms */.        if
2d130 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
2d140 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2d150 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
2d160 65 2e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20  e.nSkip==0.     
2d170 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f      && ((i = pLo
2d180 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65  op->aLTerm[j]->e
2d190 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f  Operator) & (WO_
2d1a0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  EQ|WO_ISNULL))!=
2d1b0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2d1c0 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57         if( i & W
2d1d0 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
2d1e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d1f0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2d200 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
2d210 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2d220 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2d230 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
2d240 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
2d250 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
2d260 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  t the column num
2d270 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ber in the table
2d280 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73   (iColumn) and s
2d290 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ort order.      
2d2a0 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f    ** (revIdx) fo
2d2b0 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  r the j-th colum
2d2c0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  n of the index..
2d2d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d2e0 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b     if( pIndex ){
2d2f0 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
2d300 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
2d310 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
2d320 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e      revIdx = pIn
2d330 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
2d340 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j];.          if
2d350 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ( iColumn==pInde
2d360 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
2d370 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b   ) iColumn = -1;
2d380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2d390 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
2d3a0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2d3b0 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
2d3c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2d3d0 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
2d3e0 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
2d3f0 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
2d400 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
2d410 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
2d420 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
2d430 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  ordered.        
2d440 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
2d450 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
2d460 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
2d470 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
2d480 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
2d490 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
2d4a0 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
2d4b0 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
2d4c0 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
2d4d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d4e0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2d4f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2d500 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
2d510 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
2d520 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
2d530 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
2d540 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
2d550 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
2d560 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52  and mark that OR
2d570 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20  DER BY term off 
2d580 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2d590 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20      bOnce = 1;. 
2d5a0 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
2d5b0 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
2d5c0 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c  i=0; bOnce && i<
2d5d0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2d5e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41            if( MA
2d5f0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
2d600 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d610 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d         pOBExpr =
2d620 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2d630 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
2d640 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2d650 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2d660 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
2d670 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b  WHERE_GROUPBY );
2d680 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2d690 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ase( wctrlFlags 
2d6a0 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
2d6b0 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
2d6c0 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
2d6d0 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59  & (WHERE_GROUPBY
2d6e0 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42  |WHERE_DISTINCTB
2d6f0 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d  Y))==0 ) bOnce =
2d700 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2d710 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
2d720 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
2d730 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
2d740 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
2d750 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
2d760 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
2d770 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  f( pOBExpr->iCol
2d780 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63  umn!=iColumn ) c
2d790 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d7a0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
2d7b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2d7c0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2d7d0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2d7e0 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
2d7f0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2d800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2d810 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
2d820 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
2d830 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  l;.            i
2d840 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2d850 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
2d860 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  pIndex->azColl[j
2d870 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ])!=0 ) continue
2d880 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d890 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
2d8a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
2d8b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2d8c0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
2d8d0 74 63 68 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  tch && (pWInfo->
2d8e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2d8f0 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29  RE_GROUPBY)==0 )
2d900 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  {.          /* M
2d910 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72  ake sure the sor
2d920 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61  t order is compa
2d930 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45  tible in an ORDE
2d940 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
2d950 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f         ** Sort o
2d960 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61  rder is irreleva
2d970 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42  nt for a GROUP B
2d980 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  Y clause. */.   
2d990 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65         if( revSe
2d9a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2d9b0 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49   if( (rev ^ revI
2d9c0 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61  dx)!=pOrderBy->a
2d9d0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
2d9e0 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
2d9f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2da00 20 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20            rev = 
2da10 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42  revIdx ^ pOrderB
2da20 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
2da30 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  r;.            i
2da40 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61  f( rev ) *pRevMa
2da50 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c  sk |= MASKBIT(iL
2da60 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oop);.          
2da70 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20    revSet = 1;.  
2da80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2da90 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2daa0 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
2dab0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2dac0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2dad0 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74    testcase( dist
2dae0 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29  inctColumns==0 )
2daf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
2db00 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
2db10 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2db20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
2db30 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
2db40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2db50 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74         /* No mat
2db60 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ch found */.    
2db70 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c        if( j==0 |
2db80 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  | j<nKeyCol ){. 
2db90 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2dba0 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2dbb0 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  inct!=0 );.     
2dbc0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2dbd0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2dbe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dbf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2dc00 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e   }.      } /* en
2dc10 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  d Loop over all 
2dc20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f  index columns */
2dc30 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69  .      if( disti
2dc40 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20  nctColumns ){.  
2dc50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2dc60 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d  isOrderDistinct=
2dc70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73  =0 );.        is
2dc80 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2dc90 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2dca0 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f   /* end-if not o
2dcb0 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f  ne-row */..    /
2dcc0 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f  * Mark off any o
2dcd0 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65  ther ORDER BY te
2dce0 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e  rms that referen
2dcf0 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ce pLoop */.    
2dd00 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
2dd10 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  nct ){.      ord
2dd20 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c  erDistinctMask |
2dd30 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
2dd40 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f;.      for(i=0
2dd50 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
2dd60 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
2dd70 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74   *p;.        Bit
2dd80 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20  mask mTerm;.    
2dd90 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2dda0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2ddb0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
2ddc0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
2ddd0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
2dde0 20 6d 54 65 72 6d 20 3d 20 65 78 70 72 54 61 62   mTerm = exprTab
2ddf0 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d  leUsage(&pWInfo-
2de00 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20  >sMaskSet,p);.  
2de10 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d        if( mTerm=
2de20 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
2de30 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20  prIsConstant(p) 
2de40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2de50 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e      if( (mTerm&~
2de60 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2de70 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
2de80 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2de90 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
2dea0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2deb0 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c    } /* End the l
2dec0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65  oop over all Whe
2ded0 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74  reLoops from out
2dee0 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20  er-most down to 
2def0 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20  inner-most */.  
2df00 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e  if( obSat==obDon
2df10 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e  e ) return (i8)n
2df20 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21  OrderBy;.  if( !
2df30 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2df40 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72  ){.    for(i=nOr
2df50 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d  derBy-1; i>0; i-
2df60 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  -){.      Bitmas
2df70 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29  k m = MASKBIT(i)
2df80 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   - 1;.      if( 
2df90 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72  (obSat&m)==m ) r
2dfa0 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20  eturn i;.    }. 
2dfb0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2dfc0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
2dfd0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ../*.** If the W
2dfe0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
2dff0 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  g is set in the 
2e000 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73  mask passed to s
2e010 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2e020 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e  (),.** the plann
2e030 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  er assumes that 
2e040 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f  the specified pO
2e050 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61  rderBy list is a
2e060 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a  ctually a GROUP.
2e070 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61  ** BY clause - a
2e080 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20  nd so any order 
2e090 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73  that groups rows
2e0a0 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74   as required sat
2e0b0 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65  isfies the.** re
2e0c0 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  quest..**.** Nor
2e0d0 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63  mally, in this c
2e0e0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
2e0f0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63  ssible for the c
2e100 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69  aller to determi
2e110 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  ne.** whether or
2e120 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72   not the rows ar
2e130 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64  e really being d
2e140 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74  elivered in sort
2e150 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20  ed order, or.** 
2e160 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68  just in some oth
2e170 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72  er order that pr
2e180 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69  ovides the requi
2e190 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f  red grouping. Ho
2e1a0 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65  wever,.** if the
2e1b0 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
2e1c0 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20  UP flag is also 
2e1d0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
2e1e0 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74  3WhereBegin(), t
2e1f0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  hen.** this func
2e200 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
2e210 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  ed on the return
2e220 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a  ed WhereInfo obj
2e230 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a  ect. It returns.
2e240 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72  ** true if the r
2e250 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20  ows really will 
2e260 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65  be sorted in the
2e270 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72   specified order
2e280 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74  , or false.** ot
2e290 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46  herwise..**.** F
2e2a0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
2e2b0 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  ming:.**.**   CR
2e2c0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
2e2d0 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a   t1(x, Y);.**.**
2e2e0 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45   then.**.**   SE
2e2f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47  LECT * FROM t1 G
2e300 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45  ROUP BY x,y ORDE
2e310 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49  R BY x,y;   -- I
2e320 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20  sSorted()==1.** 
2e330 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2e340 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20  t1 GROUP BY y,x 
2e350 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20  ORDER BY y,x;   
2e360 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30  -- IsSorted()==0
2e370 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
2e380 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65  hereIsSorted(Whe
2e390 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
2e3a0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
2e3b0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2e3c0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b  WHERE_GROUPBY );
2e3d0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
2e3e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2e3f0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
2e400 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  P );.  return pW
2e410 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a  Info->sorted;.}.
2e420 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2e430 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f  CE_ENABLED./* Fo
2e440 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  r debugging use 
2e450 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20  only: */.static 
2e460 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72  const char *wher
2e470 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50  ePathName(WhereP
2e480 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20  ath *pPath, int 
2e490 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70  nLoop, WhereLoop
2e4a0 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74   *pLast){.  stat
2e4b0 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35  ic char zName[65
2e4c0 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ];.  int i;.  fo
2e4d0 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20  r(i=0; i<nLoop; 
2e4e0 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d  i++){ zName[i] =
2e4f0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d   pPath->aLoop[i]
2e500 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70  ->cId; }.  if( p
2e510 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b  Last ) zName[i++
2e520 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a  ] = pLast->cId;.
2e530 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a    zName[i] = 0;.
2e540 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
2e550 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2e560 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f  Given the list o
2e570 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  f WhereLoop obje
2e580 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70  cts at pWInfo->p
2e590 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74  Loops, this rout
2e5a0 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ine.** attempts 
2e5b0 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65  to find the lowe
2e5c0 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61  st cost path tha
2e5d0 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68  t visits each Wh
2e5e0 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e  ereLoop.** once.
2e5f0 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74    This path is t
2e600 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  hen loaded into 
2e610 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  the pWInfo->a[].
2e620 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a  pWLoop fields..*
2e630 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74  *.** Assume that
2e640 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
2e650 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
2e660 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20   that will need 
2e670 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20  to be sorted.** 
2e680 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20  will be nRowEst 
2e690 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20  (in the 10*log2 
2e6a0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e  representation).
2e6b0 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72    Or, ignore sor
2e6c0 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66  ting.** costs if
2e6d0 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a   nRowEst==0..**.
2e6e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
2e6f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
2e700 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  r SQLITE_NOMEM o
2e710 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
2e720 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f  ation.** error o
2e730 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
2e740 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f   int wherePathSo
2e750 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a  lver(WhereInfo *
2e760 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e  pWInfo, LogEst n
2e770 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
2e780 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
2e790 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2e7a0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
2e7b0 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
2e7c0 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
2e7d0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
2e7e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e7f0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
2e800 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
2e810 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
2e820 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
2e830 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
2e840 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2e850 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2e860 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2e870 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e890 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
2e8a0 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
2e8b0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
2e8c0 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
2e8d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2e8e0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2e8f0 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20  t mxI = 0;      
2e900 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2e910 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74   of next entry t
2e920 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69  o replace */.  i
2e930 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
2e940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e950 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63  er of ORDER BY c
2e960 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20  lause terms */. 
2e970 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20   LogEst rCost;  
2e980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2e990 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a  st of a path */.
2e9a0 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20    LogEst nOut;  
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e9c0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
2e9d0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43   */.  LogEst mxC
2e9e0 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ost = 0;        
2e9f0 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20  /* Maximum cost 
2ea00 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
2ea10 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
2ea20 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
2ea30 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74   /* Maximum nOut
2ea40 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 73 65   value on the se
2ea50 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20  t of paths */.  
2ea60 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20  int nTo, nFrom; 
2ea70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ea80 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74  ber of valid ent
2ea90 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e  ries in aTo[] an
2eaa0 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57  d aFrom[] */.  W
2eab0 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b  herePath *aFrom;
2eac0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
2ead0 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74  nFrom paths at t
2eae0 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65  he previous leve
2eaf0 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
2eb00 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *aTo;          
2eb10 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74   /* The nTo best
2eb20 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75   paths at the cu
2eb30 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  rrent level */. 
2eb40 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f   WherePath *pFro
2eb50 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  m;         /* An
2eb60 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f   element of aFro
2eb70 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  m[] that we are 
2eb80 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
2eb90 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20  WherePath *pTo; 
2eba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
2ebb0 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d  element of aTo[]
2ebc0 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
2ebd0 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
2ebe0 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
2ebf0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2ec00 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
2ec10 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72  bjects */.  Wher
2ec20 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20  eLoop **pX;     
2ec30 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
2ec40 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70   divy up the pSp
2ec50 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ace memory */.  
2ec60 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20  char *pSpace;   
2ec70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
2ec80 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73  porary memory us
2ec90 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
2eca0 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ne */..  pParse 
2ecb0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2ecc0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
2ecd0 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70  >db;.  nLoop = p
2ece0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
2ecf0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20   /* TUNING: For 
2ed00 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20  simple queries, 
2ed10 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61  only the best pa
2ed20 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20  th is tracked.. 
2ed30 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f   ** For 2-way jo
2ed40 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20  ins, the 5 best 
2ed50 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77  paths are follow
2ed60 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69  ed..  ** For joi
2ed70 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20  ns of 3 or more 
2ed80 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68  tables, track th
2ed90 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20  e 10 best paths 
2eda0 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20  */.  mxChoice = 
2edb0 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a  (nLoop==1) ? 1 :
2edc0 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a   (nLoop==2 ? 5 :
2edd0 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20   10);.  assert( 
2ede0 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70  nLoop<=pWInfo->p
2edf0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
2ee00 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
2ee10 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69  002, ("---- begi
2ee20 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a  n solver\n"));..
2ee30 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
2ee40 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61  d initialize spa
2ee50 63 65 20 66 6f 72 20 61 54 6f 20 61 6e 64 20 61  ce for aTo and a
2ee60 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28  From */.  ii = (
2ee70 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68  sizeof(WherePath
2ee80 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  )+sizeof(WhereLo
2ee90 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68  op*)*nLoop)*mxCh
2eea0 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70 61 63 65  oice*2;.  pSpace
2eeb0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2eec0 6f 63 52 61 77 28 64 62 2c 20 69 69 29 3b 0a 20  ocRaw(db, ii);. 
2eed0 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
2eee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2eef0 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57  OMEM;.  aTo = (W
2ef00 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65  herePath*)pSpace
2ef10 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b  ;.  aFrom = aTo+
2ef20 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73  mxChoice;.  mems
2ef30 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a  et(aFrom, 0, siz
2ef40 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a  eof(aFrom[0]));.
2ef50 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f    pX = (WhereLoo
2ef60 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f  p**)(aFrom+mxCho
2ef70 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d  ice);.  for(ii=m
2ef80 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d  xChoice*2, pFrom
2ef90 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d  =aTo; ii>0; ii--
2efa0 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d  , pFrom++, pX +=
2efb0 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72   nLoop){.    pFr
2efc0 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a  om->aLoop = pX;.
2efd0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74    }..  /* Seed t
2efe0 68 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61  he search with a
2eff0 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74   single WherePat
2f000 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72  h containing zer
2f010 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20  o WhereLoops..  
2f020 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20  **.  ** TUNING: 
2f030 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e  Do not let the n
2f040 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
2f050 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 35 2e  ons go above 25.
2f060 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20    If the cost.  
2f070 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20  ** of computing 
2f080 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
2f090 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62  ex is not paid b
2f0a0 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66  ack within the f
2f0b0 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77  irst 25.  ** row
2f0c0 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75  s, then do not u
2f0d0 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  se the automatic
2f0e0 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72   index. */.  aFr
2f0f0 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e  om[0].nRow = MIN
2f100 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  (pParse->nQueryL
2f110 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73 65 72  oop, 46);  asser
2f120 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
2f130 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46  gEst(25) );.  nF
2f140 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50  rom = 1;..  /* P
2f150 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  recompute the co
2f160 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68  st of sorting th
2f170 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73  e final result s
2f180 65 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65  et, if the calle
2f190 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  r.  ** to sqlite
2f1a0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61  3WhereBegin() wa
2f1b0 73 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  s concerned abou
2f1c0 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 69  t sorting */.  i
2f1d0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
2f1e0 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
2f1f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f  t==0 ){.    aFro
2f200 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d  m[0].isOrdered =
2f210 20 30 3b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79   0;.    nOrderBy
2f220 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
2f230 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72     aFrom[0].isOr
2f240 64 65 72 65 64 20 3d 20 2d 31 3b 0a 20 20 20 20  dered = -1;.    
2f250 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66  nOrderBy = pWInf
2f260 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
2f270 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  pr;.  }..  /* Co
2f280 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
2f290 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
2f2a0 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
2f2b0 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
2f2c0 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
2f2d0 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
2f2e0 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
2f2f0 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
2f300 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
2f310 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
2f320 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
2f330 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
2f340 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
2f350 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
2f360 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
2f370 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
2f380 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
2f390 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
2f3a0 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
2f3b0 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
2f3c0 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
2f3d0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
2f3e0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
2f3f0 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  askNew;.        
2f400 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
2f410 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 38 20  = 0;.        i8 
2f420 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f  isOrdered = pFro
2f430 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  m->isOrdered;.  
2f440 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
2f450 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72  p->prereq & ~pFr
2f460 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
2f470 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f480 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
2f490 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72  ->maskSelf & pFr
2f4a0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
2f4b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2f4c0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
2f4d0 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73  point, pWLoop is
2f4e0 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
2f4f0 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70  be the next loop
2f500 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f  . .        ** Co
2f510 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a  mpute its cost *
2f520 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74 20  /.        rCost 
2f530 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2f540 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75  dd(pWLoop->rSetu
2f550 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b  p,pWLoop->rRun +
2f560 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20   pFrom->nRow);. 
2f570 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73         rCost = s
2f580 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2f590 72 43 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43  rCost, pFrom->rC
2f5a0 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f  ost);.        nO
2f5b0 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
2f5c0 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b   + pWLoop->nOut;
2f5d0 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77  .        maskNew
2f5e0 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
2f5f0 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
2f600 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69  kSelf;.        i
2f610 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29  f( isOrdered<0 )
2f620 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
2f630 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74  dered = wherePat
2f640 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
2f650 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20  y(pWInfo,.      
2f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f670 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2f680 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f  y, pFrom, pWInfo
2f690 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20  ->wctrlFlags,.  
2f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6b0 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f       iLoop, pWLo
2f6c0 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20  op, &revMask);. 
2f6d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f           if( isO
2f6e0 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f  rdered>=0 && isO
2f6f0 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20  rdered<nOrderBy 
2f700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2f710 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61  * TUNING: Estima
2f720 74 65 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  ted cost of sort
2f730 69 6e 67 20 69 73 20 4e 2a 6c 6f 67 28 4e 29 2e  ing is N*log(N).
2f740 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2f750 49 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  If the order-by 
2f760 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72  clause has X ter
2f770 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20  ms but only the 
2f780 6c 61 73 74 20 59 20 74 65 72 6d 73 0a 20 20 20  last Y terms.   
2f790 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20           ** are 
2f7a0 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68  out of order, th
2f7b0 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67  en block-sorting
2f7c0 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65   will reduce the
2f7d0 20 73 6f 72 74 69 6e 67 0a 20 20 20 20 20 20 20   sorting.       
2f7e0 20 20 20 20 20 2a 2a 20 63 6f 73 74 20 74 6f 20       ** cost to 
2f7f0 4e 2a 6c 6f 67 28 4e 29 2a 6c 6f 67 28 59 2f 58  N*log(N)*log(Y/X
2f800 29 2e 20 20 54 68 65 20 6c 6f 67 28 59 2f 58 29  ).  The log(Y/X)
2f810 20 74 65 72 6d 20 69 73 20 63 6f 6d 70 75 74 65   term is compute
2f820 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
2f830 20 62 79 20 72 53 63 61 6c 65 2e 0a 20 20 20 20   by rScale..    
2f840 20 20 20 20 20 20 20 20 2a 2a 20 54 4f 44 4f 3a          ** TODO:
2f850 20 53 68 6f 75 6c 64 20 74 68 65 20 73 6f 72 74   Should the sort
2f860 69 6e 67 20 63 6f 73 74 20 67 65 74 20 61 20 73  ing cost get a s
2f870 6d 61 6c 6c 20 6d 75 6c 74 69 70 6c 69 65 72 20  mall multiplier 
2f880 74 6f 20 68 65 6c 70 0a 20 20 20 20 20 20 20 20  to help.        
2f890 20 20 20 20 2a 2a 20 64 69 73 63 6f 75 72 61 67      ** discourag
2f8a0 65 20 74 68 65 20 75 73 65 20 6f 66 20 73 6f 72  e the use of sor
2f8b0 74 69 6e 67 20 61 6e 64 20 65 6e 63 6f 75 72 61  ting and encoura
2f8c0 67 65 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ge the use of in
2f8d0 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
2f8e0 2a 2a 20 73 63 61 6e 73 20 69 6e 73 74 65 61 64  ** scans instead
2f8f0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ?.            */
2f900 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 67  .            Log
2f910 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72  Est rScale, rSor
2f920 74 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  tCost;.         
2f930 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
2f940 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c  rBy>0 && 66==sql
2f950 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20  ite3LogEst(100) 
2f960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2f970 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c  Scale = sqlite3L
2f980 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d  ogEst((nOrderBy-
2f990 69 73 4f 72 64 65 72 65 64 29 2a 31 30 30 2f 6e  isOrdered)*100/n
2f9a0 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20  OrderBy) - 66;. 
2f9b0 20 20 20 20 20 20 20 20 20 20 20 72 53 6f 72 74             rSort
2f9c0 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  Cost = nRowEst +
2f9d0 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29   estLog(nRowEst)
2f9e0 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a   + rScale + 16;.
2f9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2fa00 54 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74  TUNING: The cost
2fa10 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
2fa20 20 44 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20   DISTINCT using 
2fa30 61 20 42 2d 54 52 45 45 20 69 73 0a 20 20 20 20  a B-TREE is.    
2fa40 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20          ** also 
2fa50 4e 2a 6c 6f 67 28 4e 29 20 62 75 74 20 69 74 20  N*log(N) but it 
2fa60 68 61 73 20 61 20 6c 61 72 67 65 72 20 63 6f 6e  has a larger con
2fa70 73 74 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74  stant of proport
2fa80 69 6f 6e 61 6c 69 74 79 2e 0a 20 20 20 20 20 20  ionality..      
2fa90 20 20 20 20 20 20 2a 2a 20 4d 75 6c 74 69 70 6c        ** Multipl
2faa0 79 20 62 79 20 33 2e 30 2e 20 2a 2f 0a 20 20 20  y by 3.0. */.   
2fab0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49           if( pWI
2fac0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2fad0 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
2fae0 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 20  TINCT ){.       
2faf0 20 20 20 20 20 20 20 72 53 6f 72 74 43 6f 73 74         rSortCost
2fb00 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20   += 16;.        
2fb10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fb20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
2fb30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  02,.            
2fb40 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63     ("---- sort c
2fb50 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29  ost=%-3d (%d/%d)
2fb60 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
2fb70 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a  %3d to %-3d\n",.
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb90 72 53 6f 72 74 43 6f 73 74 2c 20 28 6e 4f 72 64  rSortCost, (nOrd
2fba0 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c  erBy-isOrdered),
2fbb0 20 6e 4f 72 64 65 72 42 79 2c 20 72 43 6f 73 74   nOrderBy, rCost
2fbc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2fbd0 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
2fbe0 64 64 28 72 43 6f 73 74 2c 72 53 6f 72 74 43 6f  dd(rCost,rSortCo
2fbf0 73 74 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  st)));.         
2fc00 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74     rCost = sqlit
2fc10 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43 6f 73  e3LogEstAdd(rCos
2fc20 74 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20  t, rSortCost);. 
2fc30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fc40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fc50 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
2fc60 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
2fc70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fc80 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
2fc90 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
2fca0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
2fcb0 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20 73   mxChoice best s
2fcc0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
2fcd0 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61   for(jj=0, pTo=a
2fce0 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b  To; jj<nTo; jj++
2fcf0 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
2fd00 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73      if( pTo->mas
2fd10 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20  kLoop==maskNew. 
2fd20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70            && ((p
2fd30 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73  To->isOrdered^is
2fd40 4f 72 64 65 72 65 64 29 26 38 30 29 3d 3d 30 0a  Ordered)&80)==0.
2fd50 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
2fd60 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73  pTo->rCost<=rCos
2fd70 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d  t && pTo->nRow<=
2fd80 6e 4f 75 74 29 20 7c 7c 0a 20 20 20 20 20 20 20  nOut) ||.       
2fd90 20 20 20 20 20 20 20 20 20 28 70 54 6f 2d 3e 72           (pTo->r
2fda0 43 6f 73 74 3e 3d 72 43 6f 73 74 20 26 26 20 70  Cost>=rCost && p
2fdb0 54 6f 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29  To->nRow>=nOut))
2fdc0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
2fdd0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2fde0 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
2fdf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2fe00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
2fe10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fe20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
2fe30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2fe40 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26 20  To>=mxChoice && 
2fe50 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b  rCost>=mxCost ){
2fe60 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
2fe70 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
2fe80 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
2fe90 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2fea0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2fec0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2fed0 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
2fee0 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
2fef0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2ff00 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2ff10 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
2ff20 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
2ff30 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
2ff40 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2ff50 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
2ff60 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
2ff70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
2ff80 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
2ff90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ffa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ffb0 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61   /* Add a new Pa
2ffc0 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20  th to the aTo[] 
2ffd0 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  set */.         
2ffe0 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63   if( nTo<mxChoic
2fff0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
30000 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
30010 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f   size of the aTo
30020 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20   set by one */. 
30030 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
30040 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  nTo++;.         
30050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30060 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20      /* New path 
30070 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69  replaces the pri
30080 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70  or worst to keep
30090 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43   count below mxC
300a0 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  hoice */.       
300b0 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20       jj = mxI;. 
300c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
300d0 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
300e0 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
300f0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
30100 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
30110 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
30120 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
30130 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
30140 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
30150 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25  New    %s cost=%
30160 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
30170 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
30180 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
30190 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
301a0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
301b0 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
301c0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
301d0 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
301e0 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
301f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
30200 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30210 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
30220 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 26 26  >rCost<=rCost &&
30230 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74   pTo->nRow<=nOut
30240 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
30250 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
30260 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
30270 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
30280 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
30290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
302a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
302b0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
302c0 20 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20       "Skip   %s 
302d0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
302e0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
302f0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
30300 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
30310 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
30320 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
30330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
30340 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
30350 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
30360 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
30370 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
30380 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63  intf("   vs %s c
30390 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65  ost=%-3d,%d orde
303a0 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
303b0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
303c0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
303d0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
303e0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
303f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30400 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
30410 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
30420 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
30430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
30440 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
30450 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
30460 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
30470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
30480 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
30490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
304a0 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
304b0 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a  ost==rCost+1 );.
304c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e            /* A n
304d0 65 77 20 61 6e 64 20 62 65 74 74 65 72 20 73 63  ew and better sc
304e0 6f 72 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f  ore for a previo
304f0 75 73 6c 79 20 63 72 65 61 74 65 64 20 65 71 75  usly created equ
30500 69 76 61 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a  ivalent path */.
30510 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
30520 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
30530 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
30540 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
30550 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
30560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
30570 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
30580 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61             "Upda
30590 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  te %s cost=%-3d,
305a0 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
305b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
305c0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
305d0 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
305e0 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
305f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30600 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
30610 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
30620 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
30630 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
30640 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63  intf("  was %s c
30650 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
30660 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
30670 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
30680 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
30690 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
306a0 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
306b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
306c0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
306d0 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
306e0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
306f0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
30700 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
30710 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
30720 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
30730 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
30740 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
30750 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
30760 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
30770 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
30780 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
30790 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
307a0 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
307b0 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
307c0 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
307d0 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
307e0 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
307f0 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
30800 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
30810 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
30820 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
30830 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
30840 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
30850 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
30860 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
30870 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
30880 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
30890 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
308a0 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
308b0 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
308c0 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75 74 20            mxOut 
308d0 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20  = aTo[0].nRow;. 
308e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
308f0 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
30900 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
30910 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
30920 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
30930 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20  rCost>mxCost || 
30940 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43  (pTo->rCost==mxC
30950 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
30960 3e 6d 78 4f 75 74 29 20 29 7b 0a 20 20 20 20 20  >mxOut) ){.     
30970 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
30980 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
30990 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 4f 75              mxOu
309a0 74 20 3d 20 70 54 6f 2d 3e 6e 52 6f 77 3b 0a 20  t = pTo->nRow;. 
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49               mxI
309c0 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20   = jj;.         
309d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
309e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
309f0 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
30a00 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
30a10 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20  LED  /* >=2 */. 
30a20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
30a30 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20  ereTrace>=2 ){. 
30a40 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
30a50 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66  gPrintf("---- af
30a60 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d  ter round %d ---
30a70 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20  -\n", iLoop);.  
30a80 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54      for(ii=0, pT
30a90 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69  o=aTo; ii<nTo; i
30aa0 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  i++, pTo++){.   
30ab0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
30ac0 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73  gPrintf(" %s cos
30ad0 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64  t=%-3d nrow=%-3d
30ae0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
30af0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
30b00 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
30b10 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
30b20 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
30b30 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
30b40 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54  Ordered>=0 ? (pT
30b50 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
30b60 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
30b70 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64    if( pTo->isOrd
30b80 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  ered>0 ){.      
30b90 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
30ba0 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25  Printf(" rev=0x%
30bb0 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76  llx\n", pTo->rev
30bc0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  Loop);.        }
30bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30be0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
30bf0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tf("\n");.      
30c00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30c10 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
30c20 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20   Swap the roles 
30c30 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f  of aFrom and aTo
30c40 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65   for the next ge
30c50 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
30c60 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20  pFrom = aTo;.   
30c70 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20   aTo = aFrom;.  
30c80 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b    aFrom = pFrom;
30c90 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f  .    nFrom = nTo
30ca0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72  ;.  }..  if( nFr
30cb0 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  om==0 ){.    sql
30cc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
30cd0 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73  rse, "no query s
30ce0 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73  olution");.    s
30cf0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
30d00 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65   pSpace);.    re
30d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
30d20 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  R;.  }.  .  /* F
30d30 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
30d40 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d  ost path.  pFrom
30d50 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
30d60 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70  inting to that p
30d70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d  ath */.  pFrom =
30d80 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69   aFrom;.  for(ii
30d90 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  =1; ii<nFrom; ii
30da0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
30db0 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b  om->rCost>aFrom[
30dc0 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f  ii].rCost ) pFro
30dd0 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a  m = &aFrom[ii];.
30de0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
30df0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
30e00 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
30e10 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
30e20 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
30e30 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
30e40 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
30e50 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
30e60 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
30e70 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
30e80 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
30e90 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
30ea0 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
30eb0 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
30ec0 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
30ed0 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
30ee0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
30ef0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
30f00 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
30f10 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
30f20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
30f30 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
30f40 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
30f50 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
30f60 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
30f70 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
30f80 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
30f90 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
30fa0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
30fb0 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
30fc0 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
30fd0 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
30fe0 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
30ff0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
31000 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
31010 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70  o->pResultSet, p
31020 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
31030 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53         WHERE_DIS
31040 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31  TINCTBY, nLoop-1
31050 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
31060 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
31070 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
31080 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
31090 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  et->nExpr ){.   
310a0 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
310b0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
310c0 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
310d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
310e0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
310f0 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ){.    if( pWInf
31100 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
31110 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
31120 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
31130 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  rom->isOrdered==
31140 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
31150 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
31160 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
31170 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
31180 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
31190 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
311a0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
311b0 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e  nOBSat = pFrom->
311c0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
311d0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42   if( pWInfo->nOB
311e0 53 61 74 3c 30 20 29 20 70 57 49 6e 66 6f 2d 3e  Sat<0 ) pWInfo->
311f0 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20  nOBSat = 0;.    
31200 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
31210 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
31220 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  op;.    }.    if
31230 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
31240 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f  Flags & WHERE_SO
31250 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20  RTBYGROUP).     
31260 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
31270 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  BSat==pWInfo->pO
31280 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 0a 20 20  rderBy->nExpr.  
31290 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61    ){.      Bitma
312a0 73 6b 20 6e 6f 74 55 73 65 64 20 3d 20 30 3b 0a  sk notUsed = 0;.
312b0 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
312c0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
312d0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
312e0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
312f0 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
31300 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f    pFrom, 0, nLoo
31310 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
31320 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
31330 55 73 65 64 0a 20 20 20 20 20 20 29 3b 0a 20 20  Used.      );.  
31340 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
31350 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b  fo->sorted==0 );
31360 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73  .      pWInfo->s
31370 6f 72 74 65 64 20 3d 20 28 6e 4f 72 64 65 72 3d  orted = (nOrder=
31380 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
31390 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 7d  y->nExpr);.    }
313a0 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d  .  }...  pWInfo-
313b0 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d  >nRowOut = pFrom
313c0 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72  ->nRow;..  /* Fr
313d0 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
313e0 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
313f0 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
31400 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
31410 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
31420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
31430 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
31440 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
31450 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
31460 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
31470 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
31480 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
31490 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
314a0 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
314b0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
314c0 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
314d0 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
314e0 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
314f0 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
31500 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
31510 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
31520 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
31530 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
31540 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
31550 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
31560 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
31570 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
31580 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
31590 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
315a0 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
315b0 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
315c0 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
315d0 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
315e0 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
315f0 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
31600 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
31610 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
31620 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
31630 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
31640 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
31650 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
31660 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
31670 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
31680 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
31690 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
316a0 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
316b0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
316c0 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
316d0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
316e0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
316f0 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42    .  pWInfo = pB
31700 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
31710 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
31720 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
31730 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20 72  _FORCE_TABLE ) r
31740 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
31750 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  t( pWInfo->pTabL
31760 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a  ist->nSrc>=1 );.
31770 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f    pItem = pWInfo
31780 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  ->pTabList->a;. 
31790 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
317a0 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72  Tab;.  if( IsVir
317b0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
317c0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74  urn 0;.  if( pIt
317d0 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65 74  em->zIndex ) ret
317e0 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20  urn 0;.  iCur = 
317f0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
31800 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
31810 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  >sWC;.  pLoop = 
31820 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
31830 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
31840 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75   = 0;.  pLoop->u
31850 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30  .btree.nSkip = 0
31860 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  ;.  pTerm = find
31870 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
31880 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29  -1, 0, WO_EQ, 0)
31890 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
318a0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
318b0 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
318c0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
318d0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
318e0 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
318f0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
31900 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
31910 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
31920 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
31930 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
31940 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
31950 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
31960 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
31970 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69  33;  /* 33==sqli
31980 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f  te3LogEst(10) */
31990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
319a0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
319b0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
319c0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
319d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
319e0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d  p->aLTermSpace==
319f0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b  pLoop->aLTerm );
31a00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41  .      assert( A
31a10 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
31a20 61 4c 54 65 72 6d 53 70 61 63 65 29 3d 3d 34 20  aLTermSpace)==4 
31a30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
31a40 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  x->onError==OE_N
31a50 6f 6e 65 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  one .       || p
31a60 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
31a70 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  re!=0 .       ||
31a80 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41   pIdx->nKeyCol>A
31a90 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
31aa0 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20  aLTermSpace) .  
31ab0 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a      ) continue;.
31ac0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
31ad0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
31ae0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
31af0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
31b00 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e  WC, iCur, pIdx->
31b10 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20  aiColumn[j], 0, 
31b20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20  WO_EQ, pIdx);.  
31b30 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
31b40 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
31b50 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
31b60 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
31b70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31b80 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  j!=pIdx->nKeyCol
31b90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
31ba0 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
31bb0 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
31bc0 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
31bd0 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
31be0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
31bf0 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70  isCovering || (p
31c00 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
31c10 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
31c20 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pIdx))==0 ){.   
31c30 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
31c40 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
31c50 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  _ONLY;.      }. 
31c60 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65       pLoop->nLTe
31c70 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  rm = j;.      pL
31c80 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
31c90 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f   = j;.      pLoo
31ca0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
31cb0 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  x = pIdx;.      
31cc0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
31cd0 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  of a unique inde
31ce0 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a  x lookup is 15 *
31cf0 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72  /.      pLoop->r
31d00 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39  Run = 39;  /* 39
31d10 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
31d20 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  15) */.      bre
31d30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
31d40 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
31d50 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  gs ){.    pLoop-
31d60 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29  >nOut = (LogEst)
31d70 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
31d80 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
31d90 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
31da0 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
31db0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
31dc0 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  Set, iCur);.    
31dd0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61  pWInfo->a[0].iTa
31de0 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20  bCur = iCur;.   
31df0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
31e00 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57   = 1;.    if( pW
31e10 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
31e20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
31e30 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  =  pWInfo->pOrde
31e40 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
31e50 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
31e60 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
31e70 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
31e80 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
31e90 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
31ea0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
31eb0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
31ec0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
31ed0 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b  Loop->cId = '0';
31ee0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
31ef0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
31f00 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
31f10 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
31f20 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
31f30 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
31f40 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
31f50 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
31f60 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
31f70 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
31f80 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
31f90 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
31fa0 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
31fb0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
31fc0 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
31fd0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
31fe0 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
31ff0 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
32000 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
32010 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
32020 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
32030 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
32040 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
32050 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
32060 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
32070 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
32080 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
32090 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
320a0 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
320b0 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
320c0 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
320d0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
320e0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
320f0 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
32100 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
32110 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
32120 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
32130 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
32140 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
32150 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
32160 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
32170 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
32180 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
32190 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
321a0 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
321b0 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
321c0 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
321d0 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
321e0 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
321f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
32200 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
32210 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
32220 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
32230 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
32240 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
32250 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
32260 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
32270 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
32280 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
32290 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
322a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
322b0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
322c0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
322d0 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
322e0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
322f0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
32300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
32310 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
32320 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
32330 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
32340 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
32350 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
32360 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
32370 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
32380 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
32390 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
323a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
323b0 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
323c0 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
323d0 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
323e0 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
323f0 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
32400 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
32410 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
32420 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
32430 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
32440 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
32450 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
32460 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
32470 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
32480 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
32490 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
324a0 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
324b0 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
324c0 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
324d0 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
324e0 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
324f0 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
32500 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
32510 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
32520 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
32530 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
32540 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
32550 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
32560 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
32570 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
32580 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
32590 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
325a0 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
325b0 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
325c0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
325d0 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
325e0 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
325f0 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
32600 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
32610 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
32620 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
32630 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
32640 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
32650 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
32660 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
32670 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
32680 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
32690 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
326a0 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
326b0 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
326c0 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
326d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
326e0 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
326f0 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
32700 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
32710 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
32720 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
32730 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
32740 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
32750 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
32760 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
32770 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
32780 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
32790 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
327a0 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
327b0 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
327c0 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
327d0 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
327e0 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
327f0 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
32800 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
32810 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
32820 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
32830 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
32840 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
32850 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
32860 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
32870 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
32880 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
32890 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
328a0 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
328b0 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
328c0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
328d0 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
328e0 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
328f0 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
32900 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
32910 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
32920 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
32930 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
32940 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
32950 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
32960 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
32970 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
32980 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
32990 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
329a0 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
329b0 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
329c0 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
329d0 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
329e0 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
329f0 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
32a00 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
32a10 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
32a20 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
32a30 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
32a40 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
32a50 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
32a60 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
32a70 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
32a80 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
32a90 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
32aa0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
32ab0 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
32ac0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
32ad0 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
32ae0 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
32af0 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
32b00 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
32b10 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
32b20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
32b30 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
32b40 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
32b50 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
32b60 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
32b70 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  SSING.**.** pOrd
32b80 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
32b90 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
32ba0 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65  Y clause (or the
32bb0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
32bc0 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
32bd0 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73  _GROUPBY flag is
32be0 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61   set in wctrlFla
32bf0 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20  gs) of a SELECT 
32c00 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20  statement.** if 
32c10 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
32c20 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
32c30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
32c40 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
32c50 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
32c60 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
32c70 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
32c80 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20  , then pOrderBy 
32c90 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
32ca0 68 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d  he iIdxCur param
32cb0 65 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73  eter is the curs
32cc0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
32cd0 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57  index.  If .** W
32ce0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
32cf0 4c 59 20 69 73 20 73 65 74 2c 20 69 49 64 78 43  LY is set, iIdxC
32d00 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  ur is the cursor
32d10 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
32d20 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f  dex.** to use fo
32d30 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63  r OR clause proc
32d40 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45  essing.  The WHE
32d50 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  RE clause should
32d60 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65   use this.** spe
32d70 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49  cific cursor.  I
32d80 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  f WHERE_ONEPASS_
32d90 44 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20  DESIRED is set, 
32da0 74 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a  then iIdxCur is.
32db0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72  ** the first cur
32dc0 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20  sor in an array 
32dd0 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61  of cursors for a
32de0 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64  ll indices.  iId
32df0 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  xCur should.** b
32e00 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  e used to comput
32e10 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  e the appropriat
32e20 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69  e cursor dependi
32e30 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65  ng on which inde
32e40 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f  x is.** used..*/
32e50 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
32e60 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
32e70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
32e80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
32e90 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
32ea0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
32eb0 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20  ist,    /* FROM 
32ec0 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f  clause: A list o
32ed0 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
32ee0 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
32ef0 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
32f00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
32f10 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
32f20 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
32f30 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  y,   /* An ORDER
32f40 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
32f50 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  ) clause, or NUL
32f60 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
32f70 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20  *pResultSet, /* 
32f80 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  Result set of th
32f90 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36  e query */.  u16
32fa0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
32fb0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
32fc0 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
32fd0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
32fe0 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
32ff0 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20  IdxCur          
33000 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45   /* If WHERE_ONE
33010 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65  TABLE_ONLY is se
33020 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
33030 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  number */.){.  i
33040 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20  nt nByteWInfo;  
33050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33060 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  . bytes allocate
33070 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20  d for WhereInfo 
33080 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20  struct */.  int 
33090 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  nTabList;       
330a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
330b0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
330c0 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
330d0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
330e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
330f0 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
33100 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
33110 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
33120 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
33130 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
33140 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
33150 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69  e engine */.  Bi
33160 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
33170 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
33180 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
33190 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
331a0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
331b0 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20  ilder sWLB;     
331c0 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
331d0 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68   builder */.  Wh
331e0 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
331f0 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  kSet;    /* The 
33200 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
33210 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  set */.  WhereLe
33220 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
33230 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
33240 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d  level in pWInfo-
33250 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  >a[] */.  WhereL
33260 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
33270 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
33280 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  to a single Wher
33290 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
332a0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
332b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
332c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
332d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
332e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
332f0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
33300 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ion */.  int rc;
33310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33320 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
33330 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72  de */...  /* Var
33340 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  iable initializa
33350 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  tion */.  db = p
33360 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
33370 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
33380 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20  zeof(sWLB));..  
33390 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55  /* An ORDER/GROU
333a0 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d  P BY clause of m
333b0 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d  ore than 63 term
333c0 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  s cannot be opti
333d0 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63  mized */.  testc
333e0 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26  ase( pOrderBy &&
333f0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
33400 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
33410 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
33420 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d  derBy->nExpr>=BM
33430 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30  S ) pOrderBy = 0
33440 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  ;.  sWLB.pOrderB
33450 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
33460 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
33470 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
33480 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
33490 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
334a0 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
334b0 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
334c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
334d0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
334e0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
334f0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
33500 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
33510 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63  ctOpt) ){.    wc
33520 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  trlFlags &= ~WHE
33530 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
33540 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
33550 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
33560 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
33570 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
33580 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
33590 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
335a0 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
335b0 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
335c0 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
335d0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
335e0 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
335f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
33600 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
33610 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
33620 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
33630 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
33640 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
33650 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
33660 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
33670 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
33680 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
33690 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
336a0 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  e WHERE_ONETABLE
336b0 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
336c0 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
336d0 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
336e0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
336f0 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
33700 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
33710 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
33720 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
33730 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
33740 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
33750 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
33760 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
33770 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
33780 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
33790 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  NLY) ? 1 : pTabL
337a0 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
337b0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
337c0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
337d0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
337e0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
337f0 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
33800 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
33810 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
33820 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
33830 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
33840 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
33850 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
33860 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
33870 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
33880 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
33890 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
338a0 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
338b0 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
338c0 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
338d0 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
338e0 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
338f0 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
33900 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
33910 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
33920 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
33930 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
33940 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74  low..  */.  nByt
33950 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
33960 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
33970 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
33980 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
33990 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
339a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
339b0 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66  ro(db, nByteWInf
339c0 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65  o + sizeof(Where
339d0 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62  Loop));.  if( db
339e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
339f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
33a00 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
33a10 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
33a20 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
33a30 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
33a40 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
33a50 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66  ePass[0] = pWInf
33a60 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
33a70 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66  1] = -1;.  pWInf
33a80 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
33a90 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
33aa0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
33ab0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
33ac0 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
33ad0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
33ae0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
33af0 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
33b00 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74  Set = pResultSet
33b10 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
33b20 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ak = pWInfo->iCo
33b30 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
33b40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
33b50 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
33b60 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
33b70 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  ags;.  pWInfo->s
33b80 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
33b90 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
33ba0 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  oop;.  pMaskSet 
33bb0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  = &pWInfo->sMask
33bc0 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e  Set;.  sWLB.pWIn
33bd0 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73  fo = pWInfo;.  s
33be0 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66  WLB.pWC = &pWInf
33bf0 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70  o->sWC;.  sWLB.p
33c00 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70  New = (WhereLoop
33c10 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66  *)(((char*)pWInf
33c20 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a  o)+nByteWInfo);.
33c30 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
33c40 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73  BYTE_ALIGNMENT(s
33c50 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77  WLB.pNew) );.  w
33c60 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c  hereLoopInit(sWL
33c70 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20  B.pNew);.#ifdef 
33c80 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
33c90 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20  WLB.pNew->cId = 
33ca0 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  '*';.#endif..  /
33cb0 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
33cc0 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
33cd0 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
33ce0 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
33cf0 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
33d00 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
33d10 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
33d20 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
33d30 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74  MaskSet(pMaskSet
33d40 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  );.  whereClause
33d50 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Init(&pWInfo->sW
33d60 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68  C, pWInfo);.  wh
33d70 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f  ereSplit(&pWInfo
33d80 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54  ->sWC, pWhere, T
33d90 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f  K_AND);.    .  /
33da0 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
33db0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
33dc0 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
33dd0 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
33de0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
33df0 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
33e00 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
33e10 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
33e20 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
33e30 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e  0; ii<sWLB.pWC->
33e40 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
33e50 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
33e60 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
33e70 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
33e80 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69  n(sWLB.pWC->a[ii
33e90 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
33ea0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
33eb0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c  alse(pParse, sWL
33ec0 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78  B.pWC->a[ii].pEx
33ed0 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  pr, pWInfo->iBre
33ee0 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak,.            
33ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
33f00 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
33f10 0a 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d  .      sWLB.pWC-
33f20 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c  >a[ii].wtFlags |
33f30 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
33f40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70    }.  }..  /* Sp
33f50 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46  ecial case: No F
33f60 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
33f70 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d    if( nTabList==
33f80 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72  0 ){.    if( pOr
33f90 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
33fa0 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42  nOBSat = pOrderB
33fb0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66  y->nExpr;.    if
33fc0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
33fd0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
33fe0 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
33ff0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
34000 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
34010 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  NIQUE;.    }.  }
34020 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20  ..  /* Assign a 
34030 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74  bit from the bit
34040 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65  mask to every te
34050 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
34060 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
34070 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20   When assigning 
34080 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74  bitmask values t
34090 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75  o FROM clause cu
340a0 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62  rsors, it must b
340b0 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20  e.  ** the case 
340c0 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65  that if X is the
340d0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
340e0 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   N-th FROM claus
340f0 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a  e term then.  **
34100 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
34110 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
34120 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65   terms to the le
34130 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74  ft of the N-th t
34140 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31  erm.  ** is (X-1
34150 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69  ).   An expressi
34160 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  on from the ON c
34170 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
34180 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a  JOIN can use.  *
34190 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68  * its Expr.iRigh
341a0 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65  tJoinTable value
341b0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74   to find the bit
341c0 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68  mask of the righ
341d0 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20  t table.  ** of 
341e0 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72  the join.  Subtr
341f0 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20  acting one from 
34200 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
34210 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a  bitmask gives a.
34220 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72    ** bitmask for
34230 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
34240 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
34250 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68  oin.  Knowing th
34260 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66  e bitmask.  ** f
34270 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
34280 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
34290 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f  eft join is impo
342a0 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23  rtant.  Ticket #
342b0 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3015..  **.  ** 
342c0 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73  Note that bitmas
342d0 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ks are created f
342e0 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d  or all pTabList-
342f0 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a  >nSrc tables in.
34300 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
34310 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
34320 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
34330 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
34340 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71  normally.  ** eq
34350 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
34360 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
34370 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
34380 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  1 if the.  ** WH
34390 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
343a0 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  Y flag is set.. 
343b0 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
343c0 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
343d0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72  c; ii++){.    cr
343e0 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
343f0 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
34400 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
34410 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
34420 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20    {.    Bitmask 
34430 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20  toTheLeft = 0;. 
34440 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
34450 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
34460 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74  ii++){.      Bit
34470 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b  mask m = getMask
34480 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
34490 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
344a0 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
344b0 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c  t( (m-1)==toTheL
344c0 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54  eft );.      toT
344d0 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20  heLeft |= m;.   
344e0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
344f0 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
34500 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
34510 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
34520 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
34530 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
34540 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
34550 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
34560 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
34570 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
34580 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
34590 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
345a0 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
345b0 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
345c0 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
345d0 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
345e0 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69  hat the added vi
345f0 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
34600 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
34610 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c  .  */.  exprAnal
34620 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
34630 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
34640 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
34650 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
34660 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
34670 6f 72 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77  or;.  }..  if( w
34680 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
34690 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
346a0 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73  ){.    if( isDis
346b0 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
346c0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
346d0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
346e0 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20  ResultSet) ){.  
346f0 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49      /* The DISTI
34700 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70  NCT marking is p
34710 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72  ointless.  Ignor
34720 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  e it. */.      p
34730 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
34740 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
34750 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  T_UNIQUE;.    }e
34760 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42 79  lse if( pOrderBy
34770 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
34780 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20  Try to ORDER BY 
34790 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  the result set t
347a0 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20  o make distinct 
347b0 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65  processing easie
347c0 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  r */.      pWInf
347d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d  o->wctrlFlags |=
347e0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
347f0 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  Y;.      pWInfo-
34800 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73  >pOrderBy = pRes
34810 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20  ultSet;.    }.  
34820 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
34830 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  t the WhereLoop 
34840 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45  objects */.  WHE
34850 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
34860 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
34870 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  tart ***\n"));. 
34880 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
34890 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
348a0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66  RE clause */.#if
348b0 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
348c0 41 43 45 5f 45 4e 41 42 4c 45 44 29 20 26 26 20  ACE_ENABLED) && 
348d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
348e0 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
348f0 49 4e 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65  IN).  if( sqlite
34900 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
34910 31 30 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  100 ){.    int i
34920 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
34930 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
34940 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
34950 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20 20 66  nBegin(v);.    f
34960 6f 72 28 69 3d 30 3b 20 69 3c 73 57 4c 42 2e 70  or(i=0; i<sWLB.p
34970 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  WC->nTerm; i++){
34980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
34990 70 6c 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22  plainPrintf(v, "
349a0 23 25 2d 32 64 20 22 2c 20 69 29 3b 0a 20 20 20  #%-2d ", i);.   
349b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
349c0 6e 50 75 73 68 28 76 29 3b 0a 20 20 20 20 20 20  nPush(v);.      
349d0 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72 6d  whereExplainTerm
349e0 28 76 2c 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61  (v, &sWLB.pWC->a
349f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  [i]);.      sqli
34a00 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 76 29  te3ExplainPop(v)
34a10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
34a20 78 70 6c 61 69 6e 4e 4c 28 76 29 3b 0a 20 20 20  xplainNL(v);.   
34a30 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
34a40 70 6c 61 69 6e 46 69 6e 69 73 68 28 76 29 3b 0a  plainFinish(v);.
34a50 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
34a60 50 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  Printf("%s", sql
34a70 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61 74  ite3VdbeExplanat
34a80 69 6f 6e 28 76 29 29 3b 0a 20 20 7d 0a 23 65 6e  ion(v));.  }.#en
34a90 64 69 66 0a 20 20 69 66 28 20 6e 54 61 62 4c 69  dif.  if( nTabLi
34aa0 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68  st!=1 || whereSh
34ab0 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30  ortCut(&sWLB)==0
34ac0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65   ){.    rc = whe
34ad0 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57  reLoopAddAll(&sW
34ae0 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  LB);.    if( rc 
34af0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
34b00 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f  nError;.  .    /
34b10 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66  * Display all of
34b20 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
34b30 62 6a 65 63 74 73 20 69 66 20 77 68 65 72 65 74  bjects if wheret
34b40 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20  race is enabled 
34b50 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
34b60 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
34b70 21 3d 30 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  !=0 */.    if( s
34b80 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
34b90 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
34ba0 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e  oop *p;.      in
34bb0 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69  t i;.      stati
34bc0 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20  c char zLabel[] 
34bd0 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
34be0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
34bf0 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20  tuvwyxz".       
34c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
34c30 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
34c40 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f      for(p=pWInfo
34c50 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70  ->pLoops, i=0; p
34c60 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
34c70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
34c80 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b  p->cId = zLabel[
34c90 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29  i%sizeof(zLabel)
34ca0 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ];.        where
34cb0 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c  LoopPrint(p, sWL
34cc0 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  B.pWC);.      }.
34cd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
34ce0 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
34cf0 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a  ver(pWInfo, 0);.
34d00 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
34d10 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
34d20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
34d30 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
34d40 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
34d50 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
34d60 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  ver(pWInfo, pWIn
34d70 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a  fo->nRowOut+1);.
34d80 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
34d90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
34da0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
34db0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
34dc0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
34dd0 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e  erBy==0 && (db->
34de0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
34df0 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20  everseOrder)!=0 
34e00 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ){.     pWInfo->
34e10 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61  revMask = (Bitma
34e20 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69  sk)(-1);.  }.  i
34e30 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
34e40 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  || NEVER(db->mal
34e50 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20  locFailed) ){.  
34e60 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
34e70 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
34e80 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
34e90 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a  ABLED /* !=0 */.
34ea0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
34eb0 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69  reTrace ){.    i
34ec0 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69 74  nt ii;.    sqlit
34ed0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
34ee0 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f  --- Solution nRo
34ef0 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e  w=%d", pWInfo->n
34f00 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  RowOut);.    if(
34f10 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e   pWInfo->nOBSat>
34f20 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
34f30 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
34f40 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c  ORDERBY=%d,0x%ll
34f50 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  x", pWInfo->nOBS
34f60 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d  at, pWInfo->revM
34f70 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
34f80 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e  switch( pWInfo->
34f90 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
34fa0 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
34fb0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
34fc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34fd0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
34fe0 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29  ISTINCT=unique")
34ff0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
35000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
35010 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
35020 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
35030 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
35040 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
35050 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a  INCT=ordered");.
35060 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
35070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
35080 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
35090 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  _UNORDERED: {.  
350a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
350b0 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
350c0 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29  INCT=unordered")
350d0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
350e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
350f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
35100 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
35110 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57   for(ii=0; ii<pW
35120 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69  Info->nLevel; ii
35130 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
35140 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
35150 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
35160 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d  sWLB.pWC);.    }
35170 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
35180 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74   Attempt to omit
35190 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
351a0 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f   join that do no
351b0 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73  t effect the res
351c0 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  ult */.  if( pWI
351d0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
351e0 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21    && pResultSet!
351f0 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
35200 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
35210 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
35220 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42  Join).  ){.    B
35230 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d  itmask tabUsed =
35240 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
35250 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
35260 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
35270 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
35280 20 29 20 74 61 62 55 73 65 64 20 7c 3d 20 65 78   ) tabUsed |= ex
35290 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
352a0 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e  (pMaskSet, sWLB.
352b0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 77  pOrderBy);.    w
352c0 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  hile( pWInfo->nL
352d0 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20  evel>=2 ){.     
352e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
352f0 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  m, *pEnd;.      
35300 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  pLoop = pWInfo->
35310 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
35320 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  -1].pWLoop;.    
35330 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70    if( (pWInfo->p
35340 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
35350 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e 74 79 70 65  ->iTab].jointype
35360 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29   & JT_LEFT)==0 )
35370 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
35380 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
35390 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
353a0 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  NCT)==0.       &
353b0 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
353c0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
353d0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
353e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
353f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
35400 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d  tabUsed & pLoop-
35410 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20  >maskSelf)!=0 ) 
35420 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e  break;.      pEn
35430 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20  d = sWLB.pWC->a 
35440 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  + sWLB.pWC->nTer
35450 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  m;.      for(pTe
35460 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20  rm=sWLB.pWC->a; 
35470 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72  pTerm<pEnd; pTer
35480 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
35490 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
354a0 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
354b0 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20  kSelf)!=0.      
354c0 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
354d0 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
354e0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
354f0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
35500 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35520 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c        if( pTerm<
35530 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  pEnd ) break;.  
35540 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
35550 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70  xffff, ("-> drop
35560 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65   loop %c not use
35570 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64  d\n", pLoop->cId
35580 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
35590 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20  ->nLevel--;.    
355a0 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20    nTabList--;.  
355b0 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
355c0 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
355d0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
355e0 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
355f0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
35600 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70  >nQueryLoop += p
35610 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
35620 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
35630 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
35640 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
35650 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
35660 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
35670 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
35680 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
35690 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
356a0 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
356b0 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
356c0 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
356d0 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
356e0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
356f0 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  s.  ** the state
35700 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61  ment to update a
35710 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a   single row..  *
35720 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
35730 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
35740 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
35750 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==0 || pWInfo->n
35760 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66  Level==1 );.  if
35770 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
35780 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
35790 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26  SIRED)!=0 .   &&
357a0 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70   (pWInfo->a[0].p
357b0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
357c0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d   WHERE_ONEROW)!=
357d0 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  0 ){.    pWInfo-
357e0 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a  >okOnePass = 1;.
357f0 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
35800 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
35810 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 70  pTab) ){.      p
35820 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
35830 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  op->wsFlags &= ~
35840 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
35850 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
35860 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
35870 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
35880 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
35890 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
358a0 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
358b0 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
358c0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
358d0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
358e0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
358f0 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
35900 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
35910 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
35920 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
35930 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
35940 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
35950 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
35960 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
35970 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
35980 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
35990 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
359a0 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
359b0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
359c0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
359d0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
359e0 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
359f0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
35a00 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
35a10 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
35a20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
35a30 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
35a40 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
35a50 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
35a60 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
35a70 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
35a80 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
35a90 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
35aa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35ab0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
35ac0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
35ad0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
35ae0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
35af0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
35b00 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
35b10 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
35b20 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
35b30 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
35b40 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
35b50 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
35b60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
35b70 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
35b80 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
35b90 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
35ba0 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
35bb0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
35bc0 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
35bd0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
35be0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
35bf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
35c00 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
35c10 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
35c20 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
35c30 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29  OPEN_CLOSE)==0 )
35c40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
35c50 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
35c60 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
35c70 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20  okOnePass ){.   
35c80 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
35c90 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
35ca0 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
35cb0 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74  Pass[0] = pTabIt
35cc0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
35cd0 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69     };.      sqli
35ce0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
35cf0 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
35d00 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
35d10 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73  b, op);.      as
35d20 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
35d30 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d  iCursor==pLevel-
35d40 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20  >iTabCur );.    
35d50 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49    testcase( !pWI
35d60 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
35d70 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
35d80 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
35d90 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e  tcase( !pWInfo->
35da0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
35db0 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
35dc0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
35dd0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
35de0 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26  pTab->nCol<BMS &
35df0 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
35e00 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
35e10 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
35e20 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
35e30 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
35e40 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
35e50 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
35e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35e70 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c  eChangeP4(v, sql
35e80 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
35e90 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20  ddr(v)-1, .     
35ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35eb0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
35ec0 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
35ed0 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
35ee0 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
35ef0 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
35f00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35f10 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
35f20 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
35f30 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
35f40 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
35f50 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
35f60 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
35f70 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
35f80 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20     Index *pIx = 
35f90 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
35fa0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74  Index;.      int
35fb0 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
35fc0 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70    int op = OP_Op
35fd0 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a  enRead;.      /*
35fe0 20 69 49 64 78 43 75 72 20 69 73 20 61 6c 77 61   iIdxCur is alwa
35ff0 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70  ys set if to a p
36000 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
36010 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73   ONEPASS is poss
36020 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ible */.      as
36030 73 65 72 74 28 20 69 49 64 78 43 75 72 21 3d 30  sert( iIdxCur!=0
36040 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   || (pWInfo->wct
36050 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
36060 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
36070 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
36080 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
36090 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e  ss ){.        In
360a0 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74  dex *pJ = pTabIt
360b0 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  em->pTab->pIndex
360c0 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  ;.        iIndex
360d0 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  Cur = iIdxCur;. 
360e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77         assert( w
360f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
36100 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
36110 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  D );.        whi
36120 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26  le( ALWAYS(pJ) &
36130 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20  & pJ!=pIx ){.   
36140 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
36150 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a  ++;.          pJ
36160 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pJ->pNext;.  
36170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36180 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
36190 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
361a0 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
361b0 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  1] = iIndexCur;.
361c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
361d0 69 49 64 78 43 75 72 20 26 26 20 28 77 63 74 72  iIdxCur && (wctr
361e0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
361f0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30  NETABLE_ONLY)!=0
36200 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64   ){.        iInd
36210 65 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 3b  exCur = iIdxCur;
36220 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
36230 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
36240 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
36250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36260 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
36270 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
36280 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
36290 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
362a0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
362b0 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
362c0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r>=0 );.      sq
362d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
362e0 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72  v, op, iIndexCur
362f0 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
36300 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36310 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
36320 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
36330 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
36340 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
36350 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
36360 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20     if( iDb>=0 ) 
36370 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
36380 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
36390 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  iDb);.    notRea
363a0 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
363b0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
363c0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
363d0 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
363e0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
363f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
36400 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
36410 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
36420 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
36430 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
36440 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
36450 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
36460 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
36470 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
36480 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
36490 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
364a0 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
364b0 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
364c0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
364d0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
364e0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
364f0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
36500 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
36510 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
36520 5b 69 69 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51  [ii];.#ifndef SQ
36530 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
36540 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66  TIC_INDEX.    if
36550 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  ( (pLevel->pWLoo
36560 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36570 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
36580 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
36590 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
365a0 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e  ex(pParse, &pWIn
365b0 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20  fo->sWC,.       
365c0 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69           &pTabLi
365d0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
365e0 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20  rom], notReady, 
365f0 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69  pLevel);.      i
36600 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
36610 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
36620 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
36630 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 78 70  }.#endif.    exp
36640 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72  lainOneScan(pPar
36650 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
36660 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
36670 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
36680 61 67 73 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ags);.    pLevel
36690 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c  ->addrBody = sql
366a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
366b0 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52  ddr(v);.    notR
366c0 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f  eady = codeOneLo
366d0 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
366e0 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20  ii, notReady);. 
366f0 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
36700 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
36710 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20  ddrCont;.  }..  
36720 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64  /* Done. */.  Vd
36730 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
36740 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45  (v, "Begin WHERE
36750 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75  -core"));.  retu
36760 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
36770 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
36780 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
36790 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
367a0 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
367b0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
367c0 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
367d0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
367e0 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
367f0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
36800 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
36810 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
36820 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
36830 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
36840 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
36850 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
36860 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
36870 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
36880 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
36890 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
368a0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
368b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
368c0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
368d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
368e0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
368f0 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
36900 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72   *pLevel;.  Wher
36910 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
36920 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
36930 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
36940 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
36950 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
36960 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
36970 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
36980 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56  n code..  */.  V
36990 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
369a0 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d  ((v, "End WHERE-
369b0 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74  core"));.  sqlit
369c0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
369d0 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
369e0 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i=pWInfo->nLevel
369f0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
36a00 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
36a10 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
36a20 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c  fo->a[i];.    pL
36a30 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
36a40 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  Loop;.    sqlite
36a50 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
36a60 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
36a70 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  rCont);.    if( 
36a80 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
36a90 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
36aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
36ab0 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
36ac0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
36ad0 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33  ->p2, pLevel->p3
36ae0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36af0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
36b00 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
36b10 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
36b20 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
36b30 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
36b40 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29  el->op==OP_Next)
36b50 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
36b60 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
36b70 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a  ->op==OP_Prev);.
36b80 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
36b90 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
36ba0 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20  op==OP_VNext);. 
36bb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
36bc0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
36bd0 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70  ERE_IN_ABLE && p
36be0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e  Level->u.in.nIn>
36bf0 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
36c00 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
36c10 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
36c20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
36c30 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
36c40 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20  vel->addrNxt);. 
36c50 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
36c60 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e  l->u.in.nIn, pIn
36c70 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  =&pLevel->u.in.a
36c80 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30  InLoop[j-1]; j>0
36c90 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20  ; j--, pIn--){. 
36ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
36cb0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
36cc0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b  n->addrInTop+1);
36cd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36ce0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49  VdbeAddOp2(v, pI
36cf0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70  n->eEndLoopOp, p
36d00 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
36d10 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
36d20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
36d30 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
36d40 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
36d50 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
36d60 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20  P_PrevIfOpen);. 
36d70 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
36d80 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45  ageIf(v, pIn->eE
36d90 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78  ndLoopOp==OP_Nex
36da0 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  tIfOpen);.      
36db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
36dc0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
36dd0 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20  drInTop-1);.    
36de0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
36df0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
36e00 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
36e10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
36e20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
36e30 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
36e40 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
36e50 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  ( pLevel->addrSk
36e60 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
36e70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
36e80 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
36e90 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
36ea0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36eb0 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70  t((v, "next skip
36ec0 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c  -scan on %s", pL
36ed0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
36ee0 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
36ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
36f00 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
36f10 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
36f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
36f30 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
36f40 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a  l->addrSkip-2);.
36f50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
36f60 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
36f70 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ){.      addr = 
36f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36f90 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
36fa0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
36fb0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
36fc0 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
36fd0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
36fe0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
36ff0 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
37000 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    || (pLoop->wsF
37010 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
37020 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
37030 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
37040 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
37050 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
37060 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37070 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
37080 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
37090 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
370a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
370b0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
370c0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
370d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
370e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
370f0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
37100 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
37110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
37120 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
37130 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20  Return ){.      
37140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37150 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
37160 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
37170 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
37180 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
37190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
371a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
371b0 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
371c0 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
371d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
371e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
371f0 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  addr);.    }.   
37200 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
37210 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52  nt((v, "End WHER
37220 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69  E-loop%d: %s", i
37230 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37240 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
37250 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
37260 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e  l->iFrom].pTab->
37270 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20  zName));.  }..  
37280 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
37290 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
372a0 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
372b0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
372c0 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
372d0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
372e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
372f0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
37300 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  );..  assert( pW
37310 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54  Info->nLevel<=pT
37320 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
37330 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
37340 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
37350 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
37360 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
37370 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a     int k, last;.
37380 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
37390 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
373a0 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
373b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
373c0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
373d0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
373e0 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
373f0 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
37400 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
37410 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
37420 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
37430 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
37440 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75   /* For a co-rou
37450 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c  tine, change all
37460 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72   OP_Column refer
37470 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61 62  ences to the tab
37480 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
37490 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f   co-routine into
374a0 20 4f 50 5f 53 43 6f 70 79 20 6f 66 20 72 65 73   OP_SCopy of res
374b0 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ult contained in
374c0 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20   a register..   
374d0 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63   ** OP_Rowid bec
374e0 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20  omes OP_Null..  
374f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
37500 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  bItem->viaCorout
37510 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  ine && !db->mall
37520 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
37530 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
37540 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
37550 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c  v);.      k = pL
37560 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a  evel->addrBody;.
37570 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
37580 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
37590 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20  k);.      for(; 
375a0 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
375b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
375c0 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
375d0 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
375e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
375f0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
37600 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
37610 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
37620 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 20  e = OP_Copy;.   
37630 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
37640 20 70 4f 70 2d 3e 70 32 20 2b 20 70 54 61 62 49   pOp->p2 + pTabI
37650 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a  tem->regResult;.
37660 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
37670 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  2 = pOp->p3;.   
37680 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d         pOp->p3 =
37690 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
376a0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
376b0 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
376c0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
376d0 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
376e0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
376f0 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  1 = 0;.         
37700 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20   pOp->p3 = 0;.  
37710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37720 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
37730 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c      }..    /* Cl
37740 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
37750 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
37760 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
37770 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
37780 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
37790 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72  not close cursor
377a0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
377b0 65 75 73 65 64 20 62 79 20 74 68 65 20 4f 52 20  eused by the OR 
377c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
377d0 20 2a 2a 20 28 57 48 45 52 45 5f 4f 4d 49 54 5f   ** (WHERE_OMIT_
377e0 4f 50 45 4e 5f 43 4c 4f 53 45 29 2e 20 20 41 6e  OPEN_CLOSE).  An
377f0 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74  d do not close t
37800 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  he OP_OpenWrite 
37810 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63  cursors.    ** c
37820 72 65 61 74 65 64 20 66 6f 72 20 74 68 65 20 4f  reated for the O
37830 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74  NEPASS optimizat
37840 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
37850 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
37860 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
37870 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  al)==0.     && p
37880 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a  Tab->pSelect==0.
37890 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
378a0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
378b0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
378c0 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  OSE)==0.    ){. 
378d0 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c       int ws = pL
378e0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
378f0 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
37900 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77  >okOnePass && (w
37910 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
37920 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
37930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37940 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
37950 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
37960 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
37970 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45     if( (ws & WHE
37980 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
37990 20 20 20 20 20 20 26 26 20 28 77 73 20 26 20 28        && (ws & (
379a0 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
379b0 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20  AUTO_INDEX))==0 
379c0 0a 20 20 20 20 20 20 20 26 26 20 70 4c 65 76 65  .       && pLeve
379d0 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70 57 49 6e  l->iIdxCur!=pWIn
379e0 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
379f0 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  [1].      ){.   
37a00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37a10 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
37a20 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
37a30 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
37a40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
37a50 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
37a60 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42   index, make VDB
37a70 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  E code substitut
37a80 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
37a90 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
37aa0 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20  e index instead 
37ab0 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  of from the tabl
37ac0 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  e where possible
37ad0 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  .  In some cases
37ae0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74  .    ** this opt
37af0 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e  imization preven
37b00 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ts the table fro
37b10 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61  m ever being rea
37b20 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20  d, which can.   
37b30 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e   ** yield a sign
37b40 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61  ificant performa
37b50 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a  nce boost..    *
37b60 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
37b70 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
37b80 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
37b90 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
37ba0 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
37bb0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
37bc0 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
37bd0 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
37be0 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
37bf0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
37c00 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
37c10 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
37c20 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
37c30 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
37c40 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
37c50 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
37c60 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
37c70 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
37c80 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
37c90 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
37ca0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
37cb0 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
37cc0 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  D|WHERE_IDX_ONLY
37cd0 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  ) ){.      pIdx 
37ce0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
37cf0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  .pIndex;.    }el
37d00 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
37d10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
37d20 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  LTI_OR ){.      
37d30 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIdx = pLevel->u
37d40 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a  .pCovidx;.    }.
37d50 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20      if( pIdx && 
37d60 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
37d70 64 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20  d ){.      last 
37d80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
37d90 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
37da0 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61     k = pLevel->a
37db0 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20 70  ddrBody;.      p
37dc0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
37dd0 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20  GetOp(v, k);.   
37de0 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b     for(; k<last;
37df0 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
37e00 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
37e10 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
37e20 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
37e30 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
37e40 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
37e50 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
37e60 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  nt x = pOp->p2;.
37e70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
37e80 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d  ( pIdx->pTable==
37e90 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20  pTab );.        
37ea0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
37eb0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
37ec0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
37ed0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
37ee0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
37ef0 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20              x = 
37f00 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d  pPk->aiColumn[x]
37f10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
37f20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69          x = sqli
37f30 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
37f40 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20 20  (pIdx, x);.     
37f50 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b       if( x>=0 ){
37f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
37f70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20 20  ->p2 = x;.      
37f80 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
37f90 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
37fa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37fb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
37fc0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
37fd0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
37fe0 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20  ==0 || x>=0 );. 
37ff0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
38000 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
38010 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
38020 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
38030 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
38040 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
38050 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
38060 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
38070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
38080 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
38090 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73  nup.  */.